从具有变量名称的已关闭工作簿获取信息

时间:2017-09-14 14:49:19

标签: excel vba excel-vba

我想知道是否有办法不用打开工作簿来获取信息。问题是我让用户首先选择文件,因为名称更改。所以我使用的是Application.GetOpenFilename。一旦他们选择它,因为它实际上没有打开,我试图从那里抓住一些细胞并将它们复制过来。我有一些其他单元使用vlookup以相同的方式引用工作簿,但这看起来不同或不会工作。这是代码:

Dim Window3 As String
Dim x As String
Dim lNewBracketLocation As Long
Dim shtName As String


' Prompt
strPrompt = "Please select the last 'HC Report' located in" & vbCrLf & _
    "'C:\file\file\'" & vbCrLf & _
    "before the dates of this Report." & vbCrLf & _
    "This will be used to find the Interns that are currently working." & vbCrLf & _
    "For example, if the date of this report is 9-8-17, you would want to use the 'August 2017.xlsx.' report."

' Dialog's Title
strTitle = "Latest Report"

'Display MessageBox
iRet = MsgBox(strPrompt, vbOK, strTitle)

Window3 = Application.GetOpenFilename( _
    FileFilter:="Excel Files (*.xls*),*.xls*", _
    Title:="Choose previous quarter's file", MultiSelect:=False)

MsgBox "You selected " & Window3

'below is some extra code from where I used this same startegy for VLOOKUP. 
'Not sure if this "x" variable will be needed.

lNewBracketLocation = InStrRev(Window2, Application.PathSeparator)
'Edit the string to suit the VLOOKUP formula - insert "["
x = Left$(Window2, lNewBracketLocation) & "[" & Right$(Window2, Len(Window2) - lNewBracketLocation)

Dim wb3 As Workbook

'I want to do all of this WITHOUT opening this next file. Is that possible?
' If I open this file it works. but I am trying to do it without opening. 
'Because it takes a minute
'Set wb3 = Workbooks.Open(Window3)


shtName = wb3.Worksheets("Team Members").name
'*******RIGHT here IS WHERE IT ERRORS******************
'Run-time error '91':
'Object variable or With block variable not set



Stop


wb3.Sheets(shtName).Select
ActiveSheet.Range("$A$1:$P$2769").autofilter Field:=1, Criteria1:="Interns"
Range("A2768").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.COPY

这是我的一些其他代码,它在不实际打开其他文件的情况下获取vlookup。我可以做同样的事情吗?我无法让它发挥作用。

Dim Window2 As String
Dim x As String
Dim lNewBracketLocation As Long

Window2 = Application.GetOpenFilename( _
    FileFilter:="Excel Files (*.xls*),*.xls*", _
    Title:="Choose previous quarter's file", MultiSelect:=False)

MsgBox "You selected " & Window2
'Find the last instance in the string of the path separator "\"
lNewBracketLocation = InStrRev(Window2, Application.PathSeparator)
'Edit the string to suit the VLOOKUP formula - insert "["
x = Left$(Window2, lNewBracketLocation) & "[" & Right$(Window2, Len(Window2) - lNewBracketLocation)

shtName = ActiveWorkbook.Worksheets(1).name


Stop


MainWindow.Activate
Columns("B:B").Select
Selection.Delete Shift:=xlToLeft
Range("AI2").FormulaR1C1 = "=VLOOKUP(RC2,'" & x & "]shtName'!R3C2:R9694C49, 23, FALSE)"
Range("AJ2").FormulaR1C1 = "=VLOOKUP(RC2,'" & x & "]shtName'!R3C2:R9694C49, 19, FALSE)"
Range("AK2").FormulaR1C1 = "=VLOOKUP(RC2,'" & x & "]shtName'!R3C2:R9694C49, 20, FALSE)"
Range("AL2").FormulaR1C1 = "=VLOOKUP(RC36,'" & x & "]shtName'!R3C2:R9694C49, 23, FALSE)"

1 个答案:

答案 0 :(得分:1)

不可能从已关闭的工作簿中复制单元格。 vlookup是一个不同的故事,因为Excel缓存了外部工作簿关闭时显示的结果副本。

就像您尝试做的那样,即您需要打开外部文件一次才能获取数据。使用vlookup将公式输入/粘贴到工作表中。此时,当您从Update Values:Book1.xlsm文件选择对话框中选择文件时,外部工作簿必须打开或Excel在后台打开它。使用您的代码,当您想要获取数据时。您 必须 打开它才能自己缓存数据

但是,您可以使用以下方法解决时间问题:

Application.Calculation = xlCalculationManual
Set wb3 = Workbooks.Open(Window3)

然后关闭工作簿后,这个:

Application.Calculation = xlCalculationAutomatic