【问题标题】:vba filling a dynamic array with stringsvba用字符串填充动态数组
【发布时间】:2015-07-24 07:42:29
【问题描述】:

嘿,我是 vba 新手,我已经尝试寻找我的问题的答案。 我想用可以在表中更改的特定数组填充动态数组。为此,我创建了以下代码:

Sub ZellenArrayReader()
    Dim boom() As Variant
    Dim rowsboom As Integer
    Dim sh As Variant

    sh = "TAB1"
    Worksheets(sh).Range("A1").Select
    rowsboom = Selection.CurrentRegion.Rows.Count - 2

    ReDim boom(0 To rowsboom)

    For i = LBound(boom) To i = UBound(boom)
        boom(i) = Worksheets(sh).Cells(i + 2, 1)
    Next i

    Cells(10, 5).FormulaR1C1 = boom(0)
    Cells(10, 1).FormulaR1C1 = boom(1)

End Sub

for 部分是 on e 不能正常工作。即使数组的 Upperbound 是 4 或 5,它也只运行一个代码。

【问题讨论】:

    标签: arrays vba excel for-loop


    【解决方案1】:

    您需要将 For ... Next 循环更改为:

    For i = LBound(boom) To UBound(boom)
        boom(i) = Worksheets(sh).Cells(i+2, 1)
    Next i
    

    【讨论】:

    • 天哪,真是个愚蠢的错误,非常感谢,现在可以了:D
    【解决方案2】:

    小修改,效果很好。

    Private Sub ZellenArrayReader()
    
        Dim boom() As Variant
        Dim rowsboom As Integer
        Dim sh As String
    
        sh = "TAB1"
    
        Sheets(sh).Range("A1").Select
    
        rowsboom = Selection.CurrentRegion.Rows.Count - 2
    
        ReDim boom(0 To rowsboom)
    
        For i = 0 To UBound(boom) Step 1
            boom(i) = Sheets(sh).Cells(i + 2, 1)
        Next i
    
        Cells(10, 5).FormulaR1C1 = boom(0)
        Cells(10, 1).FormulaR1C1 = boom(1)
    
    End Sub
    

    【讨论】:

    • 非常感谢,我对 Java 的了解如此之多,以至于发生了这个错误,非常感谢:D
    • 如果可行,请接受该问题的答案。不客气..!
    【解决方案3】:

    正如其他人所回答的那样,您的 for 循环的 i=UBound(boom) 部分导致了问题。如果繁荣有 1 个元素,那将返回 True(i=0 和 UBound(boom)=0),它会像 For i = LBound(boom) to -1 (当转换为 Long 时 True 为 -1)。那将循环零次。在您的情况下,您至少有两个元素,因此 i=UBound(boom) 返回 False。这就像 For i = LBound(boom) to 0 这就是为什么它只执行一次。

    Range.Value 属性返回一个二维数组,通常比遍历数组并用单元格中的值填充它要快。通过Range.Value 分配的数组的下限是1,而不是零。这是没有循环的代码的重写。

    Sub ZellenArrayReader()
    
        Dim vBoom As Variant
        Dim sh As Worksheet
        Dim rCurrReg As Range
    
        Set sh = ThisWorkbook.Worksheets("TAB1")
    
        Set rCurrReg = sh.Range("A1").CurrentRegion
        vBoom = rCurrReg.Resize(rCurrReg.Rows.Count - 2).Value
    
        sh.Cells(10, 5).Value = vBoom(1, 1)
        sh.Cells(10, 1).Value = vBoom(2, 1)
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2019-04-11
      • 1970-01-01
      • 2017-05-20
      • 2012-02-09
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多