VBA – 根据标准匹配来自另一个工作表的数据

我有两个工作簿,我们称他们为Workbook1Workbook2

Workbook1 :看起来像这样:(我只把数据放在列A中)

 Facility Name| Column B| Column C | TGG751-M | | | TGG760-M | | | TLY701-M | | | 

Workbook 2

 Technology| Facility Name | Remarks | LTE | TGG751-M | 91%-100% utilization | LTE | TGG760-M | 91%-100% utilization | LTE | TLY701-M | Red | 

我需要在两个工作簿中匹配Facility Name ,如果匹配的Facility NameRemarks91%-100% utilizationWorkBook2添加two columns ,并将其标记为“ SelectedFor Checking

输出将是这样的..

  Technology | Facility Name | Remarks | +1 Column | +1 Column LTE | TGG751-M | 91%-100% utilization | Selected | For Checking LTE | TGG760-M | 91%-100% utilization | Selected | For Checking LTE | TLY701-M | Red | | 

我的代码:

 Public Sub Selection() Set WorkBook1 = Workbooks.Open(TextBox2.Text).Sheets(1) Set WorkBook2 = Workbooks.Open(TextBox5.Text).Sheets(1) lngLastRow = WorkBook1 .Range("A" & WorkBook1 .Rows.Count).End(xlUp).Row For Index = 2 To lngLastRow Dim varFacility As Variant Dim facilityRng As Range On Error Resume Next lngLastRow = WorkBook1 .Range("A" & WorkBook1 .Rows.Count).End(xlUp).Row Set facilityRng = WorkBook1 .Range("A1:A" & lngLastRow ) varFacility = WorkBook1 .Range("A" & rownum).Value varPosition = Application.WorksheetFunction.Match(varFacility, facilityRng, 0) If Err = 0 Then WorkBook1 .Range("A" & rownum).Value = WorkBook2 .Range("B" & varPosition).Value If WorkBook2 .Range("C" & rownum).Value Like "91%-100% utilization*" Then WorkBook2 .Range("D" & rownum).Value = Selected WorkBook2 .Range("E" & rownum).Value = For Checking End If End If End Sub 

如何才能做到这一点? 一旦我运行我的代码不工作,但我没有任何错误。

您不能打开工作簿并将工作簿types的增值分配给这样的工作表。 在我看来,你在查找工作簿/工作表中存在的设施名称的逻辑是倒退的。 这将打开两个工作簿,将工作表typesvariables赋值给每个工作簿中的第一个工作表,并通过第二个工作簿中的条目循环使用该工厂中的条目来确认工作簿1中是否存在。

 Public Sub Selection() Dim lastRow As Long, rw As Long, rngFacility As Range, strRemark As String Dim wb1 As Workbook, wb2 As Workbook Dim ws1 As Worksheet, ws2 As Worksheet 'TextBox2 and TextBox5 need to be recognized here Set wb1 = Workbooks.Open(TextBox2.Text, ReadOnly:=True) Set ws1 = wb1.Worksheets(1) Set wb2 = Workbooks.Open(TextBox5.Text) Set ws2 = wb2.Worksheets(1) lastRow = ws1.Range("A" & Rows.Count).End(xlUp).Row Set rngFacility = ws1.Range("A1:A" & lastRow) strRemark = "91%-100% utilization" With ws2 lastRow = .Range("B" & Rows.Count).End(xlUp).Row For rw = 2 To lastRow If .Range("C" & rw) = strRemark Then If Not IsError(Application.Match(.Range("B" & rw), rngFacility, 0)) Then .Range("D" & rw).Resize(1, 2) = _ Array("Selected", "For Checking") End If End If Next rw End With 'wb1.Close savechanges:=False 'wb2.Close savechanges:=True End Sub 

考虑到用户forms的文本框和双重工作簿的性质,我从头到尾都没有对它进行testing,但它确实编译并代表了我将用来做这件事的过程。

我刚刚使用我提供的代码解决了这个问题。

 Public Selection() Set Sheet2 = Workbooks.Open(TextBox2.Text).Sheets(1) Set Sheet5 = Workbooks.Open(TextBox5.Text).Sheets(1) Dim varFacility As Variant Dim facilityRng As Range lngLastRow = Sheet5.Range("B" & Sheet5.Rows.Count).End(xlUp).Row Set facilityRng = Sheet5.Range("B1:B" & lngLastRow) For rownum = 2 To Sheet2.Range("A" & Sheet2.Rows.Count).End(xlUp).Row varFacility = Sheet2.Range("A" & rownum).Value On Error Resume Next varPosition = Application.WorksheetFunction.Match(varFacility, facilityRng, 0) If Err = 0 Then If Sheet5.Range("C" & varPosition).Value Like "91%-100% utilization*" Then Sheet2.Range("C" & rownum).Value = "Selected" Sheet2.Range("D" & rownum).Value = "For Checking" End If End If On Error GoTo 0 Next End Sub