【发布时间】:2016-03-01 22:44:30
【问题描述】:
我制作了一个宏来打开两个工作簿并用它们做一些事情。此宏从第三个工作簿运行,该工作簿调用任何其他两个用户选择的工作簿,在打开它们之前,我不知道它们的名字。
所以!我知道 Excel 2010 没有内置函数来检查工作簿是否打开,所以我一直在尝试将工作簿与 Nothing 进行比较,但它不起作用,而且我在不同站点中找到的每种解决方法都倾向于使用工作簿的名称。
还有另一种方法吗?
这个想法是用两个用户定义的工作簿运行一个宏,然后,也许,在同一个工作簿中重新运行它,但 Excel 让我放弃了更改。
也许一种解决方法可能是在提示重新打开时告诉 excel,而不是重新打开并处理该错误以仅使用相同的工作簿,至少我知道部分或名称将是多少。
例如,一个里面会有文本“cluster”,另一个是“translation”,所以,也许在像
下一个这样的循环中,我可以找到并使用我需要的工作簿,但如果我已经检查过它是否打开.或者,这种方式是否可以查看是否已经打开?
For each wbk in Application.Workbooks
If wbk.Name Like "*cluster*" Then
WorkingWorkbook = wbk.Name
End If
next
我的代码如下:
Sub structure()
Application.ScreenUpdating = False
Dim translationWorkbook As Worksheet
Dim clusterWorkbook As Workbook
If Not clusterWorkbook Is Nothing Then
Set clusterWorkbook = Application.Workbooks.Open(ThisWorkbook.Sheets(1).Range("E5").Value2)
Else
Set clusterWorkbook = Application.Workbooks(parseFilePath(ThisWorkbook.Sheets(1).Range("E5")))
End If
Set translationWorkbook = Application.Workbooks.Open(ThisWorkbook.Sheets(1).Range("E6").Value2).Worksheets("String_IDs_Cluster") 'Translation table target for completing
End Sub
传递给Workbooks.Open 的参数是我的下一个函数在工作表中写入的参数:
Private Sub MS_Select_Click()
Dim File As Variant
Dim Filt As String
Filt = "Excel 97-2003 File(*.xls), *.xls," & "Excel File(*.xlsx),*.xlsx," & "Excel Macro File (*.xlsm),*.xlsm"
File = Application.GetOpenFilename(FileFilter:=Filt, FilterIndex:=2, Title:="Select Menu Structure File")
If File = False Or File = "" Then
MsgBox "No File Selected"
Exit Sub
End If
ThisWorkbook.ActiveSheet.Range("E5").Value2 = File
End Sub
translationWorkbook 相同,但位于不同的单元格中Application.Workbooks(file) 的 xls 扩展名向我发送“下标范围错误”。
为什么会这样?
基本上我的问题是:
- 如何检查并使用打开的工作簿?要么通过处理 excel 提示错误或未尝试重新打开同一个文件。
- 为什么尝试使用
Application.Workbooks()打开工作簿并返回我的函数会失败?在这里,我的问题分为两部分......首先:使用我的函数,如果我给出一个字符串作为参数,它不会起作用吗?或者,在将它作为参数传递之前,我需要将函数的结果分配给一个变量? - 第二:如果我尝试打开像
Application.Workbooks("clusterworkbook")这样的工作簿,它会向我发送另一个“下标错误”,但是,在我使用文件对话框提示之前,我这样做了并且工作正常。
我们将不胜感激。
编辑
函数 ParseFilePath 添加:
Function parseFilePath(fullpath As Range) As String
Dim found As Boolean
Dim contStart As Integer
Dim contEnd As Integer
contEnd = InStr(fullpath, ".") - 1
contStart = contEnd
found = False
Do While found = False
If fullpath.Characters(contStart, 1).Text = "\" Then
found = True
Else
contStart = contStart - 1
End If
Loop
parseFilePath = fullpath.Characters(contStart + 1, (contEnd - contStart)).Text
End Function
【问题讨论】: