2017-02-17 69 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)" 

我可能會關閉基地,這一點,因爲你說,當你沒有在文件名中的空格它的工作原理,但你也應該包括工作表的名稱在公式字符串,那麼你的公式將看起來更像是這樣的:

"=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 

這將返回文件的完整路徑。