我正在编写一个脚本,需要在第二个工作簿中打开第二个工作簿并运行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
答案 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
这将返回文件的完整路径。