2017-02-17 21 views
0

Я пишу сценарий, который требует открытия второй книги и запуска VLOOKUP во второй книге. Он отлично работает, когда имя второй книги «testlookup.xlsx», но когда я изменил имя файла на «hippity hop 1251225253.xlsx», он открывает окно с надписью «Обновить значения: 1251225253», а затем сбой VLOOKUP. Как я могу заставить код работать независимо от имени файла?В VBA моему VLOOKUP необходимо обновить значения

fpath = Application.GetOpenFilename(, , "Select the CMS All Assets exported CSV") 
fname = Dir(fpath) 

Workbooks.Open (fpath) 
Set openedBook = Application.ActiveWorkbook 
Set assetBook = openedBook.Worksheets(1) 
ActiveWindow.WindowState = xlMinimized 

checkWkbk.Activate 
With dupeSheet 
    'determine last row 
    lr = .Cells(Rows.count, 1).End(xlUp).Row 
    'vlookup from C2:CEnd 
    .Range(.Cells(2, 3), .Cells(lr, 3)).FormulaR1C1 = _ 
     "=VLOOKUP(RC[-2], " & CStr(fname) & "!C1:C2, 2, FALSE)" 
End With 
+0

вы можете Debug.Print FName, чтобы показать правильно ли он заворачивает ссылку в '? это необходимо для того, чтобы формула была действительной из-за пространства в имени листа. – Zerk

ответ

1

Если ваше имя файла соответствует действительности, проблема заключается в том, что вы используете имя файла с пробелами в нем, что отбрасывает VLookup. Вам нужно положить одну кавычки вокруг имени файла в формуле, таким образом:

"=VLOOKUP(RC[-2], '" & CStr(fname) & "'!C1:C2, 2, FALSE)" 

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

"=VLOOKUP(RC[-2], '[" & CStr(fname) & "]" & assetBook.name & "'!C1:C2, 2, FALSE)" 
+0

Это сработало! Спасибо! Я видел упоминание того, что это решение в некоторых других потоках, но код был другим, поэтому это не имело смысла. Но это происходит сейчас! – DukeSilver

0

Часть того, что может происходить в использовании ActiveWorkbook найти книгу вам нужно против найти учебное пособие по правильному имени. Я использую ниже подпрограмму для этой цели:

Sub Get_Workbook_Object(sPath As String, wbHolder As Workbook) 
    Dim wb As Workbook 

    If Len(sPath) > 0 Then 
     ThisWorkbook.FollowHyperlink (sPath) 
    Else 
     Exit Sub 
    End If 

    For Each wb In Workbooks 
     If wb.FullName = sPath Then 
      Set wbHolder = wb 
      Exit Sub 
     End If 
    Next 
End Sub 

Чтобы использовать этот код, вы можете добавить подпрограмму модуля, а затем вызвать его с чем-то вроде:

Get_Workbook_Object fPath, openedBook 

Dir() Также не собирается верните полный путь, он только вернет соответствующее имя файла. Например, он может возвращать «Hippity Hop.xlsx» вместо «C: Users \ Hippity Hop.xlsx», где первая часть - это фактический путь к файлу. Вместо этого вы можете использовать что-то вроде этого:

With Application.FileDialog(msoFileDialogFilePicker) 
    .Title = "Please select the CMS All Assets exported CSV" 
    .Show 
    If .SelectedItems.Count = 1 Then 
     fpath = .SelectedItems(1) 
    Else 
     MsgBox "Please choose at least one file" 
     Exit Sub 
    End If 
End With 

Это вернет полный путь к файлу.