Как использовать столбец строк, чтобы найти эту же строку на другом листе, и вставить соответствующее значение из листа 1 рядом с найденным значением? - PullRequest
0 голосов
/ 04 февраля 2019

Я работаю над созданием некоторых автоматических отчетов.Повторюсь, я бы хотел, чтобы мой код просматривал каждую «строку» в столбце «Лист1» E (игнорируя пропуски), выполнял поиск этого значения в другом листе / рабочей книге и вставлял «один», содержащийся в столбце «Лист1» D (игнорируя пропуски, еслиE пусто, D будет пусто) слева от строки, найденной в поиске ранее.

Принимающие листы данных широко рассредоточены и имеют различные форматы, но одна постоянная состоит в том, что каждая позиция для ввода данных имеет уникальный тег в соседнем столбце, который также находится в первичном листе хранения данных.У меня пока нет особого опыта работы с VBA, и мне было интересно, как некоторые другие решат эту проблему динамическим способом, который не нарушит момент, когда добавляется новый столбец.

Мой текущий код - беспорядочный беспорядок, поэтому любые указания, идеи, общие стратегии будут оценены.Я пытаюсь избежать использования Sheets (). Select и других подобных ссылок, но пока не знаю, как это сделать.

Dim location As String
Dim rownum As Integer
Dim cellfinder As Integer

Sheets("Sheet2").Select                          'Ensures that we start on sheet 2

rownum = Range("G2").Value


For cellfinder = 1 To rownum                     'Loop goes for as many non-blank rows exist in column---- need
    'to add code to skip over blank rows with offset function or else loop will not go on long enough.

    Sheets("Sheet2").Select                      'selects Pi tag data sheet

    'hopefully adjusts the active cell relative to the loop count

    If ActiveCell.Value = "" Then                'hopefully detects blank cells and skips to next loop
        GoTo Skip
    End If

    location = ActiveCell.Value                  'calls the location tag string the variable "location"
    ActiveCell.Offset(0, -1).Select              'offsets from location tag to the "current value column"
    ActiveCell.Value.Copy                        'copies the value found in the current value column hopefully not the pi function


    Sheets("Sheet1").Select                      'Selects EOM sheet, can be whatever sheet we wish, or in another worksheet
    Range("A1").Select                           'establishes a starting point for find function

    Cells.Find(What:="location", After:=sht2.cells(1,1), LookIn:= _
               xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
               xlNext, MatchCase:=False, SearchFormat:=False).Activate
    ActiveCell.Offset(0, -1).Select              'offsets the active cell to the value column in EOM sheet
    ActiveCell.Paste                             'pastes the activecell value copied from sheet 1
    ' find function finds the string saved to the location variable , makes it the active cell.

    Skip:
Next cellfinder

1 Ответ

0 голосов
/ 04 февраля 2019

Следует отметить, что в What:="location", когда вы помещаете location в кавычки, вы указываете своей функции поиска искать исключительно значение "location" вместо переменная location, которую вы установили в значение ActiveCell в цикле.

Кроме того, я бы не стал использовать Goto, если вы не выходите из глубоко вложенного цикла.Вы можете переписать свой код, чтобы избежать использования Select, ActiveCell, Goto и исправления вашего .Find, например:

Dim location As String
Dim rownum As Long
Dim cellfinder As Long
Dim fRng As Range

With Sheets("Sheet1")

    rownum = .Range("E" & Rows.Count).End(xlUp).Row

    For cellfinder = 1 To rownum

        If .Range("E" & cellfinder) <> "" Then

            location = .Range("E" & cellfinder)

            Set fRng = Sheets("Sheet2").Cells.Find(What:=location, LookIn:=xlFormulas, LookAt:=xlPart) '<-Sheets("Sheet2") can be any sheet you need to perform the .Find against

            If Not fRng Is Nothing Then
                fRng.Offset(0, -1) = .Range("D" & cellfinder)
            Else
                'Do something when .Find doesn't find anything
            End If

        End If

    Next cellfinder

End With

Использование блока With позволяет один раз указать нужный объекти использовать его, добавляя методы с префиксом ., так что

With Sheets("Sheet1")
    .Range("A1")
End With

функционально совпадает с

Sheets("Sheet1").Range("A1")

Использование .Range("E" & Rows.Count).End(xlUp).Row вернет номер последней использованной строки вВ столбце E вы можете проверить наличие пустых ячеек в цикле и не беспокоиться о том, что ваш счет rownum недостаточно длинный, если вы позволите ему = Range("G2").

Чтобы обойти оператор Goto, используяпротивоположный оператор и включение всего последующего исполняемого кода в оператор If приведет к тому же результату, не поощряя спагетти-код.Вместо того, чтобы проверять, есть ли ActiveCell = "", а затем выполнять Goto, когда это происходит, проверяйте, если нет, только выполнение следующего кода, когда это не так.

Инициализация fRngкак Range и установив его равным результату вашей функции .Find, вы сможете протестировать функцию поиска, чтобы увидеть, вернула ли она что-нибудь, чтобы вы не ошиблись при попытке что-то сделать с fRng, когдаэто Nothing.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...