【Excel/VBA】指定の項目が、何列目にあるか確認する

今回は、データ精査系のツールを作成する際に活用する、項目の位置を特定する方法をご案内します。

例えば、このような表があったとします。









こちらは、若干古いのですが、平成27年時点の、関東地方の都県の人口です。

今回は、例として、
人口が5,000千人(500万人)を超える都県に「○」と入力したいと思います。

1.所定のセルに、「○」を入力する方法

これは復習です。
今回は、所定のセルを”ActiveCell”としておきます。

ActiveCell.Value = "○”

ですね。

2.人口が5,000千人(500万人)を超える都県を判別する方法

こちらも復習ですね。Ifを使います。
「○」を入力する方法と合わせて記述します。
セルの指定方法は、以下の3パターンです。

  • 該当のセルを選択し、”ActiveCell”とする
  • C3から始まるので、”Range("C3”).Select”とする
  • C3から始まるので、”Cells(2,3).Select”とする
今回は、後で出てくる変数に対応できるよう、Cells(2,3).Selectを使います。

If Cells(2,3).Value >= 5000 Then
 ActiveCell.Offset(0,1).Value = ”○”
End If

とします。

あとは、繰り返し処理を設定するだけです。

3.そんなある日、事件が起きます

データ抽出の方法が変わり、今まで無かった列が追加されてしまったのです。
変更後のデータは、以下の通りです。







”地方”という新しい列が加わっています。
今まで使っていたマクロでは、「Cells(2,3).Value >= 5000」としています。
現在、2行目、3列目にあるのは、「茨城」の文字です。
5,000以上でも以下でもありません。
このプログラムは、使えなくなってしまいました。

4.変数を使って、常に該当の列を探し出してから処理を行う

では、どのように解決すれば良いでしょうか。
変数を使って、列番号を取得してから、処理を始めましょう。

今回は、先に回答を記述いたします。

〜〜〜ここから〜〜〜

Sub 人口列を見つける()
    
    Dim ColumnNo_人口 As Integer
    
    ColumnNo_人口 = 1
    
    Do
    
        If Cells(1, ColumnNo_人口).Value = "人口(1,000人)" Or Cells(1, ColumnNo_人口).Value = "" Then
            Exit Do
        
        End If

        ColumnNo_人口 = ColumnNo_人口 + 1

    Loop

End Sub

〜〜〜ここまで〜〜〜

まず始めに、
Dim ColumnNo_人口 As Integer
”ColumnNo_人口”という変数を、整数型で設定します。

次に、
ColumnNo_人口 = 1
設定した変数”ColumnNo_人口”を、1とします。

次から繰り返し処理で、
If Cells(1, ColumnNo_人口).Value = "人口(1,000人)" 
Or
Cells(1, ColumnNo_人口).Value = "" Then
Exit Do
1行目の、”ColumnNo_人口”列目(初期値は1)の値が、「人口(1,000人)」の場合か、
空白の場合は、繰り返し処理を抜ける
※便宜上改行させましたが、マクロでは改行してしまうと、違う処理と認識されるため、
 記述そのものがエラーとなるか、誤った処理が実行されます。
 なお、VBE上で、視認性の高さを上げるために、改行せざるを得ない場合は、「_」を書くと
 見た目上改行されてても、一つの処理として認識されます。

5.繰り返し処理を実施する

ここまでの処理によって、都県毎の人口が入っている列を特定できました。
上記マクロを実施すると、”ColumnNo_人口”の値は、4になっているはずです。

あとは、今まで覚えたものを総動員するだけです。

〜〜〜ここから〜〜〜
Sub 人口5000千以上に○()
 
    Dim ColumnNo_人口 As Integer
 
    ColumnNo_人口 = 1
 
    Do
 
        If Cells(1, ColumnNo_人口).Value = "人口(1,000人)" Or Cells(1, ColumnNo_人口).Value = "" Then
            Exit Do
     
        End If

        ColumnNo_人口 = ColumnNo_人口 + 1

    Loop

    Cells(2, ColumnNo_人口).Select

    Do
    
        If ActiveCell.Value = "" Then
            Exit Do
        
        ElseIf ActiveCell.Value >= 5000 Then
            ActiveCell.Offset(0, 1).Value = "○"

        End If

        ActiveCell.Offset(1).Select

    Loop

End Sub
〜〜〜ここまで〜〜〜

赤字にした部分が、追加箇所です。
これによって、以下の通り、5,000千人以上のレコードに、”○”が入力されました。








6.まとめ

データの形/配置が変わらないことが確定している場合は、該当列の位置を確認する必要はありませんが、
データは、いつどのタイミングで変更されるかわかりません。
項目名が変わってしまうとお手上げなのですが、列の位置が変わってしまうことを想定して、
今回のような、列位置を特定してから処理に進む作りにしておくと、後々便利です。

勘の言い方は、既にお気づきかもしれませんが、
行についても変数を設定することによって、処理自体を軽くすることができます。
次回は、それについて触れていきたいと思います。


それではまた

コメント