【问题标题】:Copy a range of cells, defined on execution, to an array将执行时定义的一系列单元格复制到数组
【发布时间】:2019-02-01 20:19:13
【问题描述】:

我正在尝试从两个工作簿的一系列行中复制一系列单元格。此信息用于按 ID 比较两个工作簿行的内容。

我尝试的第一个解决方案涉及逐个单元格的“二进制”比较。这适用于行数很少的工作表:

For i = 2 To LastSheetRow
    Set FoundCell = Workbooks(WorkbookA).Sheets(SheetNameFromArray).Range("A:A").Find(What:=Workbooks(WorkbookB).Sheets(SheetNameFromArray).Cells(i, 1).Value)
    If Not FoundCell Is Nothing Then

        aCellValues(0) = 1
        Workbooks(UserWorkbook).Sheets(SheetNameFromArray).Cells(i, LastSheetColumn + 1).Value = FoundCell.Row
        For j = 2 To LastSheetColumn
            Select Case Workbooks(WorkbookB).Sheets(SheetNameFromArray).Cells(i, j).Value
            Case Is = Workbooks(WorkbookA).Sheets(SheetNameFromArray).Cells(FoundCell.Row, j).Value
                aCellValues(j - 1) = 1

            Case Else
                aCellValues(j - 1) = 0
            End Select
        Next j
    Else
    End If
Next i

我想将两个工作簿中每一行的内容存储在一个数组中以进行比较,因为我相信这是一个更快的解决方案。

在定义范围进行比较后,我在将单元格复制到数组时遇到了以下错误:

子索引超出区间(错误 9)

这会产生错误:

Dim aWorkbookBInfo() As Variant, aWorkbookAInfo() As Variant, rngWorkbookBToCompare As Range, rngWorkbookAToCompare As Range
Dim SumToCheck As Integer, FoundCell As Range, aCellValues() As Integer   
ReDim aCellValues(LastSheetColumn - 1)
ReDim aWorkbookBInfo(LastSheetColumn - 1)
ReDim aWorkbookAInfo(LastSheetColumn - 1)
For i = 2 To LastSheetRow
    Set FoundCell = Workbooks(WorkbookA).Sheets(SheetNameFromArray).Range("A:A").Find(What:=Workbooks(WorkbookB).Sheets(SheetNameFromArray).Cells(i, 1).Value)
    If Not FoundCell Is Nothing Then        
        aCellValues(0) = 1
        Workbooks(WorkbookB).Sheets(SheetNameFromArray).Cells(i, LastSheetColumn + 1).Value = FoundCell.Row
        With Workbooks(WorkbookB).Sheets(SheetNameFromArray)
            Set rngWorkbookBToCompare = Range(Cells(i, 2), Cells(i, LastSheetColumn))
        End With
        With Workbooks(WorkbookA).Sheets(SheetNameFromArray)
            Set rngWorkbookAToCompare = Range(Cells(FoundCell.Row, 2), Cells(FoundCell.Row, LastSheetColumn))
        End With
        aWorkbookBInfo = rngWorkbookBToCompare
        aWorkbookAInfo = rngWorkbookAToCompare
        For j = 1 To LastSheetColumn - 1
            If aWorkbookBInfo(j).Value = aWorkbookAInfo(j).Value Then                
                aCellValues(j) = 1                
            Else
                aCellValues(j) = 0
            End If
        Next j
    Else
    End If
Next i

【问题讨论】:

    标签: arrays excel vba copy range


    【解决方案1】:

    完成修订:

    范围数组赋值在这些行中生成一个二维数组:

    aWorkbookBInfo = rngWorkbookBToCompare
    aWorkbookAInfo = rngWorkbookAToCompare
    

    无论您在代码开头如何定义和标注它们,都会发生这种情况。由于它们是二维数组,因此它们必须被寻址为aWorkbookBInfo(a, b),其中a 是一行,b 是一列。

    与范围不同,可以引用任何范围中的第一个单元格,您必须在尝试引用数组项之前完全寻址数组。所以,虽然rngWorkbookBToCompare(j).Value 有效,但aWorkbookBInfo(j).Value 无效。此外,Value 不一定是 Excel 放入数组中的任何对象的属性。如果您想要j 列的第一个单元格,请尝试添加行并取消对 Value 属性的引用,如:aWorkbookBInfo(1, j)

    【讨论】:

    • 既然你提到了它,我发现我没有添加关于我如何在原始帖子中声明它们的信息。我现在添加它。
    • 我尝试在两行的开头添加“set”,它给出了以下编译错误:“无法分配给数组”。
    • 我已经完全修改了我的答案。
    • 应用您提出的更改后,它现在似乎可以工作了。另外,很好地解释了原因。谢谢!
    • 我意识到,对于大型数据集,在某些时候,当读取数组时,它们会返回空值或两个工作簿工作表的某些名称,而不是单元格值。我相信这与我如何编写“with”来分配范围“rngWorkbookBToCompare”和“rngWorkbookAToCompare”的值有关。我不太确定我是否在参考中遗漏了任何可能导致错误的元素;或者如果最好使用另一种方法来定义范围。
    猜你喜欢
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多