カテゴリー: VBA

VBAの全般的な内容についてはこちらのカテゴリーにまとめています

  • Excel VBAでWordを操作するための参照設定

    Excel VBAでWordを操作するための参照設定

    これは始まりの始まりでしかない、ただのメモっすw

    最近色々ドタバタで更新できていませんでしたが、ボチボチ再開したい

    でも、何か色々データが消えたので、立ち直るのに時間がwww

    ま、そーもいってられんから、何気なく、書き始めるのです

    ■Word文書

    仕事の現場で、Word文書の更新状況を確認する必要が出てきまして、始めはファイルの更新日付で管理していたのですが、SVNなどのソース管理システムでWord文書もバージョン管理をするようになりました

    そーすると、更新日付でみる必要がなくなり、バージョン管理で十分になったのですが、今度は、ファイルの中に記載された履歴情報などを実際に正しくかけているのか!?という管理が必要になりました

    ファイルを開くと、「更新履歴」という表があって、そこに以下の情報が書かれているのです

    • ファイルバージョン
    • 更新日付
    • 更新者名
    • 更新内容
    更新履歴
    更新履歴

    これをファイルを1つずつ開いて、文書内を「更新履歴」で検索して、内容をExcelに書き写す・・

    そんな悲しい作業が待っていたのです!w

    しかも、年だの月だのと言ったフォルダに複数のWord文書が配置されていて、同じ名前のファイルまであるのです!?

    ソース管理システムに保存される前の管理方法なんですけどね・・

    もーいらなくね???って思うんですけど、文書によっては、枝分かれすることもあるらしく、昔の状態でもファイルを残しておきたいのだそうだ・・

    最近作った文書ファイルなら、始めからソース管理システムに保存して、ブランチしていけばいいんでしょうけど、昔からあるファイルってのは、そーもいかないそーなんですw

    ■VBAでWordを処理したい

    というわけで、だったら、ExcelマクロのVBAで、フォルダ内のファイルをそれぞれ開いて、更新履歴の内容をコピーしてくるツールを作っちゃえばいいんじゃないの!?

    と思いつきましてー

    早速、ネットサーフィーーーーーンを開始!

    サンプルのソースなどを見つけたのですが、いきなり、以下のような単語(オブジェクト名)がでてくるのです!

    • Word.Application
    • Word.Document

    ま、何も気にせず、サンプルを実行してみたのですが、エラーが出て動きませんでした!!!

    参照設定
    参照設定

    Excelにも同じオブジェクトがあるので、何がダメなんだろう???

    と一瞬、疑問に思いましたが・・

    普通はオブジェクトを生成する場合は、CreateObjectをするんだけど、ExcelオブジェクトをCreateObjectしたことなんてありません!

    ■参照設定

    理由は簡単ですねー

    ExcelのVBAでは、始めから参照設定に「Microsoft Excel xx.x Object Library」が入っていますから!!!

    参照設定
    参照設定

    つまり、Wordオブジェクトがエラーになったのは、Wordの「Object Library」が参照設定にないからですね~

    と、気が付いてしまえば、「Microsoft Word xx.x Object Library」を参照可能なライブラリファイルの一覧から探して、チェックして「OK」をクリックするだけ!

    Microsoft Word xx.x Object Library
    Microsoft Word xx.x Object Library

    ■実行結果

    これで実行すれば、問題なくWordオブジェクトを生成してくれます!

    実行する
    実行する

    とまー、今回は最初のところだけを記事にしておきます

    実際に更新履歴を取得して、Excelに記載してくところは、今後勉強しながら記事にしていきたいと思います!

    というわけで、今回は短いですがw

    ではでは

  • Collectionオブジェクトを使い倒す!

    Collectionオブジェクトを使い倒す!

    Excelマクロで使用するVBAを用いたデータ処理で、欠かせないのが配列ですが、VBAの各種オブジェクトでも多く使用されているコレクション(Collection)オブジェクトの使い方を勉強していきます!

    ■複雑な操作

    今回は、配列に対して複雑な操作が可能な以下のオブジェクトについて勉強してくわけですが・・

    配列や複雑な操作については、前回記載した内容を確認してください

    [blogcard url=”https://zesys.net/excel/vba/use-arrays-with-vba/”]VBAで配列を使う[/blogcard]

    ※手は抜いていません!有効利用ですw

    ■Collectionオブジェクト

    今回は、記事のタイトルでも書いた通り、今回はCollectionオブジェクトを勉強します!(Dictionaryオブジェクトも後日勉強しますw)

    参考サイト:「Collection オブジェクト | Microsoft Docs

    Collectionオブジェクトは参照設定が不要ですので、ダイレクトにCollectionオブジェクトを記載できます

    参照設定は不要
    参照設定は不要

    説明するよりもサンプルを見てもらった方が早いかも知れません

    ・いきなりサンプル

    CollectionオブジェクトにString型の値をAddして、For~EachステートメントでVariant型の変数に取り出すサンプルです

    Sub Sample1()
        Dim obj     As Collection       ' Collectionオブジェクト
        Dim week    As Variant          ' For~Eachステートメントで使用できる型
    
        ' Collectionオブジェクトの生成
        Set obj = New Collection
    
        ' String型の文字列をCollectionオブジェクトに追加する
        obj.Add "Mon"
        obj.Add "Tue"
        obj.Add "Wed"
        obj.Add "Thu"
        obj.Add "Fri"
        obj.Add "Sat"
        obj.Add "Sun"
    
        ' For~EachステートメントでCollectionオブジェクトをVariant型の変数に取り出す
        For Each week In obj
            Debug.Print week
        Next
    
        ' Collectionオブジェクトを破棄する
        Set obj = Nothing
    
    End Sub
    
    ■出力結果
    Mon
    Tue
    Wed
    Thu
    Fri
    Sat
    Sun

    Collectionオブジェクトのメリットと言えば、Addメソッドで配列を動的に確保していけるので、ReDimステートメントを使用して、予め配列を確保する必要がありません

    ・Keyを用いたサンプル

    あまり知られていない(?)かも知れませんが、CollectionオブジェクトにはKeyを使用して、Addする方法があります

    実際に、MicrosoftのAddメソッドのサンプルは、Keyを使ったサンプルが公開されているのです!

    Worksheetsオブジェクトでシート名をキーにして、Worksheetオブジェクトを取得できるのと同じように扱うことができます

    Sub Sample2()
        Dim obj     As Collection       ' Collectionオブジェクト
        Dim week    As Variant          ' For~Eachステートメントで使用できる型
        Dim idx     As Integer
    
        ' Collectionオブジェクトの生成
        Set obj = New Collection
    
        ' String型の文字列をCollectionオブジェクトに追加する
        obj.Add Key:="Mon", Item:="Monday"
        obj.Add Key:="Tue", Item:="Tuesday"
        obj.Add Key:="Wed", Item:="Wednesday"
        obj.Add Key:="Thu", Item:="Thursday"
        obj.Add Key:="Fri", Item:="Friday"
        obj.Add Key:="Sat", Item:="Saturday"
        obj.Add Key:="Sun", Item:="Sunday"
    
        ' インデックスを使用してItemを取り出す
        Debug.Print "①インデックスを使用してItemを取り出す"
        For idx = 1 To obj.Count
            Debug.Print obj(idx)
        Next
    
    Debug.Print
    
        ' Keyを使用してItemを取り出す
        Debug.Print "②Keyを使用してItemを取り出す"
        Debug.Print obj("Mon")
        Debug.Print obj("Tue")
        Debug.Print obj("Wed")
        Debug.Print obj("Thu")
        Debug.Print obj("Fri")
        Debug.Print obj("Sat")
        Debug.Print obj("Sun")
    
        ' Collectionオブジェクトを破棄する
        Set obj = Nothing
    
    End Sub
    
    ■出力結果
    ①インデックスを使用してItemを取り出す
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    Sunday
    
    ②Keyを使用してItemを取り出す
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    Sunday
    

    – 注意点

    インデックスで取り出す場合、ReDimステートメントが「0」からなのに対して、Collectionオブジェクトは「1」から開始することに注意が必要です

    Keyを指定した場合には、更に以下の注意点があります

    • 重複するKeyはAddできない
    • Keyに指定できるのは文字列

    ちなみに、重複するKeyをAddしようとすると、以下のエラーが発生します

    重複Keyのエラー
    重複Keyのエラー

    ※なお、Keyを指定せずにAddする場合は、このエラーは発生しません

    Keyに数字を指定した場合は、以下のエラーが発生します

    Keyに数字を指定
    Keyに数字を指定

    – デメリット

    ただ、Keyを用いた場合、Itemへのアクセスは一意な名称で可能になるので、便利なのですが、以下のようなデメリットがあります

    • Keyの重複をチェックできるメソッドがない
    • Keyを取り出す方法がない
    • Addメソッドのエラーでしか判断できない

    CollectionオブジェクトはKeyを用いたAddが可能ですが、Keyが既にコレクションに含まれていることを調べるメソッドが用意されていません

    更に、Keyを取り出す方法もないため、Keyが既に含まれていることを調べることもできない

    つまり、Addしてエラーになったら重複Keyがあるなど、あまり宜しくない対応が必要になります

    ・クラスを用いたサンプル(推奨)

    そこで推奨したい実装としては、クラスをCollectionオブジェクトにAddする方法です

    Weekクラスを定義して、WeeksのCollectionオブジェクトにクラスをAddするサンプルです

    For~Eachステートメントで取り出す場合もWeekクラスで取り出すことができます

    (WorksheetクラスのコレクションであるWorksheetsオブジェクトと同じイメージです)

    Sub Sample3()
        Dim Weeks   As Collection       ' Collectionオブジェクト
        Dim Wk      As week             ' クラス定義
    
        ' Collectionオブジェクトの生成
        Set Weeks = New Collection
    
        ' clsWeekクラスを生成
        Set Wk = New week
        Wk.m_no = 1
        Wk.m_week = "Mon"
        Wk.m_name = "Monday"
    
        ' 作成したclsWeekクラスをCollectionオブジェクトに追加する
        Weeks.Add Key:=Wk.m_no, Item:=Wk
        
        Set Wk = New week
        Wk.m_no = 2
        Wk.m_week = "Tue"
        Wk.m_name = "Tuesday"
        Weeks.Add Key:=Wk.m_no, Item:=Wk
        
        Set Wk = New week
        Wk.m_no = 3
        Wk.m_week = "Wed"
        Wk.m_name = "Wednesday"
        Weeks.Add Key:=Wk.m_no, Item:=Wk
        
        Set Wk = New week
        Wk.m_no = 4
        Wk.m_week = "Thu"
        Wk.m_name = "Thursday"
        Weeks.Add Key:=Wk.m_no, Item:=Wk
        
        Set Wk = New week
        Wk.m_no = 5
        Wk.m_week = "Fri"
        Wk.m_name = "Friday"
        Weeks.Add Key:=Wk.m_no, Item:=Wk
        
        Set Wk = New week
        Wk.m_no = 6
        Wk.m_week = "Sat"
        Wk.m_name = "Saturday"
        Weeks.Add Key:=Wk.m_no, Item:=Wk
        
        Set Wk = New week
        Wk.m_no = 7
        Wk.m_week = "Sun"
        Wk.m_name = "Sunday"
        Weeks.Add Key:=Wk.m_no, Item:=Wk
        
        Set Wk = Nothing
        
        ' For~EachステートメントでclsWeekクラスの変数に取り出す
        For Each Wk In Weeks
            Debug.Print Wk.m_no, Wk.m_week, Wk.m_name
        Next
    
        ' Collectionオブジェクトを破棄する
        Set Weeks = Nothing
    
    End Sub
    
    ■出力結果
    1             Mon           Monday
    2             Tue           Tuesday
    3             Wed           Wednesday
    4             Thu           Thursday
    5             Fri           Friday
    6             Sat           Saturday
    7             Sun           Sunday
    

    クラスをCollectionオブジェクトのItemとする場合、重複したクラスデータを取り込むことが可能になります

    一意性を保つために、クラスに一意な「No」をメンバに持たせて、これをCollectionオブジェクトのKeyに設定することで、一意性を維持して、Itemへのアクセスを簡単にすることが可能になります

    これは一覧表などに「No」列を持たせて、一意性を保つのと同じ考えです

    イメージ
    イメージ

    – Weekクラス

    メンバしかいないシンプルなクラスを作ってみますw

    Option Explicit
    ' メンバ
    Public m_no         As String   ' No.
    Public m_week       As String   ' 名称(短)
    Public m_name       As String   ' 名称(長)
    

    メンバだけなら構造体でもいいんですけどねー

    汎用的なことを考慮して、クラスにしています

    そしてシレっとString型のみのメンバ構成にしています

    ExcelからTextプロパティで値を取得するので、String型で扱うのが癖になったというだけのことですが、気になる方は、「No」をInteger型やLong型にしても良いかと思います

    クラスにクラスそのものを返すゲッターを作成して、CollectionにAddするというのもよく使用します

    ■メソッド

    ・Addメソッド

    サンプルの中で使用しているので、使い方は概ねわかっていただけているかと思いますが、紹介していないオプションがあるので、それだけ説明します

    – Before

    AddメソッドでBeforeを指定することで、Collectionオブジェクトに含まれている既存の要素の前にItemを挿入することができます

    インデックス番号を指定するサンプルを記載します

    Sub Sample4()
        Dim obj     As Collection       ' Collectionオブジェクト
        Dim week    As Variant          ' For~Eachステートメントで使用できる型
    
        ' Collectionオブジェクトの生成
        Set obj = New Collection
    
        ' String型の文字列をCollectionオブジェクトに追加する
        obj.Add "Mon"    ' 1
        obj.Add "Tue"    ' 2
        obj.Add "Wed"    ' 3
        obj.Add "Fri"    ' 4
        obj.Add "Sat"    ' 5
        obj.Add "Sun"    ' 6
    
        ' Beforeで「4」"Fri"の前に"Thu"を追加する
        obj.Add Item:="Thu", Before:=4
    
        ' For~EachステートメントでVariant型の変数に取り出す
        For Each week In obj
            Debug.Print week
        Next
    
        ' Collectionオブジェクトを破棄する
        Set obj = Nothing
    
    End Sub
    
    ■出力結果
    Mon
    Tue
    Wed
    Thu
    Fri
    Sat
    Sun
    

    – After

    Before同様に、AddメソッドでAfterを指定することで、Collectionオブジェクトに含まれている既存の要素の後にItemを挿入することができます

    Keyの文字列を指定するサンプルを記載します

    Sub Sample5()
        Dim obj     As Collection       ' Collectionオブジェクト
        Dim week    As Variant          ' For~Eachステートメントで使用できる型
    
        ' Collectionオブジェクトの生成
        Set obj = New Collection
    
        ' String型の文字列をCollectionオブジェクトに追加する
        obj.Add Key:="Mon", Item:="Monday"
        obj.Add Key:="Tue", Item:="Tuesday"
        obj.Add Key:="Wed", Item:="Wednesday"
        obj.Add Key:="Fri", Item:="Friday"
        obj.Add Key:="Sat", Item:="Saturday"
        obj.Add Key:="Sun", Item:="Sunday"
    
        ' Afterで"Wed"の後に"Thu"を追加する
        obj.Add Key:="Thu", Item:="Thursday", After:="Wed"
    
        ' For~EachステートメントでVariant型の変数に取り出す
        For Each week In obj
            Debug.Print week
        Next
    
        ' Collectionオブジェクトを破棄する
        Set obj = Nothing
    
    End Sub
    
    ■出力結果
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    Sunday
    

    ・Itemメソッド

    あまり使いませんけど、Collectionオブジェクトの規定メンバなので、紹介しておきます

    Sub Sample6()
        Dim obj     As Collection       ' Collectionオブジェクト
        Dim week    As Variant          ' For~Eachステートメントで使用できる型
        Dim idx     As Integer
    
        ' Collectionオブジェクトの生成
        Set obj = New Collection
    
        ' String型の文字列をCollectionオブジェクトに追加する
        obj.Add "Mon"
        obj.Add "Tue"
        obj.Add "Wed"
        obj.Add "Thu"
        obj.Add "Fri"
        obj.Add "Sat"
        obj.Add "Sun"
        
        ' Itemを使用する
        For idx = 1 To obj.Count
            Debug.Print obj.Item(idx), obj(idx)
        Next
    
        ' Collectionオブジェクトを破棄する
        Set obj = Nothing
    
    End Sub
    
    ■出力結果
    Mon           Mon
    Tue           Tue
    Wed           Wed
    Thu           Thu
    Fri           Fri
    Sat           Sat
    Sun           Sun
    

    Sample6の20行目と出力結果を見て頂ければわかるように、以下の書き方で得られる情報は同じです

    • obj.Item(idx)
    • obj(idx)

    なので、あまりItemメソッドは使いませんが、Itemメソッドでも引数にKeyの文字列を指定することは可能です

    ・Removeメソッド

    Addメソッドの逆で、Collectionオブジェクトから要素を削除する場合に使用します

    Sub Sample7()
        Dim obj     As Collection       ' Collectionオブジェクト
        Dim week    As Variant          ' For~Eachステートメントで使用できる型
        Dim idx     As Integer
    
        ' Collectionオブジェクトの生成
        Set obj = New Collection
    
        ' String型の文字列をCollectionオブジェクトに追加する
        obj.Add "Mon"
        obj.Add "Tue"
        obj.Add "Wed"
        obj.Add "Thu"
        obj.Add "Fri"
        obj.Add "Sat"
        obj.Add "Sun"
    
        ' 4番目の要素を削除する
        obj.Remove(4)
        
        ' Itemを使用する
        For idx = 1 To obj.Count
            Debug.Print obj.Item(idx)
        Next
    
        ' Collectionオブジェクトを破棄する
        Set obj = Nothing
    
    End Sub
    
    ■出力結果
    Mon
    Tue
    Wed
    Fri
    Sat
    Sun
    

    これはReDimステートメントで作成する配列にはない便利なメソッドです

    残念なところは、他のメソッドと違って、Keyでは削除できないというところですね

    ■プロパティ

    ・Countプロパティ

    Collectionオブジェクトのメンバで、Collectionオブジェクト内の要素数を返してくれるプロパティです

    オブジェクトブラウザで見ると、メソッドに割り当たってるんですけどね!?

    オブジェクトブラウザ
    オブジェクトブラウザ

    使い方は、Sample2でシレっと使っていますので、そちらをご覧くださいw

    指定するインデックスの上限として、Forステートメントを使ってループする場合に使用します

    ■最後に

    大量のデータを扱う上では、CollectionオブジェクトはAddやRemoveができるので非常に便利な配列として重宝されます

    この便利さでも十分なのですが、より便利な配列用のオブジェクトとして、Dictionary オブジェクトが用意されています

    次回は、このDictionary オブジェクトについて学びたいと思います

    ではでは

  • VBAで配列を使う

    VBAで配列を使う

    仕事の効率化を行うために、Excelマクロを使って、情報(データ)を収集したりまとめたりすることが多いのですが、同様のデータを取り扱う場合、配列を使うことが多いです

    ■配列とは

    配列とは下駄箱やロッカーのように同じ大きさの入れ物が沢山並んだ1つの固まりというイメージでしょうか?

    基本的には、同じ大きさのデータを順番に格納して、順番に同じ処理していくために利用します

    情報処理の世界では、決まった数のデータを処理するということもありますが、多くの場合、そのデータ数が決まっていないことがあり、そのデータを格納するための配列は動的にサイズを用意しなければなりません

    空いている下駄箱がなければ、新しく作って全ての靴を下駄箱に収納するというようなことが、情報処理では行われています(例えが悪いw)

    ■配列を作成

    VBAで配列を作るのは簡単です

    Dimステートメントで宣言すればいいだけなのですが、宣言する際に配列数をしていするかしないかは自由だぁーーー!w

    ・ReDimステートメント

    VBAで動的な配列と言うと以下のようなReDimステートメントのコードを思い浮かべる人が多いでしょう!

    Sub Sample1()
        Dim a()     As Integer  ' 配列数を指定しない
        Dim b(3)    As Integer  ' 配列数を指定する
        Dim i       As Integer
        
        ' 配列数を変更する(既存データを初期化)
        ReDim a(3)
        
        a(0) = 0
        a(1) = 1
        a(2) = 2
        a(3) = 3
    
        Debug.Print UBound(a)   ' 「3」を返す
    
        For i = 0 To UBound(a)
            Debug.Print a(i)
        Next i
    
        ' 配列数を変更する(既存データを残す)
        ReDim Preserve a(5) 
        
        a(4) = 4
        a(5) = 5
    
        Debug.Print UBound(a)   ' 「5」を返す
    
        For i = 0 To UBound(a)
            Debug.Print a(i)
        Next i
    
        ' 配列数を変更する(既存データを初期化)
        ReDim a(8)
    
        Debug.Print UBound(a)   ' 「8」を返す
    
        For i = 0 To UBound(a)
            Debug.Print a(i)
        Next i
    
    End Sub

    ※Preserveオプションは、配列のサイズを変更する際に、既存の配列のデータを保持してくれます

    配列を保持
    配列のデータを保持

    ※しれっと使っているUBound関数は配列の添え字の最大値を返してくれます

    ReDimステートメントは、多次元の配列のサイズ変更も非常に簡単なので、重宝されています

    ・Array関数

    初期値を設定した配列を作成する場合には、以下のようにして、Array関数を使用することが多いです

    参考サイト:「Array 関数 (Visual Basic for Applications) | Microsoft Docs
    Sub Sample2()
        Dim week    As Variant
        Dim day     As Variant
        
        week = Array("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
        
        Debug.Print UBound(week)    ' 「6」を返す
        
        ' Variant型の配列はFor~Eachステートメントで取り出せる
        For Each day In week
            Debug.Print day
        Next
    
    End Sub

    Array関数で作成した配列には以下の特徴があります

    • Variant型の配列を作成して返す
    • ReDimステートメントで配列数が変更できる

    Array関数の実行結果をブレークポイントを設定して、変数内を確認してみましょー

    Array関数
    Array関数

    Variant型なので、サンプルのようにFor~Eachステートメントを使用して取り出すことが可能です

    ただし、Variant型というのはどんな型でも代入できるので、その変数が何を意味するデータなのかが判り辛いので、個人的にはあまり好きではありませんw

    ■複雑な操作

    配列を動的に作成する方法としては、上記に記載した方法で問題はないのですが、以下のように配列に対して複雑な操作をする場合には適していません

    • データを途中に追加する
    • 途中のデータを削除する
    • データを検索する

    配列に対して複雑な操作が可能なオブジェクトには、以下のようなものがあります!

    • Collectionオブジェクト
    • Dictionaryオブジェクト

    このオブジェクトについて、簡単に説明していきます

    ・Collectionオブジェクト

    このオブジェクトは配列に格納するデータを1つの関連性のあるグループとして扱うことで簡単に操作することができます

    実際には、必ずしも同じ型のデータである必要はないのですが、使い方としては、同じ型のデータを格納して、For~Eachステートメントで操作するのが一般的です

    あまり知られていない(?)かも知れませんが、CollectionオブジェクトでもItemとKeyを関連付けて格納することができます

    ただし、For~Eachステートメントで取り出す場合は、Keyは関係ないので、個人的にはあまりKeyを指定することはありません

    Collectionオブジェクトについては以下の記事も参考にしてください

    [blogcard url=”https://zesys.net/excel/vba/overuse-collection-object/”]Collectionオブジェクトを使い倒す![/blogcard]

    ・Dictionaryオブジェクト

    このオブジェクトは配列に格納するデータをKeyとItemのペアにして扱っていますので、一意のKeyでItemを取り出すことが可能です

    有り難い機能としては、Dictionaryオブジェクト内に格納したKeyが既に存在するかどうかを判定するExistsメソッドがあります!

    そのため、「存在しない場合にのみ追加する」というデータの管理方法が容易に実現することができます

    そして、For~Eachステートメントで取り出す場合は、ItemではなくKeyが取得されるので注意が必要です

    ・サンプル

    それぞれのオブジェクトの生成方法について、簡単なサンプルを紹介します

    Sub Sample3()
        Dim a   As New Collection   ' Collectionオブジェクト
        Dim b   As Object           ' Dictionaryオブジェクト
        
        ' Dictionaryオブジェクトの生成
        Set b = CreateObject("Scripting.Dictionary")
        
        ...
    
    End Sub

    生成方法は以下のように違います

    • Collectionオブジェクトはそのまま宣言で記載できます
    • DictionaryオブジェクトはCreateObjectで生成します

    特に、Collectionオブジェクトの場合は、宣言時にNewを指定した使い方を多く見かけます

    個人的には以下のSample4のように、宣言ではNewを使用せずに、Set時に使用して生成するようにしています

    Sub Sample4()
        Dim a   As Collection       ' Collectionオブジェクト
        Dim b   As Object           ' Dictionaryオブジェクト
        
        ' Collectionオブジェクトの生成
        Set a = New Collection
        
        ' Dictionaryオブジェクトの生成
        Set b = CreateObject("Scripting.Dictionary")
        
        ...
    
    End Sub

    ※ま、お好みの方法で良いと思いますけどねw

    ■小ネタ

    ReDimステートメントを使用して、ちょっとしたサンプルを記載します

    Sub Sample5()
        Dim week()  As String
        Dim day     As Variant
        
        ReDim week(6)
        week(0) = "Mon"
        week(1) = "Tue"
        week(2) = "Wed"
        week(3) = "Thu"
        week(4) = "Fri"
        week(5) = "Sat"
        week(6) = "Sun"
    
        Debug.Print UBound(week) ' 「6」を返す
        
        ' Variant型の配列はFor~Eachステートメントで取り出せる
        For Each day In week
            Debug.Print day
        Next
    End Sub

    最初のサンプル(Sample1)では、配列を取り出す際に、For~Nextステートメントで記載しましたが、配列であれば、For~Eachステートメントで取り出すこともできます

    当然、Array関数のように、Variant型ではなく、String型の配列でも同じです

    Sub Sample6()
        Dim week()  As Variant
        Dim day     As Variant
        
        ReDim week(6)
        week(0) = "Mon"
        week(1) = "Tue"
        week(2) = "Wed"
        week(3) = "Thu"
        week(4) = "Fri"
        week(5) = "Sat"
        week(6) = "Sun"
        
        Debug.Print UBound(week)    ' 「6」を返す
        
        ' Variant型の配列はFor~Eachステートメントで取り出せる
        For Each day In week
            Debug.Print day
        Next
    End Sub

    ちなみに、Variant型の配列宣言は、括弧を付けても(Sample6)付けなくても(Sample2)宣言が可能ですが、String型等(Sample5)は括弧を付けないと、ReDimステートメントでエラーが発生します

    ■最後に

    かなりザックリとVBAでの配列の使い方を紹介しましたw

    次回は、CollectionオブジェクトやDictionaryオブジェクトの詳細な使い方について、勉強していこうと思います!

    ではでは