Поиск VBA в другой книге

У меня проблема с VBA с Excel. Поэтому у меня есть эта книга «Book Tool – Обновлено февраль 2017.xlsb», которую я сейчас обновляю и буду распространять около 10 членов команды, чтобы отслеживать их работу. То, что я пытаюсь сделать, – это данные поиска из внешнего документа «Данные команды», поместите это в колонку DE файла «Book Tool – Обновленный февраль 2017.xlsb». Поэтому я написал код ниже, где, когда член команды нажимает кнопку, он открывает файл поиска, ищет данные в столбце A листа «SICcode» этого внешнего файла, соответствует ему в столбце B «Книги» Лист "файла« Инструмент книги »и возвращает значение в столбце D файла поиска. Он работает для длины «Книжного листа», закрывает внешний файл, и вы получаете всплывающее окно, которое добавляет данные.

Теперь, когда я сам сделал этот код, он отлично работает. Автоматически открывал внешний документ, выполнял поиск, возвращал правильное значение, закрывал внешний документ, всплывал. Поэтому я отправил файл с макросом моему менеджеру, чтобы поиграть, прежде чем отдавать его остальной части моей команды, но макрос не работает. Когда макрос запускается, открывается внешний документ, кажется, что он просматривает запросы, закрывает внешний файл, и появляется всплывающее окно, но в столбце DE нет значения, и там нет формулы поиска. Мой менеджер не изменил название документа Tool, он не возился с каким-либо кодом. Он отправил мне письмо по электронной почте, и с этой копией формула не работает, но я проверил ее с помощью моей основной формулы копирования, и даже если это то же самое, макрос не будет заполнять данные.

Мы должны хранить внешние данные в отдельном файле, потому что в противном случае инструмент с данными поиска превышает 2 МБ и требует навсегда выполнения или сбоев.

Есть ли что-то в том, что вы отправляете по электронной почте инструмент туда и обратно, который испортится с файлом, или есть какая-то проблема форматирования, которую мне нужно изучить, что заставляет ее не работать? С моей главной копией на моем компьютере код всегда работает независимо от того, работаю ли я на виртуальном рабочем столе, в другой папке.

Я просто в порядке с vba, я не знаю всех технических аспектов этого процесса, поэтому, возможно, я упускаю из виду некоторые недостатки в том, как я настроил это или ограничения Excel. Любые рекомендации или помощь будут оценены.

Sub AddData() On Error Resume Next 'Open External Data Source Workbooks.Open Filename:= _ "W:\USB\Reporting\Book Tool\Attachments\Team Data.xls" 'View sheet where data will go into Windows("Book Tool - Updated Feb. 2017.xlsb").Activate 'Gets last row of Tool sheet Sheets("Book").Select lastrow = Cells(Rows.Count, "B").End(xlUp).Row 'Lookup in External File Sheets("Book").Select Range("DE2:DE" & lastrow).FormulaR1C1 = "=VLOOKUP(RC[-108],'[Team Data.xls]SICcode'!C[-109]:C[-104],5,FALSE)" 'Close External Data File Windows("Team Data.xls").Activate ThisWorkbook.Saved = True Application.DisplayAlerts = False ActiveWindow.Close MsgBox "Data Add Done" End Sub 

Обязательно должным образом квалифицируйте свои заявления, а также было бы целесообразно назначить соответствующую книгу переменной. См. Измененный код ниже:

 Sub AddData() On Error Resume Next ' I also suggest removing this since it wont warn you on an error. Dim wb as Workbook Dim wbExternal as Workbook Dim ws as Worksheet Dim wsExternal as Worksheet 'Open External Data Source Set wbExternal = Workbooks.Open Filename:= _ "W:\USB\Reporting\Book Tool\Attachments\Team Data.xls" ' Depending on the location of your file, you may run into issues with workbook.Open ' If this does become an issue, I tend to use Workbook.FollowHyperlink() 'View sheet where data will go into ' Windows("Book Tool - Updated Feb. 2017.xlsb").Activate ' Set wb = ActiveWorkbook ' As noted by Shai Rado, do this instead: Se wb = Workbooks("Book Tool - Updated Feb. 2017.xlsb") ' Or if the workbook running the code is book tool ' Set wb = ThisWorkbook 'Gets last row of Tool sheet Set ws = wb.Sheets("Book") lastrow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row 'Lookup in External File Set wsExternal = wbExternal.Sheets("Book") wsExternal.Range("DE2:DE" & lastrow).FormulaR1C1 = "=VLOOKUP(RC[-108],'[Team Data.xls]SICcode'!C[-109]:C[-104],5,FALSE)" 'Close External Data File ThisWorkbook.Saved = True Application.DisplayAlerts = False Windows("Team Data.xls").Close MsgBox "Data Add Done" End Sub 

Я также рекомендовал бы просматривать SO для советов по избежанию. .Activate и .Activate поскольку это может сделать ваш код ненадежным и в некоторых случаях может значительно замедлить ваш код.

Наконец, если производительность является проблемой, вы можете захотеть посмотреть в свои значения поиска в массивы и найти соответствующие значения таким образом. Это полностью зависит от того, с какими данными вы работаете. У меня была рабочая книга с использованием заполняющих vlookups, которые перешли от работы в течение 5-10 минут или более, чтобы последовательно работать менее чем за 20 секунд, заменив VLOOKUPS на петлевые массивы.

Давайте будем гением компьютера.