【问题标题】:Excel VBA - Comparing Two Arrays in Two WorkbooksExcel VBA - 比较两个工作簿中的两个数组
【发布时间】:2018-06-08 15:43:18
【问题描述】:

我在两个不同的工作簿中使用两个不同的工作表。我正在使用第一个工作表中的数据来填写第二个工作表。

我在工作簿 A 中有两个列表(称为 x 和 y),在工作簿 B 中有两个列表。我正在比较工作簿 A 和 B 中的列表 x。如果 WorkbookA-ListX 中的任何单元格与任何单元格匹配在 WorkbookB-ListX 中的单元格中,我会将 WorkbookA-ListY 中的单元格的值复制到 WorkbookB-ListY 中的单元格中。

我无法比较原始的两个列表。我正在考虑使用 WorkbookA-ListX 中的第一个值并将其与数组 WorkbookB-ListX 进行比较以查看是否有任何匹配项,然后只增加 WorkbookA-ListX。

列表基本上是同一列中的一系列值,因此例如 B3:B53 是列表的大小。我用这个link 来帮助我,但是当我到达第一个“For iRow ...”时,我一直收到一个错误代码,上面写着“运行时错误13,类型不匹配”我应该从这里做什么?

Private Sub CommandButton1_Click()

Dim wkb0 As Workbook
Dim wkb1 As Workbook

Dim varSheet0, varSheet1 As Variant
Dim RangeToCheck0, RangeToCheck1 As String
Dim iRow, iCol As Long

Set wkb0 = Workbooks.Open("P:\BEN\EMOP\Work Space\Congestion_May.xlsx")
Set varSheet0 = wkb0.Worksheets("Page1").Range("B3:B82,B86:B105")
Set wkb1 = Workbooks.Open("P:\BEN\EMOP\Work Space\Congestion_Apr_abr.xlsx")
Set varSheet1 = wkb1.Worksheets("Page1").Range("B3:B51,B54:B73")

nlin = 1
ncol = 1


For iRow = LBound(varSheet0, 1) To UBound(varSheet0, 1)
    For iCol = LBound(varSheet0, 2) To UBound(varSheet0, 2)
        If varSheet0(iCol, iRow) = varSheet1(iRow, iCol) Then
            varSheet0.Range("E" & iRow).Value = varSheet1.Range("E" & iRow).Value
        End If
    Next
Next

【问题讨论】:

  • 我认为在你的范围内有多个区域意味着这个问题不适合用数组来解决
  • You can iterate through a range rather easily 而不将其传输到数组中
  • 如果您设置使用上面的数组方法,那么需要注意的一点是您实际上并没有将值保存到数组中。如果您打开Locals Window,您会发现varSheet0varSheet1 实际上都是范围。问题(imo)的困难部分是您的范围不连续,例如B3:B82,B86:B105

标签: vba excel


【解决方案1】:

您实际上使用的是范围,而不是数组。你声明了 变暗 varSheet0,varSheet1 作为变体 代替 将 varSheet0() 调暗为 Variant,varSheet1() 作为 Variant

也就是说,你并不真的需要数组。

但我认为您不会将 WALX 中的 每个 值与 整个 WBLX 进行比较。

这行得通吗?

For iRow = 1 To varSheet0.Rows.Count
    iRowResult = ""
    On Error Resume Next
        'Where is varSheet0 value in varSheet1?
        iRowResult = WorksheetFunction.Match(varSheet0.Cells(iRow).Value, varSheet1, 0)
    On Error GoTo 0
    If iRowResult = "" Then
        'There's no match in varSheet1. Do what you need.
    End If
Next iRow

【讨论】:

  • 如果您要全力以赴解决这个问题,您可能会发现this question 很有帮助。
  • 我使用了这个,但我的代码仍然没有做它应该做的事情。 wkba-listx 中的第一个单元格应与整个 wkbb-listx 一起检查,如果没有匹配项,则应增加第一个列表中的单元格。它应该将值从 wkba-listy 放入 wkbb-listy,但它没有输出任何东西。我没有收到任何编译或运行时错误,但我的代码也没有发生任何事情。
  • @AqsaAhsan 您是否尝试过单步执行或在varSheet0.Range("E" & iRow).Value = varSheet1.Range("E" & iRow).Value 上设置断点以验证是否满足 IF 语句?有时,在我们看来相同的值由于包含空白字符而被代码解释为不同。
  • 我相信If varSheet0.Cells(iRow).Value = varSheet1.Cells(iRow).Value Then 不会正确排列,因为这两个范围的长度不同,也不从相同的索引开始。您必须单独增加第二个变量来评估 varSheet1.Cells()
  • varSheet1 中的 varSheet0 值在哪里是什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2020-06-28
  • 1970-01-01
相关资源
最近更新 更多