Excel VBA - 显式引用当前应用程序实例

时间:2018-05-08 15:16:09

标签: excel vba excel-vba user-defined-functions

以下代码是一个函数,它将目标工作簿的名称作为输入,以检查是否已打开,以及可以打开它的excel应用程序实例。然后,该函数将循环通过该应用程序实例中的打开的工作簿。如果目标工作簿已打开,则返回工作簿对象。如果尚未打开,则打开目标工作簿,然后返回。

我正在尝试对待" app"参数作为可选输入,因为通常只有一个Excel实例。但是,使用以下格式,我得到以下编译错误:"需要常量表达式。"

Function wbOpen(currFile, Optional app As Application = Application) As Workbook

    Dim oWB As Workbook

    currFile = StrConv(currFile, vbLowerCase)

    For Each oWB In app.Workbooks

        oWBName = StrConv(oWB.name, vbLowerCase)
        If oWBName = currFile Then

            fileOpen = True
            Exit For

        End If

    Next oWB

    If Not fileOpen Then Set oWB = Workbooks.Open(currFile)

    Set wbOpen = oWB

End Function

每当我在方法中引用当前的应用程序时,我只需编写"应用程序。[方法或属性]"。

如何显式引用活动的Excel应用程序实例,以便将其作为" app"的默认值。争论?

如果可能的话,我宁愿没有" app"没有默认值,然后检查代码中的值是否为nil。

2 个答案:

答案 0 :(得分:1)

当尝试返回需要常量表达式的对象时,检查代码中的表达式是否为空,然后将其设置在那里(我通常在将正确的工作簿作为可选工作簿返回时执行此操作 - 即ThisWorkbook) 。

我不确定这样返回应用程序的可行性 - 我从未尝试过。

Public Function wbOpen(currFile As String, Optional app As Application) As Workbook

    Dim oWB As Workbook

    If app Is Nothing Then
        Set app = Application
    End If

    currFile = StrConv(currFile, vbLowerCase)

    For Each oWB In app.Workbooks

        oWBName = StrConv(oWB.Name, vbLowerCase)
        If oWBName = currFile Then

            fileOpen = True
            Exit For

        End If

    Next oWB

    If Not fileOpen Then Set oWB = Workbooks.Open(currFile)

    Set wbOpen = oWB

End Function  
  

如果可能的话,我宁愿不让“app”没有默认值   然后检查代码中的值是否为nil。

......我不知道是否还有其他办法。

答案 1 :(得分:0)

我已经使用其他excel应用程序在后台处理数据,然后在退出之前我关闭了所有其他实例。我的代码可以帮助一些人。

Public Sub CloseAllOtherExcel()
    Dim objExcel As Object
    Dim lngMyHandle As Long
    Dim strMsg As String

On Error GoTo ErrorHandler
    lngMyHandle = Application.hwnd

    Set objExcel = GetObject(, "Excel.Application")
    Do While TypeName(objExcel) = "Application"
        If objExcel.hwnd <> lngMyHandle Then
            Debug.Print "found another Excel instance: " & _
                objExcel.hWndExcelApp
            obExcel.Quit acQuitSaveNone
        Else
            Debug.Print "found myself"
            Exit Do
        End If
        Set objExcel = GetObject(, "Excel.Application")
    Loop

'ExitHere
    Set objExcel = Nothing
    On Error GoTo 0
    Exit Sub

ErrorHandler:
    strMsg = "Error " & Err.Number & " (" & Err.Description _
        & ") in procedure CloseAllOtherExcel"
    MsgBox strMsg
    GoTo ExitHere
End Sub