代码之家  ›  专栏  ›  技术社区  ›  Miles Zoltak

在VBA中声明和初始化动态图纸数组

  •  0
  • Miles Zoltak  · 技术社区  · 7 年前

    我正在尝试在Excel中创建一组工作表。每个工作表都有几个列和行,需要相应地进行搜索、比较和填充。创建图纸阵列时遇到问题。我一直在第27行得到一个下标超出范围的错误。如果我注释掉前面的那些,这会发生在所有4张纸上。

    Sub news()
    
        'activate sheets
        Sheet1.Activate
        Sheet2.Activate
        Sheet3.Activate
        Sheet4.Activate
    
        'array of letters for the columns
        Dim alpha(1 To 13) As String
        alpha(1) = "a"
        alpha(2) = "b"
        alpha(3) = "c"
        alpha(4) = "d"
        alpha(5) = "e"
        alpha(6) = "f"
        alpha(7) = "g"
        alpha(8) = "h"
        alpha(9) = "i"
        alpha(10) = "j"
        alpha(11) = "k"
        alpha(12) = "l"
        alpha(13) = "m"
    
        'array of sheets
        Dim shets() As Sheets, sheetCount As Integer
        Set shets(1) = Sheets("Sheet1")
        Set shets(2) = Sheets("Sheet2")
        Set shets(3) = Sheets("Sheet3")
        Set shets(4) = Sheets("Sheet4")
    
        'used to make sure i am not shifted and photos goes to photos, videos to videos, and compliance to compliance
        Dim newShift As Integer
        newShift = 7
    
        'for loop counter variables
        Dim i, j, k As Integer
    
        'goes through the sheets
        For i = 2 To sheetCount
            'goes through the columns
            For j = 3 To 7 Step 2
                'goes through the rows
                For k = 2 To ThisWorksheet.Rows.count
                    If (Sheets(shets(i - 1)).Cells(k, alpha(j)) = Sheets(shets(i)).Cells(k, alpha(j))) Then
                        Sheets(shets(i)).Cells(k, alpha(j + newShift)) = False
                    ElseIf (Sheets(shets(i - 1)).Cells(k, alpha(j)) < Sheets(shets(i)).Cells(k, alpha(j))) Then
                        Sheets(shets(i)).Cells(k, alpha(j + newShift)) = True
                    Else
                        Sheets(shets(i)).Cells(k, alpha(j + newShift)) = "ERROR"
                    End If
                Next
                newShift = newShift - 1
            Next
        Next
    
    End Sub
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Wolfie Radu Stefan    7 年前

    在你上面发布的内容中有相当多的可疑代码。我已经阅读并重新编写了这些冒犯的行,并在下面的代码中包含了解释原因的注释。

    这不仅可以修复“超出范围”的错误(因为您没有声明数组的大小),还可以修复您尚未遇到的其他错误(没有声明变量值、在每个工作表中的每一行循环、没有正确引用工作表对象……)。

    Sub news()
        ' No need to activate sheets
        ' No need for array of letters for the columns: '.Cells(row,col)' can take a number for 'col'
        ' Integers replaced by Longs, no real incentive to use Integer type and Long can be larger
    
        ' Array of sheets: use WorkSheet objects, not a Sheets object 
        Dim shets() As WorkSheet
        ' Remember to assign a value to sheetCount
        Dim sheetCount As Long: sheetCount = 4
        ' Must declare the size of your array, this method keeps it generic
        ' could have used 'Dim shets(1 To 4) As WorkSheet'
        Dim n As Long
        ReDim shets(1 To sheetCount)
        ' Keeping with generic theme, loop over shets to define sheets, makes expanding easier
        For n = 1 To sheetCount
            ' Fully qualify sheets by using workbook object
            Set shets(n) = ThisWorkbook.Sheets("Sheet" & n)
        Next n
        ' Used to make sure photos goes to photos, videos to videos, and compliance to compliance
        Dim newShift As Long: newShift = 7
        ' For loop counter variables: Must specify EACH type, 'Dim i, j, k As Long' declares i and j as Variants
        Dim i As Long, j As Long, k As Long
        ' Go through the sheets
        For i = 2 To sheetCount
            ' Go through the columns
            For j = 3 To 7 Step 2
                ' Go through the rows. Don't just use '.Rows' object as that includes all unused rows in sheet!
                ' Also using one of the sheet objects, as 'ThisWorksheet' doesn't exist
                For k = 2 To shets(i).UsedRange.Rows.Count
                    ' Don't access sheet objects using 'Sheets(shets(..))', simply use 'shets(..)'
                    If shets(i - 1).Cells(k, j) = shets(i).Cells(k, j) Then
                        shets(i).Cells(k, j + newShift).Value = False
                    ElseIf shets(i - 1).Cells(k, j) < shets(i).Cells(k, j) Then
                        shets(i).Cells(k, j + newShift).Value = True
                    Else
                        shets(i).Cells(k, j + newShift).Value = "ERROR"
                    End If
                Next
                newShift = newShift - 1
            Next
        Next
    End Sub