6

VBA でいくつかの配列を処理するのに問題があります。具体的には、既存のサブルーチン/メソッドを効率的に使用してさまざまなサイズ/次元の配列を操作するのに問題があります。

配列は COM オブジェクトから取得され、どのルーチンが配列を返すかに基づいて、予測可能な一貫した構造で到着しますが、すべての関数が同じ構造でデータを返すのに問題がありました

そのため、さまざまな構造を扱っています。2D 配列の場合もあれば、各配列項目がバリアント/配列である 1D 配列の場合もあります。

たとえば、 のような 2D 構造を期待する既存の関数がある場合、arr(0,0)これを変更して、各項目が Variant 型 ( のような構造) である 1D 配列も受け入れるようにする必要がありますarr(0)(0)

私が現在していること

エラーを無効にし、2 番目の次元の Ubound をテストします。1D 配列の場合はエラーが発生することがわかっています。次に、配列の構造に基づいて、少し異なる反復を行うことができます。

  • 避けられるなら使うのは嫌On Error Resume Nextだけど、この場合はそれが一番効率が良さそう。

  • 私も依存するのは好きではありませんExcel.Application.Transposeが、これを PowerPoint でネイティブに実行できる方法が見つかりません。

例:

Function GetSmallFromBar(counts As Variant, banner As Variant, categories As Variant) As Variant
Dim small As Object
Dim arrSizeErr As Variant
Dim i As Long
Set small = CreateObject("Scripting.Dictionary")

On Error Resume Next
arrSizeErr = UBound(counts, 2)
arrSizeErr = (Err.Number <> 0)
Err.Clear
On Error GoTo 0

'Array is structured like arr(0)(0) instead of arr(0,1)
If arrSizeErr Then
    counts = Excel.Application.Transpose(counts)
    ReDim Preserve counts(0 To UBound(counts) - 1)
    'Modify for unique array structure
    For i = LBound(categories) To UBound(categories)
        If counts(i) < 100 Then
            small(i) = categories(i)
        End If
    Next
    GoTo EarlyExit
End If

'This works for the expected array structure, arr(0,0)
For i = LBound(categories) To UBound(categories)
    If counts(i, 0) < 100 Then
        small(i) = categories(i)
    End If
Next
EarlyExit:
GetSmallFromBar = small.Items()

Set small = Nothing
End Function

注: 0 ベースの配列を使用する必要があるため、配列を再調整します。

私のコードには、このような問題に遭遇する場所がおそらく 6 か所あり、それぞれが同様の方法に依存していますが、おそらく同一ではない方法です。

私は自分のコードを他の場所で修正しても問題ありません。これが関数として標準化し、これが潜在的なエラーである他のモジュールから呼び出すことができる良いアプローチであるかどうか、またはこれをより効率的に行う別の方法があるかどうか疑問に思っています.

追加情報とスクリーンショット

私は 1 次元および 2 次元配列だけを扱っています。しかし、各項目がVariant型でもある 1D 配列を取得することがあります。2次元配列で使用する関数とメソッドの一部を変更して、「配列の配列」構造で作業できることを望んでいるため、これでうまくいきます。

予想される 2D 配列

ここに画像の説明を入力

問題のあるバリアントの配列

ここに画像の説明を入力

4

1 に答える 1