ヘッダー行から変数作成 ⑥ クリップボードに格納(改)

前回は、リストボックスに表示された変数名を選択し、任意の文字に
編集・変更することに挑戦した。
infoment.hatenablog.com

今日も、前回の続きから。
f:id:Infoment:20201107105339p:plain

初回にリストボックスの内容をクリップボードへ格納した際、リストボックスの
中身は複数行1列の二次元配列だった。

しかしその後、変数宣言用に形を整えるなどして、現在は複数行4列となった。
そこで、「クリップボードへコピー」ボタンの中身を作り直す必要が出てきた。

ユーザーフォーム

今回、具体的には、クリップボードへ格納するCopyTextを修正する必要がある。
作戦としては、こんな感じだ。

  1. ItemListBoxから、リスト全体を取得して配列に格納する。
  2. 同配列から、WorkSheetFunction.Indexを用いて一行ずつ取り出す。
  3. 取り出した配列をJoinで結合し、予め準備しておいた別の配列に格納。
  4. 上記「別の配列」をvbNewLineで結合して、CopyTextに返す。

この時の注意点は二つ。
一つ目は、Index関数で取り出し指定する配列の行番号が、実際のIndexではなく、「何行目か」であること。リストボックスから取り出した配列が行列共に0始まりだからと言って0行目から指定すると、配列全体が戻り値となってしまう。
infoment.hatenablog.com

二つ目は、途中に空白が有っても気にしないこと。なぜなら貼り付けた時点で、VBEが良い感じに調整してくれるから。

ということで修正したのがこちら。

Private Property Get CopyText() As String
    Dim SourceArray As Variant
        SourceArray = ItemListBox.List
    Dim arr() As Variant
    ReDim arr(0 To ItemListBox.ListCount - 1)
    Dim temp As Variant
    Dim i As Long
        For i = 0 To ItemListBox.ListCount - 1
            ' index関数による配列のスライスは、配列のindexではなく
            ' 「i番目」の切り出しであることに注意。
            ' (0行目を指定すると配列の全てが返ってくる)。
            temp = WorksheetFunction.Index(SourceArray, i + 1, 0)
            ' 空白行があっても半角スペースで結合してしまうが、
            ' VBEに貼り付けた時点で
            arr(i) = Join(temp, " ")
        Next
        
        CopyText = Join(arr, vbNewLine)
End Property
結果確認

それでは、実際に動作させて、確認してみよう。
確認する動作は、以下の2つ。

  1. クリップボードへコピー」ボタンを押してもエラーが発生しないか。
  2. VBEへ、コピーした内容が正しく貼り付けられるか。

上記の確認結果がこちら。
f:id:Infoment:20201107111448g:plain

今回も、想定通りの結果を得ることが出来た。

それでは、変数宣言はとりあえずこのぐらいにして、次回はもう一つの
テーマである「Enum」の作成に挑戦です。

参考まで。