1

コード

    height = objExcel1.Application.WorksheetFunction.CountA(ob3.Columns(1))
    'MsgBox(height)
    ReDim dataArray(height - 2, 0) ' -1 for 0 index, -1 for the first row as header row, excluded
    str = ""
    dataArray = ob3.Range(ob3.Cells(2, 1),ob3.Cells(height, 1)).Value
    Set d = CreateObject("scripting.dictionary")
    'MsgBox(LBound(DeletArr) & ":" & UBound(DeletArr))
    For i = LBound(DeletArr) To UBound(DeletArr)
        If Not d.exists(DeletArr(i)) Then
            d(DeletArr(i)) =  0
        End If
    Next
    MsgBox(LBound(dataArray,1) & ":" & UBound(dataArray,1))
    For i = LBound(dataArray, 1)  To UBound(dataArray, 1) - 1

        If d.exists(dataArray(i, 1)) Then

            str = str & (i+1) & ":" & (i+1) & ","
            'ob3.Range(i & ":" & i).Delete

        Else
            'found = False
        End If

    Next

VBScript配列は0ベースです。しかし、なぜLBound(dataArray,1)開始添え字を与えるのは1なぜ0ではないのですか?Ubound数字を与えています-私は少し混乱していますが、それは配列の最後の添え字ですか、それともサイズですか?

ありがとう、

4

1 に答える 1

5

既定では、VBA 配列の添え字/インデックスは 0 から始まり (これは配列の下限と呼ばれます)、Dim ステートメントで指定した数まで実行されます (これは配列の上限と呼ばれます)。配列のインデックス番号を 1 から開始したい場合は、モジュールの先頭に次のステートメントを含めます。

Option Base 1

ここに画像の説明を入力

ただしRange、メソッドを使用してオブジェクトによって配列が設定されると、デフォルトモードTransposeであっても、配列の下限が 1 に設定されます。Zero baedしたがって、配列は1ベースになります。

たとえば、メソッドを使用して次のデータが追加されTransposeます。

Array(1) = "Hola"
Array(2) = "Bonjour"
Array(3) = "Hello"
Array(4) = "Wei"

良いことは、この配列UBoundが要素の数 (4) つまり UBound を教えてくれることです。ゼロ ベースの場合とは異なり、要素数 = Ubound + 1 です。

UBound(Array) --> 4
LBound(Array) --> 1

現在の 1 ベースのシナリオでは、Ubound は要素の総数を指します。したがって、このような場合、コードを修正して、配列のプロパティ内のデータを追跡しLBoundUBoundデータの損失を回避する必要があります。

ちなみに、追加しても、メソッドOption Base 0に基づいて配列が1に言及されるのを止めません。Transposeこれは私の最初のコメントを無効にします。

于 2012-12-25T20:02:02.650 に答える