【ExcelVBA】指定シート、カラムに対する行の配列を作成する関数


この記事はプロモーションを含みます。

指定した条件(シート、カラム)に対する行の値を取得して、配列を作成する関数を作成しましたのでここに残しておこうと思います。

機能説明

本関数の機能について説明します。

本関数の機能としては、指定した条件(シート、カラム)に対する行の値を取得して、配列を作成するものになります。

画像の表を元に下記条件で配列を作成する例を見てみましょう。

この表から下記条件で配列を作成してみたいと思います。

条件

・配列:arrName
・シート:生徒名簿
・カラム:2
・値の取得開始行:2(1行目がヘッダなので)

以下のような配列が作成されます。

arrName[0] = 大阪太郎
arrName[1] = 兵庫花子
arrName[2] = 奈良一郎
arrName[3] = 京都次郎

仮に条件のカラムを「3」に変更した場合、以下のように表中の「ふりがな」で配列が作成されます。

arrName[0] = おおさかたろう
arrName[1] = ひょうごはなこ
arrName[2] = ならいちろう
arrName[3] = きょうとじろう

呼び出し方

本関数の呼び出し方です。

書式

Call mkArrayRow(配列, シート名, カラム, 値の取得開始行)

各引数についての説明です。

引数項目名説明
1配列作成する配列の名前
2シート名配列に格納する情報があるシート名を指定
3カラム配列に格納する情報があるカラムを指定
4値の取得開始行何行目から値を取得するかを指定
(ヘッダなどを除きたい場合に使用)

呼び出し方のサンプルです。
サンプルでは、ボタン(ActiveXコントロール)[btnExec]をクリックした時に実行されるようになっています。
また、配列の作成後、ループしつつ配列の内容をメッセージボックスで表示する処理も入れています。

Private Sub btnExec_click()

    ' 氏名を格納する配列の宣言
    Dim arrName() As String

    ' 氏名の配列を作成
    Call mkArrayRow(arrName, "生徒名簿", 2, 2)

    ' 作成した配列の確認
    Dim i As Long
    For i = 0 To UBound(arrName) - 1
        MsgBox (arrName(i))
    Next

End Sub

ソースコード

本関数のソースコードです。
サンプルでは、このソースをシートに記述して実行していますが、標準モジュールなどに移動させても構いません。その場合は、Private を Public に変えるなどが必要になります。

'**********************************************************************
'* 名称  ■ mkArrayRow
'* 説明  ■ 指定したシート、カラムに対する行の配列を作成
'* 引数  ■ arr():配列、sht:シート、clm:カラム、startRow:値の取得開始行
'* 戻り値 ■ なし
'**********************************************************************
Private Function mkArrayRow(ByRef arr() As String, ByVal sht As String, ByVal clm As Long, ByVal startRow As Long)

    Dim maxRow As Long  ' 最大行
    Dim i As Long       ' ループ用
    
    ' 指定シート、カラムの最大行の取得
    maxRow = Sheets(sht).Cells(Rows.Count, clm).End(xlUp).Row
    
    ' 配列サイズを再設定
    ReDim arr(maxRow - (startRow - 1))
    
    ' 開始行から最大行までループ
    For i = startRow To maxRow
        ' 配列にセルの値を格納
        arr(i - startRow) = Sheets(sht).Cells(i, clm).Value
    Next

End Function

記事は以上です。本関数を利用することで、配列の作成が1行(配列の宣言を含めると2行)で記述することが可能です。是非とも使ってみて下さい。

コメント

タイトルとURLをコピーしました