Excel VBA,打开新应用程序:Microsoft Excel正在等待另一个应用程序完成OLE操作



我具有以下VBA代码。它创建了新的Excel应用程序并使用它打开文件。然后,它在此文件中介绍了一些单元格的值。

Sub TestInvis()
        Dim ExcelApp As Object
        Set ExcelApp = CreateObject("Excel.Application")
        Dim WB As Workbook
        Set WB = ExcelApp.Application.Workbooks.Open("Y:vbatest_reservestest_data503317-3_FO_001-2582480.XLS")
        Dim title As String
        title = WB.Worksheets(1).Cells(5, 4).Value
        MsgBox (title)
        WB.Save
        WB.Close
        ExcelApp.Quit
        Set ExcelApp = Nothing
End Sub

问题是,在msgboxing后,它会减慢并最终给出Microsoft Excel is waiting for another application to complete an OLE action窗口。为什么这样做?并不是要实施任何硬命令。我应该如何处理?

发生这种情况,因为ExcelApp中的Excel实例最有可能等待用户输入。

您可以尝试添加ExcelApp.DisplayAlerts = False以跳过可能存在的所有弹出窗口。

另外,在故障排除添加行ExcelApp.Visible = True时,您可以在第二个实例中查看发生的事情并在此处进行故障。

我在以下情况下遇到了这个问题:

  • 应用程序实例打开了警报,它正在等待用户输入。
  • 打开文件时,它会在以前打开文件时出现有关崩溃的消息,以及我是否要打开保存的版本还是内存版本(尽管这应该在msgBox之前发生(
  • 如果您多次运行代码并崩溃,则可能仅将文件打开为读取,因为还有另一个隐藏的实例将其锁定(检查您的任务管理器中的其他Excel进程(
  • (

请保证,无论如何,问题本身都不适合您的代码 - 它在这里运行良好。

对我有用的代码。

您可以从filedialog中选择文件。在评论中,您的代码可以关闭工作簿而不保存更改。希望它有帮助。

Option Explicit
Sub Import(Control As IRibbonControl)
Dim fPath As Variant
Dim WB As Workbook
Dim CW As Workbook

On Error GoTo ErrorHandl
Set CW = Application.ActiveWorkbook
fPath = Application.GetOpenFilename(FileFilter:="Excel file, *.xl; *.xlsx; *.xlsm; *.xlsb; *.xlam; *.xltx; *.xls; *.xlt ", Title:="Choose file You want to openn")
If fPath = False Then Exit Sub
Application.ScreenUpdating = False
Set WB = Workbooks.Open(FileName:=fPath, UpdateLinks:=0, IgnoreReadOnlyRecommended:=True)
Set WB = ActiveWorkbook
MsgBox("File was opened.")
'Application.DisplayAlerts = False
'WB.Close SaveChanges:=False
'Application.DisplayAlerts = True
'MsgBox ("File was closed")
Exit Sub

ErrorHandl:
MsgBox ("Error occured. It is probable that the file that You want to open is already opened.")
Exit Sub
End Sub

这些方法都不适合我。我正在为VBA的MATLAB打电话给DLL,并且会弹出一个长期的模拟,Excel正在等待另一个应用程序操作,要求我单击它以使程序继续进行,有时还要多次。最后,此代码可以使用(保存在新模块中(:https://techisours.com/microsoft-excel-is-waiting-for-another-application-to-complete-complete-an-ole-action/

我使用它的方式有些棘手,因为指示不会告诉您(在此处和其他地方(,这会导致各种VBA错误,因此我将其添加到Excel 365中的功能的描述中:

创建一个名为" toggleolewarning"的新模块。(或在任何新模块中,重要的!(仅包含以下代码:

Private Declare Function CoRegisterMessageFilter Lib "ole32" (ByVal IFilterIn As Long, ByRef PreviousFilter) As Long
Public Sub KillOLEWaitMsg()  
Dim IMsgFilter As Long
CoRegisterMessageFilter 0&, IMsgFilter
End Sub
Public Sub RestoreOLEwaitMsg()
Dim IMsgFilter As Long
CoRegisterMessageFilter IMsgFilter, IMsgFilter
End Sub

然后在您的主要功能中,只需用几行装饰长期运行的OLE动作:

Call KillOLEWaitMsg
'call your OLE function here'
Call RestoreOLEwaitMsg

它终于起作用了。希望我能为我的项目工作花费一个一两个小时的时间。

最新更新