[Excel2013 で VBA] 実用例 (1) 飛び飛びのセルのデータを抜き出す (間引きする)

これまで、Visual Basic for Appilcations (VBA) の基礎を学んで来た。

ここからは、VBA を実用的に活用する例をいくつか紹介する。 本ページでは「飛び飛びのセルのデータを抜き出す (間引きする)」ことを扱う。

例えば、「1列のデータの偶数番目のデータのみを別の列に詰めてコピーする」など である。

シンプルな実装例

今、下図のような 30 個のデータが Excel シートに存在するとしよう。



このデータのうち、偶数行だけを取り出して別の列 (例えば B 列) にコピーしたいとする。
そのような操作はデータ数を減らす目的でしばしば行われる。

それを最もシンプルな方法で実現したのが以下の VBA プログラムである。
(このプログラムの実行方法は「第一回:プログラムを書き始めるまでの準備」参照)

Sub appli01_01()

Dim n As Long, i As Long
    
    n = 30
    
    For i = 1 To n
        If i Mod 2 = 0 Then
            Sheet1.Cells(i \ 2, 2) = Sheet1.Cells(i, 1)
        End If
    Next i
End Sub


このプログラムは全てこの「Excel 2013 による Visual Basic for Applications (VBA)」ページで学んだ内容で理解できる。 例えば、 プログラムを良く見て内容を理解してみよう。

実行すると、以下のように 1 列目のデータの偶数番目の行が 2 列目に詰めてコピーされる。




他人が変更しやすいよう改造

実用上は上のマクロで十分であろうが、「データ数を 30 に決め打ちしている」、
「プログラムを良く理解していないと、『3行置きのコピーに変更』などに対応できない」 などの問題がある。

そこで、中身を理解していなくても変更が可能なように改造したのが以下のプログラムである。
from_row、to_row、skip_col、initial_col の4 つの変数の初期値を変更するだけで 動作を変更できる。

データ数の自動取得や、 シートへのアクセス時の再描画の抑制 (Application.ScreenUpdating = False) も行い、
データ数が大きい際の配慮も行っている。
また、計算時間を減らすために For 文の Step 指定で必要な行を拾う方式にしている。

変数に負の数が代入されたときの警告などは行っていないので、 各自で実装してみると良いだろう。

Sub appli01_02()

Dim n As Long, i As Long

Dim from_row As Long, to_row As Long
Dim skip_col As Long, initial_col As Long

Dim max_col As Long
    
' #### 以下の4つの数字を変更してください。

    from_row = 1     ' 1列目から (A列)
    to_row = 2       ' 2列目に   (B列)
    
    skip_col = 2     ' 何行おきにデータを取るか
    initial_col = 2  ' 最初のデータは何行目とするか
    
' #### 以下実装。変更不要。

    If Val(Application.Version) >= 12 Then
        max_col = 1048576     ' >= Excel 2007
    Else
        max_col = 65536       ' Other versions
    End If

    n = Application.WorksheetFunction.CountA(Range(Cells(1, from_row), Cells(max_col, from_row)))

    Application.ScreenUpdating = False
    For i = initial_col To n Step skip_col
        Sheet1.Cells((i - initial_col) \ skip_col + 1, to_row) = Sheet1.Cells(i, from_row)
    Next i
    Application.ScreenUpdating = True

End Sub




←微分方程式の数値的解法 (3) 汎用性を高める実用例 (2) グラフを自動的に描く→

Excel 2013 で学ぶ Visual Basic for Applications (VBA)に戻る