2016年6月14日火曜日

【VBA実践】特定の列を一括削除する。

今回は不要となった特定の列を削除するコードをご紹介します。
列を挿入するコードは別の記事にてご案内していますので
是非参考にしてみて下さい。
【VBA実践】特定の列を一括挿入する。

大量のデータを処理をしていると
A列に大元のデータがありB列にA列のデータを処理した結果を入れたりします。
また、それが、C列以降、同様の列が続いたりします。

例えば、データ処理が終わった場合
不要となった列を削除したりすることがあります。

間が飛び飛びになっている場合は、
一つ一つの列を手作業で削除していくのは大変骨が折れる作業です。
また、誤って消すつもりのない列を消してしまったりする
大変なことになります。


そんな作業も、ちょっとコードを入力するだけで
正確かつ一瞬で終了します。

サンプル画像

























まずは偶数(赤文字)が記載されている列を一括で削除するコードです。
































上記コードを実行すると以下の結果がでます。


-------------------------------------------------
Sub 特定の列を削除するコード()

Dim col As Long

For col = 100 To 1 Step -2
    Columns(col).Delete
Next col

End Sub
-------------------------------------------------
まず変数は、列を意味するcolumnの最初の3文字を取って
変数名colにします。
colはFor文のカウンタの役割を行うので
値を代入しておく必要はありません。

次にFor文では逆打ちカウンタでStepは-2となります。

まず、なぜ逆打ちにするかということですが
通常の2..4..6..8..10とカウントしていった場合
削除する列がおかしくなってしまうんです。
例えば、最初に2があるB列を消すと、隣のC列にあったデータがB列になります。
ということは、次のカウント4列目つまりD列には
E列に入っていたデータを消してしまうことになります。

サンプル画像1
































上記コードを実行すると以下の結果となります。























手前から消すと先のデータは前にずれてくるので
全ての結果がずれてきます。

その為、データの最後から実行していくことで
ターゲットの列データがずれることはなくなります。
こういった逆打ちでデータを操作する方法は、VBAの処理ではよく使用されるので
頭の片隅に置いとていただけると幸いです。




ちなみに、Columns(col).Deleteは削除です。
ClearContentsやClearにすると、列の削除はされず、値や値と書式のみが削除されます。

サンプルコードの画像
































実行後の画像

という結果となります。

A、B、Cを1ブロックとして、そのB、C列を削除したいという
2列消しをする場合も要領は同じとなります。
サンプル画像

赤くなっている文字の列を削除する場合のサンプルコードは以下の通りです。


削除する列は2列に増えるので
Columns(col).Delete(指定している列)と
Columns(col -1).Delete(指定した左隣の列)を合わせて記述し削除します。
(col -1)というのは、変数colに代入されている値をマイナス1にするという記述です。
※結構こういった使い方することがあるのでぜひ覚えておいてください。
なお、2列消して、3列戻るので、Step -3としてください。

実行後の画面


上手く実行できたことが確認できました。


さて、別の記事でも今後記載予定ですが
先日、データが入っている最終行を取得するというコードを案内しましたが
最終列を取得するコードも当然あります。


column = Cells(1, Columns.Count).End(xlToLeft).Column

変数名columnとして、そこにデータが入っている最終列の値を代入するようにします。
Cells(1,~~の1は1行目を指定する箇所であり、
データが入っている行をここで入力します。
なので、1列目にデータが入っていないときは、データが最終列まで入っている行を
ここで入力してあげてください。
そして、その変数columnをカウンタに設定してあげます。

-------------------------------------------------
Sub 特定の列を削除するコード()

Dim col As Long
Dim column As Long

column = Cells(1, Columns.Count).End(xlToLeft).Column
For col = column To 1 Step -2
    Columns(col).Delete
Next col

End Sub
-------------------------------------------------
最終列が100行まで入っている場合、
変数columnには100が代入されるので
For col = 100 To 1 Step -2と同じ意味になります。
変数の宣言も忘れず行ってください。


ちょっと長い記事になってしまいましたが、
状況に応じてぜひ活用してみてください。



0 件のコメント:

コメントを投稿