0

我正在编写一个脚本,需要打开第二个工作簿并在第二个工作簿中运行 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
4

2 回答 2

1

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

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

我可能对此有点不满意,因为您说当文件名中没有空格时它可以工作,但是您还应该在公式字符串中包含工作表名称,因此您的公式看起来更像这样:

"=VLOOKUP(RC[-2], '[" & CStr(fname) & "]" & assetBook.name & "'!C1:C2, 2, FALSE)"
于 2017-02-17T15:54:51.180 回答
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

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

于 2017-02-17T15:54:18.880 回答