如何检查工作簿是否打开并使用它

我已经做了一个macros,打开两个工作簿,并与他们做一些东西。 该macros从第三个工作簿运行,该工作簿调用其他两个用户select的工作簿,在打开之前,我不知道他们的名字。 所以! 我知道Excel 2010没有内置的函数来检查工作簿是否打开,所以我一直在尝试将工作簿与Nothing进行比较,但它不起作用,并且我在不同的站点中find的每个解决方法都倾向于使用工作簿的名称。
有没有另外一种方法呢?
这个想法是用两个用户定义的工作簿运行一个macros,然后,也许在相同的工作簿中重新运行它,但是Excel会使我放弃更改。
也许一个解决办法可能是告诉excel,当它提示重新打开时,不要重新打开并处理该错误,只使用相同的工作簿,至less,我知道部分或名称是如何。
例如,一个会有文本“集群”,另一个是“翻译”这个词,也许就像循环一样
下一个,我可以find并使用我需要的工作簿,但只是如果我已经检查,如果它是开放的。 或者,这样做是否已经打开了?

  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,但在不同的单元格,而且,我试图创build一个函数来parsing和使用完整path中的文件名(然后我发现了命令Dir lol),但是当我通过文件名,没有xls扩展名Application.Workbooks(file)它给我一个“下标范围错误”。
为什么会这样?
基本上我的问题是:

  • 我如何检查打开的工作簿并使用它? 要么通过处理excel的提示错误,要么不尝试重新打开相同的文件。
  • 为什么试图用Application.Workbooks()与我的函数返回打开工作簿失败? 在这里,我的问题分裂成两个…第一:用我的函数,如果我给一个string作为参数,是不行的? 或者,也许,在作为parameter passing之前,我需要将我的函数的结果分配给一个variables?
  • 第二:如果我尝试打开一个像这样的Application.Workbooks("clusterworkbook")的工作簿,它会向我发送另一个“下标错误”,但在使用文件对话框提示之前,我是这样做的,工作正常。

任何帮助将不胜感激。

编辑

functionParseFilePath添加:

  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 

  1. 我如何检查打开的工作簿并使用它? 要么通过处理excel的提示错误,要么不尝试重新打开相同的文件。

对你的程序structure做了一些小的修改。 类似于你想要testing的工作簿variables是什么,只有你必须首先尝试设置variables,你做这样的方式将永远返回为空,因为你以前没有尝试设置它。 我也testing了翻译工作簿,因为它也可能是开放的。

我假设E5E6的值包含工作簿的FullName (即path+文件名),并且parseFilePath是从FullName提取文件名的函数。

 Sub structure() Application.ScreenUpdating = False Dim clusterWorkbook As Workbook Dim translationWorkbook As Workbook Dim translationWorksheet As Worksheet With ThisWorkbook.Sheets(1) On Error Resume Next Set clusterWorkbook = Application.Workbooks(parseFilePath(.Range("E5").Value2)) On Error GoTo 0 If clusterWorkbook Is Nothing Then Set clusterWorkbook = Application.Workbooks.Open(.Range("E5").Value2) 'Set Translation table target for completing On Error Resume Next Set translationWorkbook = Application.Workbooks(parseFilePath(.Range("E6").Value2)) On Error GoTo 0 If translationWorkbook Is Nothing Then Set translationWorksheet = Application.Workbooks.Open(.Range("E6").Value2).Sheets("String_IDs_Cluster") Else Set translationWorksheet = translationWorkbook.Sheets("String_IDs_Cluster") End If End With End Sub 
  1. 为什么试图用Application.Workbooks()与我的函数返回打开工作簿失败? 在这里,我的问题分裂成两个…第一:用我的函数,如果我给一个string作为参数,是不行的? 或者,也许,在作为parameter passing之前,我需要将我的函数的结果分配给一个variables?

不知道为什么它不工作,改变prodeure所示。

我使用这个函数testing了上面的程序,从Fullname提取Filename Fullname ,它的工作Fullname是:

 Function parseFilePath(sFullName As String) As String parseFilePath = Right(sFullName, Len(sFullName) - InStrRev(sFullName, "\")) End Function 
  1. 第二:如果我尝试打开一个像这样的Application.Workbooks(“clusterworkbook”)的工作簿,它会向我发送另一个“下标错误”,但在使用文件对话框提示之前,我是这样做的,工作正常。

请记住,你并没有单独使用这条线,它最有可能是这样的:

 set Workbook = Application.Workbooks("clusterworkbook") 

所以命令是设置一个variables,而不是打开工作簿,因为这样工作的唯一情况是工作簿已经打开,所以variables被设置。 失败的时候是当工作簿没有打开,并且你试图设置variables,给你一个错误。

build议访问这些页面的Excel对象 , 在错误声明

我一直在使用下面的代码来确定是否打开excel工作簿。 如果是,那么我激活它,做一些东西。 如果没有,我打开它,做一些东西。

 sub test() Dim Ret Ret = IsWorkBookOpen("Your excel workbook full path") If Ret = False Then Workbooks.Open FileName:="Your excel workbook full path", UpdateLinks:=False Else Workbooks("Workbook name").Activate End If end sub Function IsWorkBookOpen(FileName As String) Dim ff As Long, ErrNo As Long On Error Resume Next ff = FreeFile() Open FileName For Input Lock Read As #ff Close ff ErrNo = Err On Error GoTo 0 Select Case ErrNo Case 0: IsWorkBookOpen = False Case 70: IsWorkBookOpen = True Case Else: Error ErrNo End Select End Function