Цикл VBA / логическая проблема

#string #excel #vba #loops

#строка #преуспеть #vba #петли

Вопрос:

Я пишу макрос в Excel для работы, и у меня возникли проблемы. В этом сценарии есть два листа: «BU» и «TOPS Information». Когда используется макрос, предполагается, что он ищет в каждой строке «BU» значение, найденное в «TOPS Information», затем переходит к следующей строке «TOPS Information» и повторяет процесс. Если он находит правильное совпадение, он должен скопировать ячейку и вставить ее в «TOPS Information».

Вот этот код:

 Sub QIM()

Dim j As Integer
Dim k As Integer
Dim i As Integer
Dim l As Integer
Dim m As Integer

Dim searchArray(1 To 3) As String

j = 0
k = 1



'WARNING: Temporary Sheet Names
lastRowTOPS = Worksheets("TOPS Information").Cells(Rows.Count, "A").End(xlUp).Row
lastRowBU = Worksheets("BU").Cells(Rows.Count, "A").End(xlUp).Row

'Cycle through BU rows
For j = lastRowTOPS To 1 Step -1

    'Cycle through searchArray for each BU row
    For k = lastRowBU To 1 Step -1


            '//////////////////////////////////////

            x = Sheets("BU").Range("B" amp; k).Value
            y = Range("C" amp; j).Value

            If StrComp(x, y) = 1 Then



                Sheets("BU").Range("C" amp; k).Copy
                Range("H" amp; j).PasteSpecial



            End If

            '//////////////////////////////////////



    Next k

Next j


End Sub
 

Очевидно, что этот макрос работает только в том случае, если в данный момент выбран параметр «TOPS Information». Любая и любая помощь была бы очень признательна. Спасибо!

Комментарии:

1. [ office.microsoft.com/en-us/excel-help / … может быть, это то, что вы ищете

2. неработающая ссылка. vlookup

3. office.microsoft.com/en-us/excel-help/vlookup-HP005209335.aspx Спасибо @JimmySmith

4. Будут ли повторяющиеся значения в BU столбце B листа? Ваш код в конечном итоге скопирует самую верхнюю «находку». Если данные col B уникальны, то Exit For для сокращения времени выполнения. Вам следует рассмотреть возможность использования 2 переменных рабочего листа и 2 переменных диапазона.

Ответ №1:

Вы вроде как ответили на это сами. Диапазон относится к текущему листу, но когда вы перемещаетесь, вам нужно его уточнить.

Префикс ваших диапазонов с соответствующим листом, например,

 Sub QIM()

    Dim j As Integer
    Dim k As Integer
    Dim i As Integer
    Dim l As Integer
    Dim m As Integer

    Dim searchArray(1 To 3) As String

    j = 0
    k = 1



    'WARNING: Temporary Sheet Names
    lastRowTOPS = Worksheets("TOPS Information").Cells(Rows.Count, "A").End(xlUp).Row
    lastRowBU = Worksheets("BU").Cells(Rows.Count, "A").End(xlUp).Row

    'Cycle through BU rows
    For j = lastRowTOPS To 1 Step -1

        'Cycle through searchArray for each BU row
        For k = lastRowBU To 1 Step -1
                '//////////////////////////////////////
                x = Sheets("BU").Range("B" amp; k).Value
                y = Sheets("TOPS Information").Range("C" amp; j).Value
                If StrComp(x, y) = 1 Then
                    Sheets("BU").Range("C" amp; k).Copy
                    Sheets("TOPS Information").Range("H" amp; j).PasteSpecial
                End If

                '//////////////////////////////////////

        Next k

    Next j


    End Sub
 

Комментарии:

1. 1 … но я устал отвечать на этот вопрос снова и снова 🙂 возможно, нам нужен канонический ответ на Method Range of Worksheet Object Failed ошибку…

Ответ №2:

Предполагая, что вы хотите скопировать только самые верхние найденные данные в BU to TOPS , вы можете использовать ниже.

 Sub QIM()
    Dim oWS_TOPS As Worksheet, oWS_BU As Worksheet ' Worksheet objects
    Dim oRng_TOPS As Range, oRng_BU As Range ' Range objects
    Dim R_TOPS As Long, R_BU As Long

    Set oWS_TOPS = ThisWorkbook.Worksheets("TOPS Information") ' <-- Replace this "TOPS Information" to match future changes
    Set oWS_BU = ThisWorkbook.Worksheets("BU") ' <-- Replace this "BU" to match future changes

    R_TOPS = oWS_TOPS.Cells(Rows.Count, "A").End(xlUp).Row
    R_BU = oWS_BU.Cells(Rows.Count, "A").End(xlUp).Row

    ' Search column B of BU for each cell in column C of TOPS
    For Each oRng_TOPS In oWS_TOPS.Columns("C").Cells ' <-- Replace this "C" to match future changes
        ' Exit if row is more than last A column data
        If oRng_TOPS.Row > R_TOPS Then Exit For
        For Each oRng_BU In oWS_BU.Columns("B").Cells ' <-- Replace this "B" to match future changes
            ' Exit if row is more than last A column data
            If oRng_BU.Row > R_BU Then Exit For
            ' Check if Ranges match (## See Update ##)
            If InStr(1, oRng_TOPS.Value, oRng_BU.Value, vbTextCompare) > 0 Then
                ' Copy column C of found row in BU to column H of TOPS, then exit
                oWS_BU.Cells(oRng_BU.Row, "C").Copy oWS_TOPS.Cells(oRng_TOPS.Row, "H") ' <-- Replace these "C" and "H" to match future changes
                Exit For
            End If
        Next
    Next

    Set oWS_TOPS = Nothing
    Set oWS_BU = Nothing
End Sub
 

Есть много способов достичь вашей цели, и это один из них.


ОБНОВИТЕ примечание о сравнении значений ячеек (строка):

StrComp(S1,S2[,mode]) возвращайте только 3 значения {-1, 0, 1}, чтобы указать, меньше / равно / больше S1, чем S2. Если вам нужно точное совпадение (с учетом регистра и точного интервала), используйте If StrComp(S1,S2) = 0 Then .

InStr([i,]S1,S2[,mode]) возвращает только положительные значения — возвращает местоположение символа первого появления S2 в S1. Если S2 не найден, он возвращает ноль.

Вы также можете использовать Trim(sText) для удаления начальных / конечных пробелов sText.

Надеюсь, что приведенный ниже скриншот говорит больше.

strcomp против instr

Комментарии:

1. Спасибо, ребята, извините за то, что задали ранее заданный вопрос, я новичок в VBA и не мог понять, как применяются другие ответы. Приветствия!

2. Быстрый вопрос, однако, если бы я хотел сравнить целые строки, а не просто проверить, находится ли одна строка в другой, как я мог бы это сделать. Я пробовал использовать strcomp, но, похоже, это не работает.

3. Вы можете использовать If oRng_TOPS.Value = oRng_BU.Value Then для точного совпадения или проверить обновление моего ответа.