在工作簿 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有没有函数可以提取到以指定单元格中字符命名的工作簿的路径?