以下代码是一个函数,它将目标工作簿的名称作为输入,以检查是否已打开,以及可以打开它的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。
答案 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