VBA - 根据条件匹配另一个工作表中的数据

时间:2016-03-30 01:15:02

标签: excel vba excel-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,如果匹配的Remarks的{​​{1}}为Facility Name,请在91%-100% utilization中添加two columns,将其标记为WorkBook2Selected

输出就像这样..

For 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           |           | 

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

2 个答案:

答案 0 :(得分:1)

您无法打开工作簿并将工作簿类型的变量分配给这样的工作表。在我看来,您在工作簿/工作表中存在的设施名称的逻辑是倒退的。这将打开两个工作簿,将工作表类型的变量分配给每个工作簿中的第一个工作表,并使用其中的工具循环遍历第二个工作簿中的条目以确认工作簿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

鉴于用户表单文本框和双工作簿的性质,我没有从头到尾测试它,但它确实编译并代表我将用于此过程的过程。

答案 1 :(得分:0)

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

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
相关问题