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

时间:2017-02-17 15:40:32

标签: excel vba excel-vba vlookup getopenfilename

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

2 个答案:

答案 0 :(得分:1)

如果你对文件名的描述是正确的,那么问题是你正在使用其中包含空格字符的文件名,这会抛弃VLookup。您需要在公式中的文件名周围放置单引号字符,因此:

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

我可能会偏离这一点,因为你说它在文件名中没有空格时有效,但你还应该在公式字符串中包含工作表名称,所以你的公式看起来更多像这样:

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

答案 1 :(得分: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

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