VBA配列を使ったデータ転記方法まとめ

VBA
スポンサーリンク

私が業務でよく行っているダウンロードデータ等を規定フォームに転記する際に、複数セルの値を1つのセルにカンマ区切りで代入する方法のまとめ記事です。

イメージとしては動画のような形です↓

スポンサーリンク
スポンサーリンク

サンプルコード

Sub SampleCode3()
    Dim Num() As String
    Dim i As Long, j As Long, max As Long
    Dim n As Long
    max = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 2 To max
        j = 2
        n = 0
        Do While Cells(i, j) <> ""
            ReDim Preserve Num(n)
            Num(n) = Cells(i, j)
            j = j + 1
            n = n + 1
        Loop
        Cells(i, "j") = Join(Num, ",")
    Next i
End Sub

コードのポイント

ポイントとしてはたった2つです。

  1. 動的配列にデータを格納(Preserve)
  2. Join関数でセルにカンマ区切りで代入

まずは、上記ポイントについて解説していきます。
既に理解されている方はこの記事下にデータ転記の記事リンクを貼っていますので、読み飛ばしてください。

スポンサーリンク

配列変数

上記コードで使っている配列について解説します。※配列変数と配列は同義です。

変数とは?

配列の説明の前に、そもそも変数とは何か?
一時的にデータを保存しておく箱のようなものです。

変数には1つしか値を入れておくことができません。

変数についての詳細はこちら↓

10日で習得!VBA入門⑤変数の基本
マクロVBAの変数と宣言の方法、オブジェクト変数について紹介しています。 記事を読み進めていくことで、マクロVBAを使って同一シート内のデータ処理を自動化するために必要なVBAスキルを習得できます。VBA初学者が添付のレジュメを使って一緒に手を動かしながらVBAコードを記述していくことで、自分のペースでじっくり確実に習得することができます。
スポンサーリンク

配列とは?

変数を理解した上で、配列のポイントは以下の通りです。

  1. 通常の変数は1つの変数に1つしか値が入りませんが、複数の値が入る変数
  2. 複数の値を整理するために、要素数が振られている※要素数は通常「0」から始まる
配列のイメージ

配列を使うメリットとして、コードの処理速度が速くなります。

配列を使う時のルール

Sub SampleCode()
    Dim Ward(3) As String
    Ward(0) = "荻原"
    Ward(1) = "萩原"
    Ward(2) = "荻本"
    Ward(3) = "萩本"
    MsgBox Ward(3)
End Sub

配列変数の宣言

Dim 配列名(3)

配列を使う場合、通常の変数と同じようにDimで宣言します。
その時に配列をいくつ作るのかを括弧の中に指定します。上記の場合3つです。
※変数の型は格納する値によって変更します。(例)はStringの文字列型です。

配列に値を格納

配列名(要素数) = 値

格納する要素数を指定して値を代入します。

Ward(0) = "荻原"
Ward(1) = "萩原"
Ward(2) = "荻本"
Ward(3) = "萩本"

配列を取り出す場合

Debug.print 配列名(3)

配列名と要素数を指定します。

スポンサーリンク

動的配列

Dim Num() As String

上記の配列(静的配列)の場合、変数宣言の時点で要素数を決めました。
しかし、サンプルコードのような動的配列の場合は配列宣言時には要素数は指定せず、空の()にします。そして、実行途中で要素数を決めます。
どのような場合に使用するか?
単純な話で宣言時点では配列に格納する値がいくつになるかわからない場合です。

Redim

ReDim Preserve Num(n)

ReDim Num(要素数)

コード途中で要素数が決定した時点でReDimを使って要素数をいれるというルールです。

Preserve

Preserveを付けることで、それまで配列に入っていた値は保持されます。
逆にPreserveが無くRedimのみの場合それまで配列に入っていた値は失われます。

Preserveが無い場合

Do While Cells(i, j) <> ""
            ReDim Num(n)
            Num(n) = Cells(i, j)
            j = j + 1
            n = n + 1
        Loop
        Cells(i, "j") = Join(Num, ",")
    Next i

新たな値が入った時点で、これまで配列に格納されていた値は消えます。

Preserveがある場合

Do While Cells(i, j) <> ""
            ReDim Preserve Num(n)
            Num(n) = Cells(i, j)
            j = j + 1
            n = n + 1
        Loop
        Cells(i, "j") = Join(Num, ",")
    Next i

新たな値が入っても、これまで配列に格納されていた値は消えません。

スポンサーリンク

配列とPreserveを覚えるメリット

  1. 配列:値を配列に格納することで、バラバラの値を1つの変数として扱うことができる。
  2. Preserve:宣言時点で要素数を確定させる必要がないので、入力してある値の数によって要素数を決めたいなどの場合は非常に便利です。

VBA初心者の方でもこの2つを使うとできることが増えます。そしてコードを短く書けます。

スポンサーリンク

Join関数

Join関数・・Join(文字列型配列変数、区切り文字)
Join関数は、配列に入っている値を指定の区切り文字で結合します。

スポンサーリンク

関連記事リンク

VBAデータ転記方法-関数・配列編-
MID関数,LEFT関数、Split関数、Join関数を使った文字の加工、データ転記の方法について紹介しています。
VBAにおけるCurrentRegionの活用
VBAのCurrentRegionについてCurrentRegionでの行、列の取得や行数、列数、最終行、最終列の取得、それらを踏まえた活用事例を紹介しています。また、静的配列、動的配列についても解説しています。
スポンサーリンク

まとめ

本記事での転記のポイントは以下です。

  1. 動的配列にデータを格納(Preserve)
  2. Join関数でセルにカンマ区切りで代入

その他の方法は関連記事で解説しています。

コメント

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