Excel Range( "G2:AA1000")を2D配列に割り当てる方法を教えてください。可能であれば、その2D配列に対して何らかの操作を実行した後、その2D配列を同じ範囲に戻す方法は?2D配列に範囲を割り当てた後、その2D行列から各行をどのように識別しますか?
ありがとう、
配列を使用して領域に変更を加え、同じ場所または別の場所に書き出す簡単な方法があります。
このサンプルコードは、配列を使用して、ある領域から別の領域にデータをコピーします。
Sub example()
Dim testdata()
testdata = Range("A1:B13")
Range("D1:E13") = testdata ' simple copy
Range("G1") = testdata ' copy only 1 cell
Range("I1:K22") = testdata 'try to copy too much
End Sub
testdata
配列は1から始まり、範囲で指定された列と行の数まで拡張されます。この場合、はA1testdata(1,1)
から取得したデータを参照し、 B1を参照し、最後にA13を参照し、B13を参照します。 testdata(1,2)
testdata(13,1)
testdata(13,2)
次の行の配列と同じ範囲を設定すると、配列が指定された場所にコピーされます。
Range("D1")=testdata
、シートに1つのセルのみが配置されます。Range("A1:A3")=testdata
A1とA2は配列からのデータで埋められますが、A3は#N/Aになります。サンプルプログラムの結果:
注:A1:B13は元のデータであり、後続のデータとともにコピーされます。range(??)=testdata
これは、ワークシートから一定範囲のデータを読み取り、配列を操作してから、同じワークシートに書き戻すという、うまくいった例です。
Sub RangeArray()
Dim Rng As Range
Dim Arr()
Dim ArrItem
Dim i As Long, j As Long
Dim rUB as Long, cUB as Long
Set Rng = Worksheets("Sheet1").Range("A1:G19")
rUB = Rng.Rows.Count 'Row upper bound
cUB = Rng.Columns.Count ' Column upper bound
ReDim Arr(1 To rUB, 1 To cUB)
'Read worksheet range into array
For i = 1 To rUB
For j = 1 to cUB
Arr(i, j) = Rng.Cells(i, j).Value
Next
Next
'Do something to array
For i = 1 To rUB
For j = 1 To cUB
If i <> j Then
Arr(i, j) = Arr(i, j) / (i * j)
End If
Next
Next
'Write array back to worksheet
Set Rng = Worksheets("Sheet1").Range("I1")
For i = 1 To rUB
For j = 1 To cUB
Rng.Offset(i - 1, j - 1).Value = Arr(i, j)
Next
Next
End Sub
はい、Excelの範囲を1回の割り当てで2D配列に割り当てることができます。C ++ / CLIでは、次のようになります。
cli :: array <Object ^、2> ^ arrData = safe_cast <cli :: array <Object ^、2> ^>(rg-> Value [Excel :: XlRangeValueDataType :: xlRangeValueDefault]); C#またはVisual Basicでは、かなり単純に見えます(たとえば、https: //www.automateexcel.com/vba/assign-range-to-array/を参照してください。ドットネットでは、オブジェクトがバリアントデータの役割を果たしています。タイプ)。これは2次元配列である必要があり、返される配列には1ベースのインデックスがあり、0ベースのインデックスはないことに注意してください。
大規模なデータセットの場合、この方法はループよりもはるかに高速です。ループにより、多くのCOMオブジェクトが生成されます。2つの方法を33000行のExcel範囲で比較したところ、アレイへのデータのインポートはほぼ瞬時に行われましたが、ループを使用すると非常に時間がかかり、CPUが過熱しました。
範囲をループする1つの方法は、CellsプロパティでFor...Nextループを使用することです。Cellsプロパティを使用すると、セルのインデックス番号をループカウンター(または他の変数や式)に置き換えることができます。次の例では、変数counterが行インデックスの代わりに使用されます。プロシージャは範囲C1:C20をループし、絶対値が0.01未満の任意の数値を0(ゼロ)に設定します。
Sub RoundToZero1()
For Counter = 1 To 20
Set curCell = Worksheets("Sheet1").Cells(Counter, 3)
If Abs(curCell.Value) < 0.01 Then curCell.Value = 0
Next Counter
End Sub