EXCEL、VBAプログラミング入門21~動的配列~

以下は当記事に関連する動画です。本動画に関連する動画はすべてニコニコチャンネルにて閲覧可能です。
https://ch.nicovideo.jp/ai-light

今回は、EXCEL、VBAプログラミングの第21回目で「動的配列」について説明をします。

今回は以下のことについて解説を行っています。
1)はじめに
2)ReDimで配列要素を再定義
3)ReDim Preserveで配列要素を再定義

1)はじめに
前回までの復習ですが通常の配列は以下のように定義します。
Dim A(2) As Integer
この場合には要素数が3のInteger型(整数型)の配列を定義したことになります。各要素はA(0),A(1),A(2)と表現します。要素は「0」から始まることに注意して下さい。

動的配列を定義する時は要素数を指定せず以下のように定義します。
Dim A() As Integer
動的配列とは事前に要素数を指定せずに定義する配列でプログラム中で要素数を変更することが可能です。

下図の計算機システムで「記録」ボタンを押すと「B3」セルに表示されている数値を内部に記録していくことができます。また記録するデータ数に制約はありません。

図1.計算機システム

「記録」ボタンを押した時の処理は下図の通りです。

図2.記録クリック処理

また、「’」(シングルコーテーション)ではじまる部分はコメントですから、実質的な処理は以下の部分です。

ReDim Preserve 記録配列(記録配列数)
記録配列(記録配列数) = Range(“b3”).Value
記録配列数 = 記録配列数 + 1
MsgBox “記録されました”

記録配列の定義情報を調べるには、下図の通り
ReDim Preserve 記録配列(記録配列数)
の記録配列にカーソルを合わせてマウスの右クリックで「定義」を選択します。

図3.「記録配列」変数の定義情報を確認

下図の通りマウスのカーソルが
Public 記録配列() As String
に移動します。

図4.「記録配列」の定義情報

上述の説明から「記録配列」変数は動的配列として定義されていることが分かります。

2)ReDimで配列要素を再定義
動的配列の例として以下のようなサンプルを説明します。

Sub 動的配列サンプル()
 Dim A() As String
     Dim i As Integer

     ReDim A(2)
     A(0)=”テスト0”
     A(1)=”テスト1”
     A(2)=”テスト2”

     For i = 1 To 2
    msgbox A(i)
 Next i

End sub

動的配列の場合には要素数が決定していないので、いきなり値を代入することは出来ません。そこでReDimを使って配列の要素数をプログラムの中で変更することができます。

ReDimは次のサンプルプログラムの通り、プログラム中で何度も要素数を定義することができます。

Sub 動的配列サンプル2()
 Dim A() As String
      Dim i As Integer

      ReDim A(2)
      A(0)=”テスト0”
      A(1)=”テスト1”
      A(2)=”テスト2”

     ReDim A(3)
     A(2)=”テスト3”

     For i = 1 To 3
    msgbox A(i)
 Next i

End sub

しかし、ReDimで配列の要素数を再定義した場合には、一旦、変数に代入されていた値はすべてクリアされてしまいます。従いまして上部の「動的配列サンプル2」では最終処理のメッセージボックスの表示処理では「テスト3」しか表示されません。

今回のサンプルプログラムである「図1.計算機システム」では「記録」ボタンが押される度に数値が保存されるのですが、「記録」ボタンが何回押されるかが分かりませんのでReDimは使用しにくいです。

3)ReDim Preserveで配列要素を再定義
要素数を再定義する際にこれまでに代入されている変数の値を保持するには「図2.記録クリック処理」内で利用されているように
ReDim Preserve 記録配列(記録配列数)
を使います。

上述の「動的配列サンプル2」について前に代入されている値を保持して要素数を再定義するには以下のように行います。

Sub 動的配列サンプル3()

    Dim A() As String
    Dim i As Integer

    ReDim A(2)
    A(0)=”テスト0”
    A(1)=”テスト1”
    A(2)=”テスト2”

    ReDim Preserve A(3)
     A(2)=”テスト3”

      For i = 1 To 3
   msgbox A(i)
 Next i

End sub

「動的配列サンプル3」を稼働するとメッセージボックスの表示処理では「テスト0」「テスト1」「テスト2」「テスト3」が順に表示されるようになります。

「図2.記録クリック処理」の処理に戻りますと、
ReDim Preserve 記録配列(記録配列数)
の部分で「記録配列」は「図4.「記録配列」の定義情報」を確認すると
Public 記録配列() As String
と定義されていることが確認できます。またその1行下に
Public 記録配列数 As Integer
と定義されているのが確認出来ます。

繰り返しになりますが「記録配列」配列の要素数は事前には分かりません。そこで要素数そのものも「記録配列数」という変数にしている訳です。

最初の1回目の処理時は「記録配列数」変数には何も入力されていませんから「0」が入っています。

記録配列(記録配列数) = Range(“b3”).Value
にて、セル番地「b3」の値を
記録配列(0)
にセットします。

記録配列数 = 記録配列数 + 1
にて「記録配列数」をカウントアップします。最初の処理では「記録配列数」変数には「0」が入っていますので本処理によって「記録配列数」は「1」となります。

次に「記録」ボタンを押す時には「記録配列数」は「1」となっていますから、
ReDim Preserve 記録配列(記録配列数)
にて要素数2の配列が定義されて、値を代入できるようになります。

「図2.記録クリック処理」では
MsgBox “記録されました”
によって「記録されました」とメッセージボックスを表示して、処理が完了した旨を伝えています。仮にMsgBox処理がないと本処理では画面上に何も変化がなくなってしまうのでそもそも処理が行われたどうかの判断がつきません。

何かしらの処理が行われた際には画面上に変化を与える必要があります。これは必ずしもメッセージボックスには限らずセル上に「完了しました」と文字を表示することでも良いのです。


ニコニコチャンネル(月額固定で見放題)
http://ch.nicovideo.jp/ai-light
本記事に関連する動画講座を閲覧できます。一部の動画は無料でも閲覧できます。

YouTubeチャンネル(無料動画配信中)
https://www.youtube.com/user/ailightcom
ITと経営に関する動画を配信しております。
よろしければ、チャンネル登録をお願い致します。

無料から学べる講座
https://www.ai-light.com/itkeiei/
本記事に関連する動画講座をセット販売しております。
その他、ITと経営に関する動画もセット販売しております。

格安ホームページ制作所
https://www.ai-light.com/hp2
インターネットマーケティングに関する記事が無料で閲覧可能です。

株式会社アイライト公式HP
https://www.ai-light.com/
(Access・Excelでシステム開発会社を探されている法人様はこちら)

ITでお困りのことがございましたら、まずはご相談(コンサルティング)
https://www.ai-light.com/itconsulting.html


弊社は、主に中小企業様向けの業務システム開発ホームページ制作パソコンサポートコンサルティングなど、ITに関する様々なサービスを格安で提供しております。
特に小規模な業務システム開発の分野では、主にAccess(アクセス)を利用した柔軟で効率的な開発を得意としており、関西でダントツの実績があります。

業務システム開発に関しては、以下のような内容で対応しております。
・顧客管理などの単機能なシステムは20万円~50万円が多い。
・受注から入金まで業務全体システムで100万円~350万円ぐらいが多い。
・Access(アクセス)-SQLserverで大規模システム開発は350万円~1500万円が多い。

詳細は、Access(アクセス)、Excel(エクセル)、WEBサイト製作による小規模システム開発のページをご参考ください。

大阪商工会議所からの推薦を受けて、中小企業庁運営の中小企業支援事業に専門家として登録されました。
通称ミラサポ。3回まで無料でのコンサルティングが可能です。ご興味がある方はご連絡ください。
https://www.mirasapo.jp/


(近畿大学にて非常勤講師も務めたバリバリの技術屋が経営する会社)

Access(アクセス)Excel(エクセル)SQL server バーコード Webシステムを使った業務システムのシステム開発の無料相談を受付中

株式会社 アイライト 担当:内藤 響(Naito Ko)
〒550-0005 大阪市西区西本町1丁目5番9号 日清ビル 5F
(四つ橋線 本町駅 24番出口すぐ)
まずは、メール・電話でご相談ください。
TEL : (06) 6599-8890 E-mail : info@ai-light.com
お電話が混んでいる場合が多いので、つながりにくい場合は
TEL : (06) 6535-5117までお願いします。