【こんなライブラリが欲しい】配列データを指定セルに貼り付ける
お世話になっております。
こちらの質問を眺めていて、「WinActorでもExcelVBAみたいに配列が使えればな」と思ったので、ちょっと検索してみました。
すると、スイートライブラリにExcelのセル範囲を配列に格納するライブラリがありました!
とっても便利です、ありがとうございます!(公開日が2021/3/15で、ごく最近なんですね)
Excel操作(指定範囲の値を配列に追加)
なので、今回は「配列のデータを指定セルに貼り付け」について、ライブラリを修正して書いてみました。
WinActor v6.3.0/Excel2016で動作確認をおこなっています。
ベースとなるライブラリは、「Excel操作(値の設定2)」を用いました。(Excel操作(値の設定)でも同じ)
※注意点※
スクリプトの左下部にある「変数を他のスクリプト実行アクションと共有する」のチェックをONにしてください。
(OFF状態だと配列が読み込めずエラーになります。)
<変更点①>
value = !設定値!
▼
arrayName = !配列名!
strSelect = !配列次元数|,1次元配列(行),1次元配列(列),2次元配列!
If strSelect = "" Then
Err.Raise 1, "", "配列次元数を指定してください。"
End If
<変更点②>
cell.value = value
▼
'cell.value = value ' コメントアウト
Call pasteArray(cell)
<追加箇所>※スクリプトの記述の最後に追加
' ====配列をセルに貼り付け=====================
Sub pasteArray(rngStart)
Dim rngArea
Dim aryTemp
Dim aryResult
Dim rowMax
Dim colMax
Dim rw
Dim claryTemp = getArrayObject
rowMax = UBound(aryTemp, 1) + 1
colMax = UBound(aryTemp, 2) + 1Set rngArea = rngStart.Resize(rowMax, colMax)
If rngArea.Count = 1 Then
rngArea.Value = aryTemp(0, 0)
Else
aryResult = rngArea.Value
For rw = 0 To rowMax - 1
For cl = 0 To colMax - 1
aryResult(rw + 1, cl + 1) = aryTemp(rw, cl)
Next
Next
rngArea.Value = aryResult
End IfErase aryTemp
Erase aryResultEnd Sub
'-----------------------------------------------------------2次元配列に統一
Function getArrayObject()Dim aryBase1
Dim aryBase2()
Dim iSelect Case strSelect
Case "1次元配列(行)":
If rootArray.Exists(arrayName) = False Then
Err.Raise 1, "", "配列が存在しません。(配列名:" & arrayName & ")"
End IfaryBase1 = rootArray.Item(arrayName)
ReDim aryBase2(UBound(aryBase1), 0)For i = 0 To UBound(aryBase1)
aryBase2(i, 0) = aryBase1(i)
NextgetArrayObject = aryBase2
Case "1次元配列(列)":
If rootArray.Exists(arrayName) = False Then
Err.Raise 1, "", "配列が存在しません。(配列名:" & arrayName & ")"
End IfaryBase1 = rootArray.Item(arrayName)
ReDim aryBase2(0, UBound(aryBase1))For i = 0 To UBound(aryBase1)
aryBase2(0, i) = aryBase1(i)
NextgetArrayObject = aryBase2
Case "2次元配列"
If root2Array.Exists(arrayName) = False Then
Err.Raise 1, "", "配列が存在しません。(配列名:" & arrayName & ")"
End IfaryBase1 = root2Array.Item(arrayName)
getArrayObject = aryBase1End Select
Erase aryBase1
Erase aryBase2End Function
実際に、「Excel操作(指定範囲の値を配列に追加)」と組み合わせて使った結果がこちら。
ケース1)B1:B5セルを配列に追加し、配列次元数で「1次元配列(行)」を指定、E2セルに対して貼り付けを実行
ケース2)B1:B5セルを配列に追加し、配列次元数で「1次元配列(列)」を指定、H1セルに対して貼り付けを実行
ケース3)A1:B5セルを配列に追加し、配列次元数で「2次元配列」を指定、G4セルに対して貼り付けを実行
※配列次元数は、「Excel操作(指定範囲の値を配列に追加)」と同じものを選んでください。
(1次元配列(行)と1次元配列(列)は貼り付け挙動の違いだけなので、「Excel操作(指定範囲の値を配列に追加)」では「1次元配列」を選べば機能します。)
とはいえ、配列自体がハードルの高いものかもしれないなという気もします。
スイートライブラリのほうで配列関係のライブラリが充実してきているようですし、そちらで実装されれば絶対そのほうがいいと思うので、どちらかと言えば需要アピールの記事です。
それまでの間、ちょっとお困りの方の手助けになれば幸いです。
(投稿規約に目は通したつもりですが、内容が不適切であれば削除します。申し訳ありません。)