Excel Vlookup с автозаполнением VBA

Я пытаюсь сделать макрос, который кажется довольно простым, но оказалось, что это сложнее, чем я думал. Я начал делать его, используя метод «укажи и щелкни», но он не был таким динамичным, как я думал. В основном я использую vlookup для поиска имен в ячейке A2 с другого листа, а затем копирую числа в столбце D на текущий лист. Если посмотреть на код, то для этой части он выглядит примерно так:

Range("D2").Select
ActiveCell.FormulaR1C1 = _
    "=VLOOKUP(RC[-3],'Downstairs'!R[-1]C[-3]:R[200]C[14],4,0)"

Range("D2").Select
Selection.AutoFill Destination:=Range("D2:D" & lastrow&)

После того, как я найду первое число, я пытаюсь автоматически заполнить остальные. Это работает, когда вы запускаете его, но я думаю, что это просто потому, что имена в порядке. Однако, если имена не в порядке, он не найдет правильное число, отчасти потому, что все числа внутри R[] и C[] продолжают меняться по мере продвижения вниз по строкам. Я не думаю, что это сработает, если я добавлю в список больше имен, что мне нужно для этого. Я изменил число внутри R[] с 93 на 200, потому что я действительно не знаю, как включить объект lastrow, который я сделал раньше, и я не знаю другого способа сделать это динамическим. Есть лучший способ сделать это?


person Albert    schedule 13.09.2013    source источник
comment
У вас есть лишний & в конце кода, которого там быть не должно. Однако, пожалуйста, опубликуйте свой точный, фактический код, а НЕ что-то вроде. (Никто не хочет тратить время на просмотр ненастоящего кода.)   -  person Andy G    schedule 13.09.2013
comment
Не знаю, как всех остальных, но меня очень смущает ваш вопрос. Фактический код был бы хорош и макет вашей электронной таблицы. Затем добавьте конкретные примеры ваших входных и выходных данных, а также ожидаемых результатов (чего вы на самом деле хотите). Кроме того, я все еще пытаюсь понять фактическую цель макроса, а не просто автоматически заполнять его вручную...   -  person chancea    schedule 13.09.2013
comment
Почему VBA, а не формула?   -  person Siddharth Rout    schedule 13.09.2013
comment
Извините, это настоящий код, но это всего лишь его часть. Итак, вот фон для этого. В здании 3 типографии, все они собирают данные о цветных и ч/б копиях и отпечатках, сделанных за месяц примерно на 90 человек. Они также собирают другие данные, которые для меня практически бесполезны. Затем данные систематизируются в виде таблицы. То есть будет три листа, каждый с принтером, и каждый принтер возвращает 4 числа (печатает цвет и ч/б, копирует цвет и ч/б). Теперь дело в том, что нам не нужен каждый человек, который появляется в данных, которые предоставляет принтер.   -  person Albert    schedule 14.09.2013
comment
Кстати, данные этого принтера поступают из файлов csv непосредственно с принтеров. Что я сделал, так это составил список с именами, которые нам действительно нужны, затем мы сделали перекрестную ссылку с другим списком, чтобы получить отпечатки людей из списка. Я не хочу делать более 90 vlookup, поэтому я попытался выполнить автозаполнение. Надеюсь, это имеет смысл.   -  person Albert    schedule 14.09.2013
comment
Код, который я разместил, появляется после того, как я уже получил все имена и разделил их на имена и фамилии. Это цветные копии для первого человека в списке, затем я пытаюсь автоматически заполнить список. Остальная часть кода похожа на эту, потому что это просто остальные номера оставшихся принтеров.   -  person Albert    schedule 14.09.2013
comment
Может ли кто-нибудь из вас ответить на мой вопрос здесь? stackoverflow.com/questions/49421592/   -  person HobbyCoder    schedule 22.03.2018


Ответы (1)


Как я уже упоминал в своем комментарии выше, для этого вам не нужен VBA. Вы можете напрямую ввести формулу в Excel и выполнить автозаполнение вручную. Сказав это, если вы все еще хотите использовать VBA, просто используйте этот код, где вам не нужно использовать автозаполнение. Этот код заполнит все соответствующие ячейки формулами.

Ваша формула также не давала вам правильных результатов, поскольку ваш массив таблиц не был постоянным и менялся по мере вашего продвижения вниз. Чтобы этого не произошло, просто используйте знак $.

Еще один совет: формат R1C1 очень сбивает с толку, если вы плохо с ним разбираетесь. Придерживайтесь обычного форматирования A1.

Вот самый простой способ добиться желаемого. Пожалуйста, измените код в соответствии с вашими потребностями

Sub Sample()
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim lastrow  As Long

    '~~> Change this to the releavnt sheet name
    '~~> This is the sheet where the formula will go
    Set ws1 = ThisWorkbook.Sheets("Sheet1")

    Set ws2 = ThisWorkbook.Sheets("Downstairs")

    With ws1
        '~~> Get the last row
        lastrow = .Range("A" & .Rows.Count).End(xlUp).Row

        '~~> Fill formula in all the relevant cells in one go
        '~~> replace my formula within quotes with your formula
        '~~> Do not forget to put the $ sign like I have done
        .Range("D1:D" & lastrow).Formula = "=VLOOKUP(A1,Downstairs!$C$1:$N$200,4,0)"
    End With
End Sub
person Siddharth Rout    schedule 13.09.2013
comment
хорошо, спасибо, я попробую! Я в основном ничего не знаю о VBA, поэтому я начал с метода «укажи и щелкни», формат R1C1 был просто там, поэтому я решил согласиться с ним. Однако я сделал несколько других языков, поэтому я подумал, что это может быть похоже. - person Albert; 14.09.2013