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

在VBA中,我的VLOOKUP需要更新值,vba,excel,vlookup,getopenfilename,Vba,Excel,Vlookup,Getopenfilename,我正在编写一个脚本,它需要打开第二个工作簿并在第二个工作簿中运行VLOOKUP。当第二个工作簿的文件名为“testlookup.xlsx”时,它可以很好地工作,但当我将文件名更改为“hippity hop 1251225253.xlsx”时,它会打开一个窗口,显示“Update Values:1251225253”,然后VLOOKUP失败。无论文件名是什么,我怎样才能使代码正常工作 fpath = Application.GetOpenFilename(, , "Select the CMS A

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

可能发生的部分情况是,您使用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

这将返回文件的完整路径。

如果您对文件名的描述正确,问题是您使用的文件名中包含空格字符,这将导致VLookup失效。您需要在公式中的文件名周围添加单引号字符,因此:

"=VLOOKUP(RC[-2], '" & CStr(fname) & "'!C1:C2, 2, FALSE)"
我可能有点不对劲,因为您说过,当文件名中没有空格时,它可以工作,但您还应该在公式字符串中包含工作表名称,因此您的公式看起来更像这样:

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

是否可以使用debug.print fname来显示它是否正确地将引用包装在“”中?由于工作表名称中有空格,因此需要这样做才能使公式有效。这很有效!非常感谢。我曾在其他一些线程中提到过这是解决方案,但代码不同,因此没有意义。但现在是这样了!