2016-03-25 2 views
1

Кажется, что это должно быть просто, но я действительно застрял на нем.Экземпляр Excel VBA с именем workbook в формуле vlookup в цикле DoWhile

Это код для получения значений из нескольких книг в каталоге и их компиляции в одной книге. Я использую vlookup, потому что значение не всегда находится в одной и той же ячейке, но всегда имеет тот же заголовок строки. Код открывает каждую книгу в каталоге и называет ее wb.

Я хочу ссылаться на wb в формуле Vlookup, но у меня проблемы с этим. Когда я пытаюсь выполнить код ниже, он дает мне ошибку «loop without do» (но когда я запускаю тот же код без формулы, просто копируя и вставляя диапазоны, это нормально). Я также попытался назвать диапазон в wb и ссылаться на это.

'Target File Extension 
    myExtension = "*.xls" 

'Target Path with Ending Extention 
myFile = Dir(myPath & myExtension) 

'Loop through each Excel file in folder 
    Do While myFile <> "" 

'Set variable equal to opened workbook 
    Set wb = Workbooks.Open(fileName:=myPath & myFile) 

'Put ID from filename into sheet 
    If right(wb.Name, 5) = "h.xls" Then 
    wb.Worksheets(1).Range("B16").Select 
    ActiveCell.Value = Left(wb.Name, 9) 

'Get value from wb using Vlookup 
    MasterBook.Activate 
    ActiveCell.Offset(1, 0).Select 
    ActiveCell.FormulaR1C1 = "=VLOOKUP(""Sugar (g)"",wb!R18C1:R28C6,2,FALSE)" 
'Close Workbook 
    wb.Close SaveChanges:=True 

'Get next file name 
    myFile = Dir 
Loop 

'Message Box when done 
    MsgBox "Task Complete!" 

ответ

1

Для формулы вам нужно добавить название рабочей книги в строку. Вы не можете ссылаться на переменную wb, пока она является частью строки. Вам также необходимо указать книгу и имя листа. Fully Qualified Name

Так что я хотел бы предложить что-то вроде следующего, чтобы получить эти имена:

ActiveCell.FormulaR1C1 = "=VLOOKUP(""Sugar (g)"",[" & wb.name & "]" & wb.Worksheet(1).Name & "!R18C1:R28C6,2,FALSE)" 
+0

Спасибо, это сработало отлично! Увидеть имена книг и рабочих листов, изложенные таким образом, имеет большое значение. –

+1

Насколько я понял, одиночные кавычки (или * тики *) всегда должны окружать имя листа. Если они не требуются (например, имя рабочего листа не включает одно или несколько пробелов), то они не навредят. Если они требуются из-за пробелов в имени рабочего листа и их нет, формула будет нарушена. – Jeeped

+0

@jeeped Это хорошая идея. –

0

То, что я делаю в таких ситуациях, заключается в том, чтобы удалить части кода до тех пор, пока он не сработает или не даст другое сообщение об ошибке или что-то еще. Таким образом, вы можете сузить место до ошибки.

Do While .. Loop выглядит хорошо, я думаю, что вам не хватает в End If

If Right(wb.Name, 5) = "h.xls" Then 
    wb.Worksheets(1).Range("B16").Select 
    ActiveCell.Value = Left(wb.Name, 9) 
End If 
+0

Спасибо за подсказку, что фиксированной мою первую проблему. –

1

Вы не можете использовать Range object непосредственно при вводе вместе строку, которая будет использоваться в качестве формулы. Сгруппируйте Range.Address property в строку.

ActiveCell.FormulaR1C1 = "=VLOOKUP(""Sugar (g)"", " & _ 
         wb.Worksheets(1).Range("A18:F28").address(External:=true, ReferenceStyle:=xlR1C1) & _ 
         ", 2, FALSE)" 
'or, 
ActiveCell.Formula = "=VLOOKUP(""Sugar (g)"", " & _ 
         wb.Worksheets(1).Range("A18:F28").address(External:=true) & _ 
         ", 2, FALSE)" 
+0

Мне нравится, что вы использовали .address с внешним свойством. Хороший звонок. –

+0

Спасибо за объяснение, это имеет смысл концептуально. Я играл с этим кодом, но продолжал получать «определенную приложением или объектную ошибку». –

+0

Извините, я подозревал, что диапазон xlR1C1 вызовет проблемы и должен его протестировать. Используйте 'wb.Worksheets (1) .Range (" A18: F28 "). Адрес (...)' в любой формуле. Анкеры ** $ ** не нужны в 'Range (« A18: F28 »)', но они помещаются '.Address' .. – Jeeped

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