【问题标题】:Excel vba two dimensional array loop stopsExcel vba二维数组循环停止
【发布时间】:2017-06-04 06:10:00
【问题描述】:

作为较长代码的一部分,我试图根据二维字母分配数组为每一行分配特定的员工姓名。 LastRow 已被声明并正确拾取,但无论如何循环在 27 次循环后仍会停止。如何纠正这种情况以继续到 LastRow?这是我第一次使用多维数组,所以我非常感谢任何帮助。

Private Sub Assignments()
    Dim Alpha As Variant, Staff As Variant
    Dim i As Integer
    Dim LastRow As Long
    Dim alpha_Assignment(1 To 26, 1 To 2) As Variant

    'define last row
    LastRow = Cells(Rows.Count, "A").End(xlUp).Row

    'set alpha column to array and set staff to array
    Alpha = Range("AB2:AB" & LastRow).Value
    Staff = Range("AC2:AC" & LastRow).Value

    'Array Values to Alpha and Assigned staff
    alpha_Assignment(1, 1) = "A"
    alpha_Assignment(1, 2) = "Staff 1"
    alpha_Assignment(2, 1) = "B"
    alpha_Assignment(2, 2) = "Staff 2"
    alpha_Assignment(3, 1) = "C"
    alpha_Assignment(3, 2) = "Staff 3"
    'and so on for all 26 letters in alphabet then loop statement and paste into worksheet.

    For i = 1 To UBound(alpha_Assignment)
        If Alpha(i, 1) = alpha_Assignment(i, 1) Then
            Staff(i, 1) = alpha_Assignment(i, 2)
        ElseIf Alpha(i, 1) <> alpha_Assignment(i, 1) Then
            Staff(i, 1) = "Staff 1"
        End If
    Next i

    Range("AC2").Resize(UBound(Staff, 1), 1).Value = Staff
End Sub

【问题讨论】:

    标签: arrays excel vba loops multidimensional-array


    【解决方案1】:

    这种“耦合”工作似乎需要Dictionary 对象

    如下:

    Option Explicit
    
    Private Sub Assignments()
        Dim Alpha As Variant, Staff As Variant
        Dim i As Integer
        Dim LastRow As Long
    
        'define last row
        LastRow = Cells(Rows.count, "A").End(xlUp).Row
    
        'set alpha column to array and set staff to array
        Alpha = Range("AB2:AB" & LastRow).Value
        Staff = Range("AC2:AC" & LastRow).Value
    
        Dim alphaDict As Scripting.Dictionary
    
        Set alphaDict = New Scripting.Dictionary
    
        'dictionary with key=Alpha and Item=Assigned staff
        With alphaDict
            .Add "A", "Staff 1"
            .Add "B", "Staff 2"
            .Add "C", "Staff 3"
            .Add "D", "Staff 4"
            .Add "E", "Staff 5"
            .Add "F", "Staff 6"
            'and so on for all 26 letters in alphabet
        End With
    
        For i = 1 To UBound(Alpha)
            If alphaDict.Exists(Alpha(i, 1)) Then Staff(i, 1) = alphaDict(Alpha(i, 1))
        Next i
    
        Range("AC2").Resize(UBound(Staff, 1), 1).Value = Staff
    End Sub
    

    要使用 Dictionary 对象,您必须向项目添加必要的引用,如下所示

    • 点击工具->参考

    • 向下滚动列表框到“Microsoft Scripting Runtime”并勾选它的复选标记

    • 点击“确定”

    【讨论】:

    • 好的,我已启用脚本运行时,但收到运行时错误 438 对象不支持此属性或方法。我以前从未尝试过字典,所以对这个过程真的很陌生。
    • 抱歉,这是我的错字:AddItem -> Add。我相应地编辑了答案
    • 太棒了!有了这个更正,这是完美的工作!我一定要学习更多关于使用字典对象的知识。非常感谢!
    【解决方案2】:

    我会说你需要Redim 声明:

    'define last row
    LastRow = Cells(Rows.Count, "A").End(xlUp).Row
    
    ReDim alpha_Assignment(1 To LastRow, 1 To 2) As Variant
    
    ' then loop
    For i = LBound(alpha_Assignment) To UBound(alpha_Assignment)
        ' ...
    Next i
    

    【讨论】:

      【解决方案3】:

      您的循环上限在此处定义

      For i = 1 To UBound(alpha_Assignment)
      

      如果你想让它循环到 lastrow 然后调整它到

      For i = 1 To LastRow 
      

      【讨论】:

      • 谢谢!这种调整是有意义的,它现在仍在继续,但一旦循环到达第 27 个循环,就会出现错误 9“下标超出范围”。我还缺少另一件作品吗?
      【解决方案4】:

      您的 for...next 将从 1 变为 alpha_assignment 的第一个元素的上限,基于 Dim 为 26。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多