2013年6月29日土曜日

vba 結合セルから単一セルにコピーするには

複数行を一つにした結合セルから単一セルにコピーすると行数値が飛んでしまう
うーん、わかりにくい。
3


1


2


のようになってしまう。
クリップボードで空白行を削除してコピーして
3
1
2
のようにしたい。
いろいろフリーのクリップボードを操作するものを探したんですが、コマンドラインから操作するものがみつからないんですよね

で、クリップボードから3行毎に読み込んで、貼り付けるvbaを作りました
参考
excel クリップボード(yahoo知恵袋)
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1453559284

使い方は、結合セルの行をコピーして、コピー先の先頭セルにカーソルを置いて
下記vbaを走らせる。
マクロ cntl+a など割り当てて、使ってもらうといいと思います

プログラムの説明
①step 3は結合セルが3行分なので、3行ごとに読み込むとちょうど数字を読み込める
UBound(v2) - 3 uboundは配列数を算出  -3は、該当行をコピーすると、一番最後に""という余分な配列が出来たため、一回分減らしています
"2.0"
" "
" "
""  ←余分
②If Len(v2(i)) = 1 Then v2(i) = 0 は、数字の入っていない行が""で作られ if v2(i)=""でなぜかfalseになって文字長1で判定されるためそのようにしました。数字が入ったセルは3.0や1.0のような形で読み込まれています。””だと次の③で型エラーになったので0に変換。
③Cells(r + rec1, c) = v2(i) * 1は、配列の数字が文字列で書き出されるため*1で数字に直しています


Sub test()
Set CB = New DataObject
CB.GetFromClipboard
v1 = CB.GetText
v2 = Split(v1, Chr(10))  ’←これがすごく参考になった、複数行のクリップボードの内容を配列に格納する
r = ActiveCell.Row
c = ActiveCell.Column
rec1 = 0
For i = 0 To UBound(v2) - 3 Step'①
If Len(v2(i)) = 1 Then v2(i) = 0 '②
Cells(r + rec1, c) = v2(i) * 1 '③
rec1 = rec1 + 1
Next i
End Sub

背景
残業をだすシートの人の並びが結合セルで作ってあり、残業をグラフにするブックのセルが1行毎だったので、コピーだと3行ごとに飛んでしまい、それで、毎回手でグラフのシートに数字を入れていました。
空白行をを削除する、休んだ人も空白行のなるため、一人分飛んでしまう。
それで、3行ごとに読み込む形にしました。
このvbaならコピぺするする感覚でできるのでわかりやすいかなと
残業の人の並びと、グラフの人の並びが同じという前提です。
もともと手で入れていたので、並びも一致させています。