ヘッダー行から変数作成 ⑥ クリップボードに格納(改)
前回は、リストボックスに表示された変数名を選択し、任意の文字に
編集・変更することに挑戦した。
infoment.hatenablog.com
今日も、前回の続きから。
初回にリストボックスの内容をクリップボードへ格納した際、リストボックスの
中身は複数行1列の二次元配列だった。
しかしその後、変数宣言用に形を整えるなどして、現在は複数行4列となった。
そこで、「クリップボードへコピー」ボタンの中身を作り直す必要が出てきた。
ユーザーフォーム
今回、具体的には、クリップボードへ格納するCopyTextを修正する必要がある。
作戦としては、こんな感じだ。
- ItemListBoxから、リスト全体を取得して配列に格納する。
- 同配列から、WorkSheetFunction.Indexを用いて一行ずつ取り出す。
- 取り出した配列をJoinで結合し、予め準備しておいた別の配列に格納。
- 上記「別の配列」を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