1

CODE

    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 Array is 0 based. But why LBound(dataArray,1) is giving starting subscript is 1,why not 0? Ubound is giving the number - against which i am bit confused is it the last subscript of the array or the size?

Thanks,

4

1 回答 1

5

By default, the subscripts/indices of VBA arrays start at 0 (this is called the lower bound of the array) and run up to the number you specify in the Dim statement (this is called the upper bound of the array). If you would prefer your array index numbers to start at 1, include the following statement at the top of the module.

Option Base 1

enter image description here

However when an array is populated by Range object using the Transpose method, the array Lower bound set to 1 even you are on default Zero baed mode. So array becomes 1 based.

e.g. the following data is added using Transpose method.

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

Good thing is that this array UBound tells you number of elements (4) which = UBound. Unlike if it was zero based, then number of elements = Ubound + 1.

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

In current 1-based scenario, the Ubound refers to the total number of elements. So in such cases you need to amend your code to track data within the array's LBound, UBound properties to avoid data loss.

And by the way, by adding Option Base 0 doesn't stop array being dimentioned to 1 based by Transpose method. Which invalids my first comment.

于 2012-12-25T20:02:02.650 回答