2017-02-17 3 views
1

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

Теперь, когда я сам сделал этот код, он отлично работает. Автоматически открывал внешний документ, выполнял поиск, возвращал правильное значение, закрывал внешний документ, всплывал. Поэтому я отправил файл с макросом моему менеджеру, чтобы поиграть, прежде чем отдавать его остальной части моей команды, но макрос не работает. Когда макрос запускается, открывается внешний документ, кажется, что он просматривает запросы, закрывает внешний файл, и появляется всплывающее окно, но в столбце 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 
+1

Избавьтесь от инструкции 'On Error Resume Next' и отлаживайте код, чтобы узнать, где находятся ошибки. Наконец, отправьте макрос своему начальнику только после того, как вы сделали это заявление бесполезным – user3598756

+0

у вас слишком много неквалифицированных объектов, и слишком много «Активировать» и «Выбрать» –

ответ

1

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

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 советы по избегая .Select и .Activate как это может сделать ваш код ненадежны и в некоторых случаях может замедлить ваш код значительно.

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

+0

Зачем вам нужно «Windows (« Book Tool »- Обновлено февраль 2017 г. .xlsb "). Активировать' и 'Установить wb = ActiveWorkbook', почему бы не использовать' Set wb = Workbooks («Book Tool - Обновлено Feb. 2017.xlsb») '? –

+0

Кроме того, полностью квалифицируйте 'lastrow = ws.Cells (Rows.Count,« B »). End (xlUp) .Row' to' lastrow = ws.Cells (ws.Rows.Count, «B»). End (xlUp).Row' –

+0

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

Смежные вопросы