在VBA中,我的VLOOKUP需要更新值

我正在编写一个脚本,需要打开第二个工作簿并在第二个工作簿中运行VLOOKUP。 当第二个工作簿的文件名是“testlookup.xlsx”,但是当我将文件名更改为“hippity hop 1251225253.xlsx”时,它会完美工作,它会打开一个窗口,显示“更新值:1251225253”,然后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 

如果你对文件名的描述是正确的,问题是你正在使用一个空格字符的文件名,这是closuresVLookup。 您需要在公式中的文件名称周围放置单引号字符,因此:

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

我可能会偏离这一点,因为你说它的工作原理是当你在文件名中没有空格,但是你也应该在公式string中包含工作表名,所以你的公式看起来更像这样:

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

部分原因可能是您使用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()不会返回完整path,它只会返回相应的文件名。 例如,它可能会返回“Hippity Hop.xlsx”而不是“C:Users \ Hippity Hop.xlsx”,其中第一部分是实际的文件path。 你可能想用这样的东西代替:

 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 

这将返回文件的完整path。