5

お世話になっております。

特定範囲のデータを特定セルへ、縦に転記したい。

こちらの質問を眺めていて、「WinActorでもExcelVBAみたいに配列が使えればな」と思ったので、ちょっと検索してみました。

すると、スイートライブラリにExcelのセル範囲を配列に格納するライブラリがありました!

とっても便利です、ありがとうございます!(公開日が2021/3/15で、ごく最近なんですね)

Excel操作(指定範囲の値を配列に追加)

https://winactor.biz/sweet/2021/03/15_3827.html

なので、今回は「配列のデータを指定セルに貼り付け」について、ライブラリを修正して書いてみました。

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 cl

aryTemp = getArrayObject
rowMax = UBound(aryTemp, 1) + 1
colMax = UBound(aryTemp, 2) + 1

Set 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 If

Erase aryTemp
Erase aryResult

End Sub

'-----------------------------------------------------------2次元配列に統一
Function getArrayObject()

Dim aryBase1
Dim aryBase2()
Dim i

Select Case strSelect
Case "1次元配列(行)":
If rootArray.Exists(arrayName) = False Then
Err.Raise 1, "", "配列が存在しません。(配列名:" & arrayName & ")"
End If

aryBase1 = rootArray.Item(arrayName)
ReDim aryBase2(UBound(aryBase1), 0)

For i = 0 To UBound(aryBase1)
aryBase2(i, 0) = aryBase1(i)
Next

getArrayObject = aryBase2

Case "1次元配列(列)":
If rootArray.Exists(arrayName) = False Then
Err.Raise 1, "", "配列が存在しません。(配列名:" & arrayName & ")"
End If

aryBase1 = rootArray.Item(arrayName)
ReDim aryBase2(0, UBound(aryBase1))

For i = 0 To UBound(aryBase1)
aryBase2(0, i) = aryBase1(i)
Next

getArrayObject = aryBase2

Case "2次元配列"
If root2Array.Exists(arrayName) = False Then
Err.Raise 1, "", "配列が存在しません。(配列名:" & arrayName & ")"
End If

aryBase1 = root2Array.Item(arrayName)
getArrayObject = aryBase1

End Select

Erase aryBase1
Erase aryBase2

End Function

実際に、「Excel操作(指定範囲の値を配列に追加)」と組み合わせて使った結果がこちら。

ケース1)B1:B5セルを配列に追加し、配列次元数で「1次元配列(行)」を指定、E2セルに対して貼り付けを実行
ケース2)B1:B5セルを配列に追加し、配列次元数で「1次元配列(列)」を指定、H1セルに対して貼り付けを実行
ケース3)A1:B5セルを配列に追加し、配列次元数で「2次元配列」を指定、G4セルに対して貼り付けを実行

※配列次元数は、「Excel操作(指定範囲の値を配列に追加)」と同じものを選んでください。
(1次元配列(行)と1次元配列(列)は貼り付け挙動の違いだけなので、「Excel操作(指定範囲の値を配列に追加)」では「1次元配列」を選べば機能します。)

とはいえ、配列自体がハードルの高いものかもしれないなという気もします。
スイートライブラリのほうで配列関係のライブラリが充実してきているようですし、そちらで実装されれば絶対そのほうがいいと思うので、どちらかと言えば需要アピールの記事です。
それまでの間、ちょっとお困りの方の手助けになれば幸いです。

(投稿規約に目は通したつもりですが、内容が不適切であれば削除します。申し訳ありません。)

Yuzunoki 回答した質問
回答とコメントは、会員登録(無料)で閲覧できるようになります。