0

VBAで次のことを行う方法はありますか?

多次元配列を初期化し、一連の数値で埋めます。

 1  2  3  4  5 
 6  7  8  9 10
11 12 13 14 15
16 17 18 19 20

次に、いくつかの特定の列を削除します。列1、2、4。したがって、最終結果は3番目と5番目の列になります。

最後に、最終出力を通常の1次元配列に変換するにはどうすればよいですか。

4

3 に答える 3

3

これらの列がExcelシートにあると仮定します。これらの列にこれらのデータしかない場合は、必要な列を簡単に削除できます:D次に、希望する2つの列が作成されます。あなたが最後に本当に必要なものを知らなくても、これは最良の盲目的な推測です。

たとえば、列はBからFで始まります。

Columns("B:B").Delete Shift:=xlToLeft
Columns("C:C").Delete Shift:=xlToLeft
Columns("D:D").Delete Shift:=xlToLeft

同じロジックを使用して配列を処理できます。

  • 配列をシートに転置します。
  • 列を削除します。
  • 次に、残りの2つの列を配列に転置します。

しかし、最後の2つの列をシートに入れずに、どうしますか?とても好奇心が強い。だから、あなたが必要なものを確認してください。そうすれば、ここの誰もがあなたを助けることができます。

OPのコメントに従って編集:

さまざまな方法で配列を操作するこの投稿と記事をご覧ください。

次に、VBAの例の2D配列にデータを入力するには、次のことを確認してください。

Dim i As Integer, j As Integer
Dim array2D As Variant, newArray2D as Variant
'-- 0 indexed based array with 2 rows 3 columns
ReDim array2D(0 To 1, 0 To 2)

For i = LBound(array2D, 1) To UBound(array2D, 1)
    For j = LBound(array2D, 1) To UBound(array2D, 1)
        array2D(i, j) = i + j
    Next j
Next i

'--to delete the fastest is to use the above logic (worksheet)
'-- here you don't need to declare/redimentioned the array
'-- as transpose will do it with a 1 indexed based array

newArray2D = WorksheetFunction.Transpose(Sheets(2).Range("B2:D").Value)
于 2013-01-15T16:48:20.637 に答える
1

配列から行または列を削除するには、保持するデータを一時配列に転送するか、配列の値を上書きする必要があります。

寸法を変換するには、ループが必要になります。

多くの関数と配列の例はここにあります

于 2013-01-15T17:08:12.727 に答える
0

以下は、ループ/直接コピーを介して、問題のタスクを完全に実行するサンプルコードです。つまり、教育的なものではありませんが、Application.WorksheetFunction.Indexを使用したVBAExcelの「スライス」関数が実際にこのタスクに役立たないことも示しています。それが他の方法で役立つかもしれないとしても:

Public Sub Answer()

    Dim i As Integer, j As Integer

    ' arrA contains the initial 4x5 multidimensional array
    Dim arrA(1 To 4, 1 To 5) As Integer
    For i = 1 To 4
        For j = 1 To 5
            arrA(i, j) = (i - 1) * 5 + j
        Next j
    Next i

    ' arrBv1 and v2 contain the 2x5 subset, just columns 3 and 5
    ' arrBv1 is obtained by direct copy
    Dim arrBv1(1 To 4, 1 To 2) As Variant
    For i = 1 To 4
        arrBv1(i, 1) = arrA(i, 3)
        arrBv1(i, 2) = arrA(i, 5)
    Next i

    ' arrBv2 is obtained by using Excel's "slicing" capability
    Dim arrBv2(1 To 4, 1 To 2) As Integer

    Dim slices(1 To 2) As Variant
    slices(1) = Application.WorksheetFunction.Index(arrA, 0, 3)
    slices(2) = Application.WorksheetFunction.Index(arrA, 0, 5)

    ' but because the slices are actually each 4x1 multidimensional
    ' array, a second loop is required to obtain a data structure
    ' actually equivalent to arrBv1, making this "shortcut" no
    ' shorter for producing a 4x2 array
    For i = 1 To 4
        arrBv2(i, 1) = slices(1)(i, 1)
        arrBv2(i, 2) = slices(2)(i, 1)
    Next i

    ' although arrBv1 and v2 are equivalent, as MsgBox does not appear
    For i = 1 To 4
        For j = 1 To 2
            If arrBv1(i, j) <> arrBv2(i, j) Then
                MsgBox ("equivalence failure with 4x2 arrays")
            End If
        Next j
    Next i

    ' arrCv1 is the 1x8 array obtained by direct copy from the 4x2 array
    Dim arrCv1(1 To 8) As Integer

    For i = 1 To 4
        arrCv1(i) = arrBv1(i, 1)
        arrCv1(i + 4) = arrBv1(i, 2)
    Next i

    ' arrCv2 is the one-dimensional array obtained from the slices, which
    ' does not lead to an additional step, but is not shorter
    ' than just using arrBv1 as immediately above or

    Dim arrCv2(1 To 8) As Integer

    For i = 1 To 4
        arrCv2(i) = slices(1)(i, 1)
        arrCv2(i + 4) = slices(2)(i, 1)
    Next i

    ' arrCv3 is the 1x8 array obtained from the original 4x5 array,
    ' shorter still

    Dim arrCv3(1 To 8) As Integer

    For i = 1 To 4
        arrCv3(i) = arrA(i, 3)
        arrCv3(i + 4) = arrA(i, 5)
    Next i

    ' and arrCv1, v2 and v3 are again all equivalent
    For i = 1 To 8
        If arrCv1(i) <> arrCv2(i) Or arrCv1(i) <> arrCv3(i) Then
            MsgBox ("equivalence failure with one-dimensional array")
        End If
    Next i

    ' so, in sum, nothing.

End Sub
于 2013-10-07T17:14:49.740 に答える