在工作簿 1(A 列)和工作簿 2(A 列)中查找匹配的单元格值;粘贴对应数据

Posted

技术标签:

【中文标题】在工作簿 1(A 列)和工作簿 2(A 列)中查找匹配的单元格值;粘贴对应数据【英文标题】:Find matching cell values in Workbook 1 (Column A) and Workbook 2 (Column A); Paste corresponding data 【发布时间】:2020-01-13 15:46:46 【问题描述】:

我正在尝试为某个月份的报告制作一个采用美元金额和百分比(2 个单独的列)的宏,并将其添加到历史工作簿中,显示过去项目的所有美元价值/百分比。下面的代码似乎可以工作,但实际上只是将月度报告 (wb1) 中的下一行值粘贴到历史工作簿的下一个空列 (wb2) 的下一行中。我需要它将 wb1 中的项目名称与 wb2 中的项目名称实际匹配,以便新值实际上来自正确的项目。我知道它不起作用,因为我取出了一个项目名称以查看会发生什么,并且宏仍然在 wb2 中发布了缺少的项目名称的信息,当没有时切断项目列表末尾的最后一个值t 任何更多占用的单元格。因此,如果有 10 个项目,而我取出项目 5,则会发布项目 1-9 的数据。

如果 wb1 中的项目名称未出现在 wb2 的 A 列中,我还需要添加一个新行。新行将用于缺少项目名称,并将粘贴该月的美元金额。或者,至少,告诉用户 wb2 中不存在特定的项目名称。我不确定我将如何去做,但我至少需要下面的代码来准确地添加项目值。

任何帮助将不胜感激!


Workbooks.Open ("T:\ADMINISTRATION\Marie Presley\HistoricalFees.xlsx")

Dim wb1 As Workbook
Dim wb2 As Workbook
Dim y As Integer
Dim sht As Worksheet

'=============================================
Dim w1 As Worksheet, w2 As Worksheet
 Dim i As Long, j As Long, n As Integer
Dim NextEmptyCol As Long

 Set w1 = Workbooks("Forecast Summary Report Generator.xlsm").Worksheets("Forecast Summary")
 Set w2 = Workbooks("HistoricalFees.xlsx").Worksheets("Sheet1")

NextEmptyCol = w2.Cells(1, Columns.Count).End(xlToLeft).Column + 1

 n = 0
 For i = 1 To w2.Cells(Rows.Count, 1).End(xlUp).Row       'for each used cell in w2.colA
   For j = 1 To w1.Cells(Rows.Count, 3).End(xlUp).Row + n 'for each used cell in w1.colC

    'Find the text from w1.colC (current w1 row), within cell in w2.colA (current w2 row)
     If InStr(1, w2.Cells(i, 1).Value, w1.Cells(j, 3).Value) > 0 Then

      'If found then copy cell in w2.colB into cell in w2.colE (current w2 row)
       w1.Cells(i, 8).Copy (w2.Cells(i, NextEmptyCol))
       w1.Cells(i, 9).Copy (w2.Cells(i, (NextEmptyCol + 1)))

       Exit For    'this exits the inner For loop

       n = n + 1   'this would jump over the next cell(s) in w1, but never executes
     End If
   Next j
 Next i

End Sub

【问题讨论】:

你的问题是什么,你能澄清一下吗?此外,如果您使用F8 逐步执行代码,它应该有助于解决为什么n = n + 1 永远不会失败。我假设这是因为它总是退出 For 循环?另外,这可能是一个公式吗? 我同意@BruceWayne,尝试将n = n +1 移动到Exit For 之前,然后使用F8 单步执行代码以确保n 的值增加1。 我想我的问题最终是,为什么这段代码实际上没有搜索匹配的单元格值?它只是将数据粘贴到下一个空行中,无论项目名称是否正确。我对使用 vba 很陌生,我使用了这段编写的代码并对其进行了修改以适合我,我实际上不确定 n=n+1 的注释是什么意思。我不知道这是否可能是一个公式……也许是 vlookups。我也可以玩弄它。 如果您使用F8 单步执行代码,它将逐行执行。然后您可以看到它何时/何​​处退出循环,以及什么值是...例如在for i = 1 ... 行触发后,将鼠标悬停在i 上,您将看到一个显示1 的工具提示. 这不能用VLookUp 完成吗?或排列关闭 【参考方案1】:

我知道这听起来很糟糕,但是听从 Zac 的建议,看看你是否可以先用 VLookup 和 Find 工作表函数来制作这个算法。即使您需要使用帮助表来处理多个步骤。如果您在着手改编其他人的代码之前真正知道并看到自己想做什么、工作,那就更好了。

接下来尝试使用Application.worksheetfunction 复制工作可视化表格公式。

完成这项工作后,您应该可以更好地理解流程,并且可以将其简化为范围和工作表对象。但是,除非您知道实际的算法是什么或理解它,否则您将很难理解出了什么问题。

【讨论】:

您还可以考虑将这个大子例程的每一步分解为单独的函数,并通过传递变量值 byref 或 byval 来清理代码。如果您不知道如何执行此标准练习,请查看此内容。好处是更容易阅读代码,以及在出现问题时更清晰的错误处理过程。 cpearson.com/excel/byrefbyval.aspx 感谢您的输入,我找到了一些我能够更好地理解的代码,所以我最终大部分都放弃了这个并调整了其他东西。它现在有效,我认为我发布的代码每次都没有正确添加 n 值。我用 F8 一步一步的遍历它,它的值是跳跃的,而不是每次都上升 1。【参考方案2】:

您的问题标题显示 Col A 和 Col A,但您的代码显示 Col C 和 Col A,如果您需要修复下面的代码,请将 3 替换为 1。将 NextEmptyCol 放在您的 If statement 中,因为您的列每一行都不一样。

删除...

NextEmptyCol = w2.Cells(1, Columns.Count).End(xlToLeft).Column + 1

'and

   For i = 1 To w2.Cells(Rows.Count, 1).End(xlUp).Row       'for each used cell in w2.colA
   For j = 1 To w1.Cells(Rows.Count, 3).End(xlUp).Row + n 'for each used cell in w1.colC

 'Find the text from w1.colC (current w1 row), within cell in w2.colA (current w2 row)
 If InStr(1, w2.Cells(i, 1).Value, w1.Cells(j, 3).Value) > 0 Then

  'If found then copy cell in w2.colB into cell in w2.colE (current w2 row)
   w1.Cells(i, 8).Copy (w2.Cells(i, NextEmptyCol))
   w1.Cells(i, 9).Copy (w2.Cells(i, (NextEmptyCol + 1)))

   Exit For    'this exits the inner For loop

用这个替换...

   For j= 1 To w2.Cells(Rows.Count, 1).End(xlUp).Row       'for each used cell in w2.colA
   For i = 1 To w1.Cells(Rows.Count, 3).End(xlUp).Row + n 'for each used cell in w1.colC

       If w2.Cells(j, 1).Value = w1.Cells(i, 3).Value Then 'find w2 values in w1 
           NextEmptyCol = w2.Cells(j, w2.Columns.Count).End(xlToLeft).Column + 1 'set the next empty column for each row
           w2.Cells(j, NextEmptyCol).Resize(, 2).Value = w1.Cells(i, 8).Resize(, 2).Value

       End If
   Next j
   Next i

【讨论】:

以上是关于在工作簿 1(A 列)和工作簿 2(A 列)中查找匹配的单元格值;粘贴对应数据的主要内容,如果未能解决你的问题,请参考以下文章

将单元格从打开的工作簿复制到另一个

excel有没有函数可以提取到以指定单元格中字符命名的工作簿的路径?

比较2个工作簿

如何在 VBA 中使用 SQL 将两个工作簿与一个公共列合并

为给定文件夹中的多个工作簿分配密码

怎么把多个excel工作簿里面的相同名字的工作表的内容合并到一起