Excel VBAmacros:遍历一个页面上的值来检查另一个页面上的匹配并赋值

我想做什么:遍历一个页面上的值来检查另一个页面上的匹配,如果find一个匹配从第二页相同的行,但不同的列取值。

我一直在尝试相当一段时间。 我是VBA脚本/ Excel的新手,可能会错误地处理这个问题,所以我在这里问这个问题!

我的代码到目前为止:

Sub InsertData() ScreenUpdating = False Dim wks As Worksheet Dim subSheet As Worksheet Set subSheet = Sheets("Sheet4") Dim rowRangeSub As Range Dim LastRowSub As Long LastRowSub = subSheet.Cells(subSheet.Rows.Count, "C").End(xlUp).Row Set rowRangeSub = subSheet.Range("C2:C" & LastRowSub) Dim subGroupList As ListObject Dim rowRange As Range Dim colRange As Range Dim LastCol As Long Dim LastRow As Long Dim Found As Range 'START OF SHEET1' Set wks = Sheets("SHEET1") LastRow = wks.Cells(wks.Rows.Count, "B").End(xlUp).Row Set rowRange = wks.Range("B2:B" & LastRow) 'Loop through each row in B column (Names)' For Each rrow In rowRange If Not IsEmpty(rrow) Then With Sheets("Sheet4").Range("C2:C" & LastRowSub) Set Found = .Find(What:=rrow, _ After:=.Cells(1), _ LookIn:=xlValues, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False) If Not Found Is Nothing Then 'Debug.Print "Found"' wks.Cells(rrow.Row, "K").Value = "Found" Else wks.Cells(rrow.Row, "K").Value = "Not Found" 'Debug.Print "Not Found"' End If End With End If Next rrow 'END OF SHEET1' 'START OF SHEET2' Set wks = Sheets("SHEET2") LastRow = wks.Cells(wks.Rows.Count, "B").End(xlUp).Row Set rowRange = wks.Range("B2:B" & LastRow) 'END OF SHEET2' 'START OF SHEET3' Set wks = Sheets("SHEET3") LastRow = wks.Cells(wks.Rows.Count, "B").End(xlUp).Row Set rowRange = wks.Range("B2:B" & LastRow) 'END OF SHEET3' ScreenUpdating = True End Sub 

在Excel文件中的设置是这样的:三张工作表Sheet1,Sheet2,Sheet3在其10个第一列(AJ)中包含大量数据,并且如果数据被插入到第十一列(K)find。 相关的数据,名称,在B列中find,其中B:1只是“Name”作为标题。 列中还有一些空单元需要考虑。

第四张,Sheet4包含5个第一列中的一些数据。 需要匹配的名称可以在列C中find,如果find匹配,则应该从单元(Found.Row,“E”)收集数据,其中“E”是E列。

这个问题一直困扰着我的头,因为.Find()函数似乎不能像我期望的那样工作,因为它有时会发现相反的东西。

我的主要问题是:如何将正确的值分配给行?

 wks.Cells(rrow.Row, "K").Value = rowRangeSub.Cells(Found.Row, "E").Value 

我觉得我已经testing了至less10种不同的分配方式,但是在错误之后,我一直在获取错误。 大多数时候这是一个错配的错误。

任何帮助表示赞赏!

编辑自阅读评论:好的,在这里:所有列被格式化为文本。 A列:个人号码:不相关B列:姓名:表格是:姓氏,名字。 search匹配时使用这个。 C栏到J栏与人的各种信息无关。 K列:这个列单元格开始是空的。 这是由macros观填补。

我在Excel文件中有三本不同的书,其数据看起来像我所解释的,只是每本书中的不同数据。

第四本书是这样的:A列和B列与根本不需要的信息无关。

列C:名称forms姓氏,名字。 这是列单元格应该与其他书中列B的单元格进行比较。

D栏:不相关

E栏:这是Sheet4的重要部分。 每个人都有一个“组号”,可以在这一列中find每一行。

我想要做的就是比较Sheet1-3中B列中的每个单元格,以获得Sheet4中列C中的匹配。 如果发现匹配(不是所有的都被分配了一个组,所以可能找不到匹配),然后从find匹配的行的行4上的单元格信息和列“E”中,把这个信息放在Sheet1-3和“K”栏。

示例数据(有没有办法提交表?): Sheet1:

B列

Tablesson,Pen

纸,墨水

橡皮擦,屏幕

COLUMN K在这个时候是空的

Sheet4:

COLUMN C

纸,墨水

橡皮擦,屏幕

E

55

77

macros后运行macros1, Sheet1

B列

Tablesson,Pen

纸,墨水

橡皮擦,屏幕

COLUMN K

[首先是空的,因为没有find匹配]

55

77

希望这是可以理解的!

我使用脚本字典简化了这个过程。

 Sub InsertData() Dim lastRow As Long, x As Long Dim dicNames, k As String, v As Variant Set dicNames = CreateObject("scripting.dictionary") 'Create list of Names to compare against and values to update With Worksheets("Sheet4") lastRow = .Cells(Rows.Count, "A").End(xlUp).Row For x = 2 To lastRow k = .Cells(x, 3).Value 'Name from Column C v = .Cells(x, 5).Value 'Value From Column E 'Add Key Value pairs to Dictionary If Not dicNames.Exists(k) Then dicNames.Add k, v Next End With ProcessWorksheet Worksheets("Sheet1"), dicNames ProcessWorksheet Worksheets("Sheet2"), dicNames ProcessWorksheet Worksheets("Sheet3"), dicNames End Sub Sub ProcessWorksheet(ws As Worksheet, ByRef dicNames) Dim k As String, v As Range Dim lastRow As Long, x As Long With ws lastRow = .Cells(Rows.Count, "A").End(xlUp).Row For x = 2 To lastRow k = .Cells(x, 2) 'If Name from Column B If dicNames.Exists(k) Then .Cells(x, 11) = dicNames(k) 'Then Column K = Value from Sheet4 End If Next End With End Sub 
 Sub InsertData() Dim lastRow As Long, x As Long Dim dicNames, k As String, v As Variant Set dicNames = CreateObject("scripting.dictionary") 'Create list of Names to compare against and values to update With Worksheets("Sheet4") lastRow = .Cells(Rows.Count, "A").End(xlUp).Row For x = 2 To lastRow k = .Cells(x, 3).Value 'Name from Column C v = .Cells(x, 5).Value 'Value From Column E 'Add Key Value pairs to Dictionary If Not dicNames.Exists(k) Then dicNames.Add k, v Next End With ProcessWorksheet Worksheets("Sheet1"), dicNames ProcessWorksheet Worksheets("Sheet2"), dicNames ProcessWorksheet Worksheets("Sheet3"), dicNames End Sub Sub ProcessWorksheet(ws As Worksheet, ByRef dicNames) Dim k As String, v As Range Dim lastRow As Long, x As Long With ws lastRow = .Cells(Rows.Count, "A").End(xlUp).Row For x = 2 To lastRow k = .Cells(x, 2) 'If Name from Column B If dicNames.Exists(k) Then .Cells(x, 11) = dicNames(k) 'Then Column K = Value from Sheet4 End If Next End With End Sub