4

Excel Range( "G2:AA1000")を2D配列に割り当てる方法を教えてください。可能であれば、その2D配列に対して何らかの操作を実行した後、その2D配列を同じ範囲に戻す方法は?2D配列に範囲を割り当てた後、その2D行列から各行をどのように識別しますか?

ありがとう、

4

4 に答える 4

4

配列を使用して領域に変更を加え、同じ場所または別の場所に書き出す簡単な方法があります。

このサンプルコードは、配列を使用して、ある領域から別の領域にデータをコピーします。

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つのセルのみが配置されます。
  • より大きな領域を指定すると、#N / Aは配列要素でカバーされるスペースにない領域を埋めるため、Range("A1:A3")=testdataA1とA2は配列からのデータで埋められますが、A3は#N/Aになります。

サンプルプログラムの結果:
注:A1:B13は元のデータであり、後続のデータとともにコピーされます。range(??)=testdata 上記のコードの結果

于 2012-12-27T20:13:31.953 に答える
1

これは、ワークシートから一定範囲のデータを読み取り、配列を操作してから、同じワークシートに書き戻すという、うまくいった例です。

    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
于 2012-12-26T05:21:13.757 に答える
1

はい、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が過熱しました。

于 2021-02-08T19:45:13.640 に答える
0

範囲をループする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
于 2012-12-26T03:48:14.923 に答える