vba Excel 2010: convert string array into int array

后端 未结 1 1203
终归单人心
终归单人心 2020-12-11 10:48
Dim myarray(2) as Variant

myarray(0)=\"3\"
myarray(1)=\"4\"
myarray(2)=\"5\"
myarray(3)=\"9\"

I want it to become

myarray(0)=3
my         


        
相关标签:
1条回答
  • 2020-12-11 11:36

    Looping through the array and converting the values one-by-one is fast enough. Here's a snippet of code to show how fast a conversion loop is relative to performing your cell I/O:

    Private Const I_MAX = 10000
    Private Const J_MAX = 200
    Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
    
    Sub ticktest()
        Dim ticks As Long, i As Long, j As Long
        Dim v() As Variant
        Dim a() As Long 'VBA integers are internally stored as longs
        Dim r As Range
    
        Set r = [A1].Resize(I_MAX, J_MAX)
        ReDim a(1 To I_MAX, 1 To J_MAX)
    
        ticks = GetTickCount
        v = r
        Debug.Print "Read from range: " & GetTickCount - ticks
    
        Debug.Print "Type of values in v(): " & TypeName(v(1, 1))
    
        ticks = GetTickCount
        For i = 1 To I_MAX
            For j = 1 To J_MAX
                a(i, j) = v(i, j)
            Next j
        Next i
        Debug.Print "Copy with cast to Long: " & GetTickCount - ticks
    
        ticks = GetTickCount
        For i = 1 To I_MAX
            For j = 1 To J_MAX
                v(i, j) = CLng(v(i, j))
            Next j
        Next i
        Debug.Print "In-place cast to Variant/Long: " & GetTickCount - ticks
    
        ticks = GetTickCount
        r = a
        Debug.Print "Write from long array: " & GetTickCount - ticks
    
        ticks = GetTickCount
        r = v
        Debug.Print "Write from variant array: " & GetTickCount - ticks
    
        For i = 1 To I_MAX
            For j = 1 To J_MAX
                v(i, j) = CStr(v(i, j))
            Next j
        Next i
        r = v
    End Sub
    

    With these values for I_MAX and J_MAX we get a 2,000,000–entry array, where reading from and writing to the worksheet is about 4x slower than converting each entry from a Variant/String to a Long:

    Read from range: 749
    Type of values in v(): String
    Copy with cast to Long: 546
    In-place cast to Variant/Long: 842
    Write from long array: 921
    Write from variant array: 1248
    
    Read from range: 749
    Type of values in v(): String
    Copy with cast to Long: 546
    In-place cast to Variant/Long: 827
    Write from long array: 905
    Write from variant array: 1248
    
    Read from range: 749
    Type of values in v(): String
    Copy with cast to Long: 531
    In-place cast to Variant/Long: 826
    Write from long array: 905
    Write from variant array: 1279
    

    So there's no real need to avoid loops, with one caveat: If you do the cell I/O in a loop, performance becomes abysmal. Here, for example, a loop of r(i, j) = v(i, j) takes a full 100 seconds (that's 100,000 ticks, or 2,000x the conversion loop time) to complete.

    0 讨论(0)
提交回复
热议问题