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

时间:2015-11-27 17:29:45

标签: excel vba excel-vba

我已经制作了一个宏来打开两个工作簿并用它们做一些事情。此宏从第三个工作簿运行,该工作簿调用任何其他两个用户选择的工作簿,在它们打开之前,我不知道他们的名字。 所以!我知道Excel 2010没有内置函数来检查工作簿是否处于打开状态,所以我一直在尝试将工作簿与Nothing进行比较,但它并不起作用。我在不同站点发现的解决方法倾向于使用工作簿的名称 还有另一种方法吗?
我们的想法是使用两个用户定义的工作簿运行一个宏,然后,可能在相同的工作簿中重新运行它,但Excel让我感到温暖,因为我放弃了更改。 也许一个解决方法可能是告诉excel何时提示重新打开,而不是重新打开并处理该错误只是使用相同的工作簿,至少,我知道部分或名称将如何。
例如,一个人将有文本" cluster"在其中,另一个词是"翻译"所以,也许在下一个循环中,我可以找到并使用我需要的工作簿,但只是如果我已经检查过它是否打开。或者,这种方式是否有效,看它是否已经打开?

 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也是如此,但是在不同的单元格中,我也试图创建一个函数来解析并在完整路径中使用文件名(然后我发现了命令Dir lol)但是当我传递文件名时,没有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

2 个答案:

答案 0 :(得分:1)

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

对您的程序进行了一些小的修改structure。类似于您尝试测试工作簿变量是什么,只有您必须首先尝试设置变量,您执行它的方式将始终返回空,因为您之前没有尝试设置它。我也测试了翻译工作簿,因为它也可能是开放的。

我假设E5E6中的值包含工作簿的FullName(即路径+文件名),而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()打开工作簿   我的功能返回失败了吗?在这里我的问题分成两部分......   第一:用我的功能,如果我把一个字符串作为一个字符串,它是否会起作用   争论?或者,在将其作为参数传递之前,我需要分配   我的函数对变量的结果?
  2.   

不确定为什么它不起作用,按照指示更改程序。

我使用此函数测试了上述过程,从Filename中提取Fullname并且它有效:

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

请记住,您没有单独使用该行,它很可能具有以下内容:

set Workbook = Application.Workbooks("clusterworkbook")

因此命令是设置一个变量,而不是打开工作簿,因此这种情况的唯一情况是工作簿已经打开,因此变量已设置。失败的时间是当工作簿未打开并且您尝试设置变量时,给出错误。

建议访问这些页面 Excel ObjectsOn Error Statement

答案 1 :(得分:1)

我一直在使用以下代码来确定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