Установить переменную колонку в цикле поиска по рабочим листам не работает, - PullRequest
0 голосов
/ 30 августа 2018

Я работаю над макросом, который должен найти каждое значение в диапазоне в «sheet1» и искать его во всех листах рабочей книги (может быть до 7 листов), так как это занимает слишком много времени, просматривая для значений во всех листах я хотел бы уменьшить поле поиска на каждом листе до одного переменного столбца с заголовком IP.

Это макрос, который у меня есть, но я не могу заставить его работать только в указанном диапазоне, однако удаление этих строк делает макрос работающим нормально.

Заранее спасибо.

Sub findInventory()
Dim ws As Worksheet
Dim strWhat, rngFound, mString As String
Dim rngSearch, osfind, rfind, rfcol As Range
Dim i, x As Integer
Dim LastRow, oscol, lcol, e, lrowA, remChar, fcol As Long




Sheets("GVM Report").Cells(1, 1).Offset(0, 1).Resize(, 2).EntireColumn.Insert
Sheets("GVM Report").Cells(1, 1).Offset(0, 1).Value = "INVENTORY"
Sheets("GVM Report").Cells(1, 1).Offset(0, 2).Value = "OPSDB"

Set rfind = ActiveWorkbook.Sheets("GVM Report").Rows("1:3").Find(What:="IP", LookAt:=xlWhole, MatchCase:=False, SearchFormat:=False)
lcol = rfind.Column

Set osfind = ActiveWorkbook.Sheets("GVM Report").Rows("1:3").Find(What:="OS*", LookAt:=xlWhole, MatchCase:=False, SearchFormat:=False)
oscol = osfind.Column

LastRow = Sheets("GVM Report").Range("A" & Rows.Count).End(xlUp).Row

For x = 2 To LastRow

strWhat = Sheets("GVM Report").Cells(x, lcol)
    For Each ws In Worksheets
    Set rfcol = ws.Rows("1:3").Find(What:="IP", LookAt:=xlWhole, MatchCase:=False, SearchFormat:=False)
    fcol = rfcol.Column
    With ws.Columns(fcol)
    Select Case ws.name
    Case "Operations", "Data", "FYI all OS", "Unique Values", "GVM Report"

    Case Else
       Set rngSearch = ws.Cells.Find(What:=strWhat)
        If strWhat <> "" Then
            If Not rngSearch Is Nothing Then
                i = i + 1
                If i = 1 Then
                    rngFound = rngSearch.Worksheet.name
                Else
                    rngFound = rngFound & " | " & rngSearch.Worksheet.name
                End If
                    End If

        End If

                Sheets("GVM Report").Cells(x, 2) = rngFound


    End Select
    End With
    Next ws
    rngFound = ""
    i = 0
Next x
End Sub

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Я провел тест с фиктивными данными и получил следующие результаты:

INVENTORY
Sheet2 | Sheet3
Sheet2
Sheet3

, что соответствует тому, что я ожидал, учитывая фиктивные данные, которые я создал. Возможно, существуют лидирующие, завершающие пробелы или другие невидимые различия, которые вызывают несоответствие данных в ячейках, которые кажутся равными?

0 голосов
/ 30 августа 2018

Я не уверен, что смогу повторить вашу ошибку, но я немного прибрался в вашем коде, и это может быть полезно для вас, так что вот так:

Sub findInventory()
Dim ws As Worksheet
Dim wsGVM As Worksheet: Set wsGVM = ThisWorkbook.Sheets("GVM Report")
Dim strWhat As String, rngFound As String, mString As String
Dim rngSearch As Range, osfind As Range, rfind As Range, rfcol As Range
Dim i As Integer, x As Long, LastRow As Long, oscol As Long, lcol As Long, fcol As Long

wsGVM.Cells(1, 1).Offset(0, 1).Resize(, 2).EntireColumn.Insert
wsGVM.Cells(1, 1).Offset(0, 1).Value = "INVENTORY"
wsGVM.Cells(1, 1).Offset(0, 2).Value = "OPSDB"

Set rfind = wsGVM.Rows("1:3").Find(What:="IP", LookAt:=xlWhole, MatchCase:=False, SearchFormat:=False)
If Not rfind Is Nothing Then lcol = rfind.Column

Set osfind = wsGVM.Rows("1:3").Find(What:="OS*", LookAt:=xlWhole, MatchCase:=False, SearchFormat:=False)
If Not osfind Is Nothing Then oscol = osfind.Column

LastRow = wsGVM.Range("A" & Rows.Count).End(xlUp).Row

For x = 2 To LastRow
    strWhat = wsGVM.Cells(x, lcol)
    For Each ws In Worksheets
        Set rfcol = ws.Rows("1:3").Find(What:="IP", LookAt:=xlWhole, MatchCase:=False, SearchFormat:=False)
        If Not rfcol Is Nothing Then
            fcol = rfcol.Column
            With ws.Columns(fcol)
                Select Case ws.Name
                    Case "Operations", "Data", "FYI all OS", "Unique Values", "GVM Report"
                    ''''
                    Case Else
                        If strWhat <> "" Then
                            Set rngSearch = .Find(What:=strWhat)
                            If Not rngSearch Is Nothing Then
                                i = i + 1
                                If i = 1 Then
                                    rngFound = rngSearch.Worksheet.Name
                                Else
                                    rngFound = rngFound & " | " & rngSearch.Worksheet.Name
                                End If
                            End If
                        End If
                        wsGVM.Cells(x, 2) = rngFound
                End Select
            End With
        End If
    Next ws
    rngFound = ""
    i = 0
Next x
End Sub
...