【问题标题】:vba Excel 2010: convert string array into int arrayvba Excel 2010:将字符串数组转换为整数数组
【发布时间】:2013-08-06 22:10:17
【问题描述】:
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

有什么方法可以让它没有循环,就在 1 行? 这是针对 Excel 2010 的。

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

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

【问题讨论】:

  • 不知道能不能不用循环...不过每个条目都可以用cInt()函数转换...顺便说一句,为什么要“不用循环”呢?跨度>
  • 性能对我来说很重要。我相信如果有一个特殊的功能,它会使其更快。
  • 如果您在代码的其他部分使用数组条目,则可以选择仅在使用它们时转换它们。示例:Dim x as integer: x = cInt(myarray(0)) * 5
  • 无论转换循环有多慢,我向您保证,将数据输入/输出工作表会慢 4 倍。那为什么还要麻烦呢?
  • @rdhs 我做了一些测试,你是对的:进纸和后退的速度要慢 2-3 倍。可能没有什么比循环更好的了(除非有足够的勇气去搞砸XLL 函数)。

标签: arrays string vba excel int


【解决方案1】:

遍历数组并逐一转换值已经足够快了。这是一段代码,用于显示转换循环相对于执行单元 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 个条目的数组,其中读取和写入工作表比将每个条目从 Variant/String 转换为 Long 慢大约 4 倍:

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 倍)才能完成。

【讨论】:

    猜你喜欢
    • 2019-04-21
    • 2020-05-30
    • 1970-01-01
    相关资源
    最近更新 更多