如果Excel工作簿已经打开,则...... VBA

5

我该如何编写代码来表达。

    Dim xlApp As Excel.Application
    Dim xlWorkbook As Excel.Workbook
    Dim xlWorksheet As Excel.Worksheet

如果一个 工作簿已经打开,则...
    Set xlApp = GetObject(, "Excel.Application")

    elseif xlApp is nothing then
    Set xlApp = New Excel.Application
    xlApp.Visible = True
    Set xlWorkbook = xlApp.Workbooks.Open("E:\InspectionCreator\InspectionSheet.xlsx")
End if

我不希望它必须是特定的工作簿,只要是任何工作簿即可。我似乎在互联网上找不到任何信息。任何帮助都将是很棒的。


1
这段代码将在哪里运行? - Tim Williams
你是否在考虑使用VBScript? - Fionnuala
代码将在SolidWorks中运行,它几乎像VB6一样独立。 - Russell Saari
3个回答

7

首先尝试使用getobject:如果它抛出错误,则使用createobject:

  Dim xlApp As Excel.Application

  On Error Resume Next
  Set xlApp = GetObject(, "Excel.Application")
  On Error GoTo 0

  If xlApp Is Nothing Then
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
  End If

如果xlapp为空,则第一部分无法正常工作,这是我遇到的问题。 - Russell Saari

3

我以前运行的代码与Tim非常相似,直到Kevin Jones在一个Experts-Exchange帖子中指出了以下内容(因为EE帖子在付费墙后面,所以我将在此重复)。

"请注意,使用CreateObject函数通过自动化启动Excel时,Excel不会加载任何插件或其他通常自动加载的工作簿。这不是启动用户将使用的Excel会话的好方法。要启动一个Excel应用程序实例,而不是使用Excel之外的任何应用程序进行自动化,必须使用非自动化手段启动Excel应用程序。下面的代码说明了执行此操作的步骤。该代码首先尝试获取现有应用程序实例的自动化句柄。如果没有找到现有实例,则使用Shell命令启动新实例。"

 Dim ExcelApplication As Object
   Dim TimeoutTime As Long

   On Error Resume Next
   Set ExcelApplication = GetObject(, "Excel.Application")
   On Error GoTo 0
   If ExcelApplication Is Nothing Then
       Shell "Excel.exe"
       TimeoutTime = Timer + 5
       On Error Resume Next
       Do
           DoEvents
           Err.Reset
           Set ExcelApplication = GetObject(, "Excel.Application")
       Loop Until Not ExcelApplication Is Nothing Or Timer > TimeoutTime
       On Error GoTo 0
   End If
   If ExcelApplication Is Nothing Then
       MsgBox "Unable to launch Excel."
   Else
       ' Do something with the Excel instance...
   End If

我喜欢这个概念。它将使您的应用程序更加健壮。最好告诉用户无法启动Excel,而不是典型的“无法创建对象”。 - Ben

1

这可能有些偏离方向,但以下是过去我使用过的一些东西...

    If Workbooks.Count > 1 Then 'Or in your case = 0
       'Do Something Here'
    Else
       'Do Something Else'
    End If

这样它就会告诉你是否有多个工作簿处于打开状态。否则,听起来你正在寻找特定的打开项。

希望能对你有所帮助。


真不敢相信那个能够工作,这是一个很棒的解决方案。谢谢! - Russell Saari
随时可以,没错。我最喜欢优雅简洁的解决方案。 - TheFuzzyGiggler
鉴于您正在自动化Excel,我不明白上面的代码是如何工作的 - Workbooks.Count 用于在活动应用程序内运行VBA。 - brettdj
不过,如果他使用的程序使用了Office类的组合,那么它可能被编程为说“告诉我此时有多少个工作簿类是打开的”。显然,这确实起作用了。但你说得对,我总是在其他Excel表格中使用它。通常是隐藏窗口,使表单看起来像它们自己的程序。 - TheFuzzyGiggler
这里总是有一些自以为是的程序员,我讨厌这种情况。 - Russell Saari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接