- ベストアンサー
EXCELのVBAで空白列を削除して左づめにできますか?
いつも参考にしています。まだ、マクロの記録にチョット手を加えて自動化?している程度の腕前ですが? 仕事の都合で下記の問題を解決しなくてはならなくなり、皆様のお知恵をお借りしたいと思い質問させて頂きます。 エクセルのワークシートに空白のセルがランダムに入っているデータがあります。これを、ある列まで(例ではD列までの左の空白セルをなくして左づめのデータとしたいのです。 (例) | A | B | C | D | E | 1|AAA|BBB|CCC|DDD|EEE| 2| |BBB|CCC|DDD|EEE| 3|AAA| |CCC|DDD|EEE| 4|AAA| |CCC| |EEE| 5| | | |DDD|EEE| ↓ | A | B | C | D | E | 1|AAA|BBB|CCC|DDD|EEE| 2|BBB|CCC|DDD| |EEE| 3|AAA|CCC|DDD| |EEE| 4|AAA|CCC| | |EEE| 5|DDD| | | |EEE| ここで、E列以降は詰めないでほしいのです。 できれば、VBAで実現したいのですが、どのような考えで、どのようなコード?を書けばよいのか教えてください。 質問の仕方も用途を得ないで、失礼な質問になっていると思いますが、よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 VBAの方法もいろいろあると思いますから、以下もちょって見てください。ただし、定数に限ります。 Sub Value2Left() Dim myAr As Variant Dim myAr2() As Variant Dim i As Long, j As Long, k As Long With Range("A1").CurrentRegion.Resize(, 4) 'D列まで myAr = .Value ' .ClearContents ReDim myAr2(1 To UBound(myAr, 1), 1 To UBound(myAr, 2)) For i = 1 To UBound(myAr, 1) For j = 1 To UBound(myAr, 2) If myAr(i, j) <> "" Then k = k + 1 myAr2(i, k) = myAr(i, j) End If Next j k = 0 Next i Application.ScreenUpdating = False .Value = myAr2 Application.ScreenUpdating = True End With End Sub
その他の回答 (3)
- cockerel
- ベストアンサー率46% (253/548)
>仕事の都合で下記の問題を解決しなくてはならなくなり・・・ >VBAで実現したい VBA自体の回答を求めているのであれば以下を無視してください。 E列先頭にアクティブセルの領域の最大行数(この場合であれば5つ)のセルを挿入します。 元のアクティブセルの領域(この場合であればA1:E5)またはE列を除いた領域(A1:D5)を選択して編集>ジャンプから空白セルを選択します。 編集>削除を選択して「左に詰める」を行った後、E列を元に戻します〔5つのセルを削除して上に詰める)。 VBAでも簡単に作れると思います(ただし、簡単な操作はVBAにしなくても操作できるような小技を身につけておくと何かと役立ちます)。
お礼
早速の回答ありがとうございました。 今回は、これ以外の処理もある都合から、VBAで行う事を考えました。 たしかに、簡単な操作をVBAで行うより小技で処理するのが正解だと思います。今回は、私だけじゃなく他の人も操作する可能性があるので、こんな事を考えました。説明不足でごめんなさい。 でも、この小技は凄く参考になりました。別の機会に使いたいと思います。 また、色々とご指導ください。本当にありがとうございました。
- dr2006
- ベストアンサー率31% (5/16)
取り込み方次第で同一シートで行うことも可能ですが説明しにくい こと、元データには手を加えない方がよいと思いますので、シート 1つでの解決よりも、データシート、結果シートに分けての考え方 で説明します。 データシート上のA-D列までの各セルをFor文でまわしながら空白 列の判定(ISBLANK)を行い、結果シート上に左詰めになるよう転記 していきます。 (空白行の判定はISBLANKでなく、無効値での判定でも構いません) データシートE列以降は結果シートE列以降に転記するだけです。 これをデータの入っている行分繰り返すことで可能です。
お礼
早速の回答ありがとうございました。 確かに、元データを変えてしまうのは良くありませんよね。 今回は、システムの都合上(システムってほどのものじゃないのですが・・・)転記をするよりワークシート内で詰めていった方が都合がよいのです。説明が悪くて済みませんでした。 また、色々とご指導ください。 本当にありがとうございました。
下記のような感じでもよろしいかと・・・。 Sub test() Dim i As Long Dim j As Long For i = Range("E65536").End(xlUp).Row To 1 Step -1 For j = Range("D1").End(xlToRight).Column To 1 Step -1 If Cells(i, j).Value = "" Then Cells(i, j).Delete Shift:=xlToLeft Range("D" & i).Insert Shift:=xlToRight End If Next j Next i End Sub
お礼
早速の回答、ありがとうございました。 ”すっ”凄~い!感激です。VBAって奥が深いんですね。自分には無理と諦めていたんですが、再度勉強してみようかな!なんて思ってしまいました。 本当にありがとうございました。
お礼
丁寧な回答ありがとうございます。 VBAってホントに色々な考え方があるのですね。 内容が分からないまま、単純に貼り付けて実行しましたら、できました。しかも、早い!感激&涙!きっと説明して頂いても現在の私の知識レベルでは理解できないような気がします。 今後、VBAの勉強に精進してみます。 こんな気持ちにして頂けた皆様に感謝いたします。 本当にありがとうございました。 また、何かとご厄介になると思いますが暖かく見守ってください。よろしくお願いします。