arrays - VBA Excel 2010 : convert string array into int array

标签 arrays string vba excel int

Dim myarray(2) as Variant

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

我希望它成为

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

有什么方法可以让它没有循环,只需一行? 这是针对 Excel 2010 的。

我想要这样的东西,但它不起作用:

intArray = Array.ConvertAll(stringArray , Function(str) Int32.Parse(str))

最佳答案

循环遍历数组并逐一转换值已经足够快了。下面的代码片段显示了转换循环相对于执行单元 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

使用这些 I_MAXJ_MAX 值,我们得到一个包含 2,000,000 个条目的数组,其中读取和写入工作表的速度比从工作表转换每个条目的速度慢约 4 倍。 Variant/StringLong:

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

因此,没有真正需要避免循环,但有一点需要注意:如果您在循环中执行单元 I/O,性能会变得很糟糕。例如,r(i, j) = v(i, j) 的循环需要完整的 100 秒(即 100,000 个刻度,或 2,000 倍的转换)循环时间)来完成。

关于arrays - VBA Excel 2010 : convert string array into int array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18091413/

相关文章:

ios - 我们可以将 NSPointerArray 转换为 Array 吗?

arrays - 如何将元素添加到 slice 反射?

excel - 当 Evaluate Match 找不到它的条件时显示错误

C - 拆分字符串

swift - 如何在 Swift 中将字符串转换为字典类型?

excel - 灾难性故障 EXCEL VBA - 错误 '-2147418113 (8000ffff)'

csv - 将分隔文件 (.csv) 中的行导入 MS-Access 表

javascript - 谁能帮我为这段代码制作一个for循环?

python - 构建 numpy 数组的列 - 为什么第一列仍然全是零?

string - 在 F# 中将字符串相乘