Excel 使用VBA在弹出窗口上自动按Enter键

Excel 使用VBA在弹出窗口上自动按Enter键,excel,vba,Excel,Vba,当VBA中出现弹出窗口时,我需要自动按Enter键。问题是生成弹出窗口的代码是一个内置的插件函数,我无法访问它 在这种情况下,如何自动按Enter键 我尝试了Activeworkbook.LockServerFile,但失败。您可以使用SendMessageWin32API向弹出窗口发送WM\u close消息来关闭弹出窗口。您可以使用以下代码检索弹出窗口的窗口句柄,需要使用SendMessage: Option Explicit Private Declare Function FindWi

当VBA中出现弹出窗口时,我需要自动按Enter键。问题是生成弹出窗口的代码是一个内置的插件函数,我无法访问它

在这种情况下,如何自动按Enter键


我尝试了
Activeworkbook.LockServerFile
,但失败。

您可以使用
SendMessage
Win32API向弹出窗口发送
WM\u close
消息来关闭弹出窗口。您可以使用以下代码检索弹出窗口的窗口句柄,需要使用
SendMessage

Option Explicit

Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowText Lib "User32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "User32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long
Private Declare Function GetWindow Lib "User32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function IsWindowVisible Lib "User32" (ByVal hWnd As Long) As Boolean

Private Const GW_HWNDNEXT = 2

Private Sub Test()

    Dim lhWndP As Long
    If GetHandleFromPartialCaption(lhWndP, "Excel") = True Then
        If IsWindowVisible(lhWndP) = True Then
          MsgBox "Found VISIBLE Window Handle: " & lhWndP, vbOKOnly + vbInformation
        Else
          MsgBox "Found INVISIBLE Window Handle: " & lhWndP, vbOKOnly + vbInformation
        End If
    Else
        MsgBox "Window 'Excel' not found!", vbOKOnly + vbExclamation
    End If

End Sub

Private Function GetHandleFromPartialCaption(ByRef lWnd As Long, ByVal sCaption As String) As Boolean

    Dim lhWndP As Long
    Dim sStr As String
    GetHandleFromPartialCaption = False
    lhWndP = FindWindow(vbNullString, vbNullString) 'PARENT WINDOW
    Do While lhWndP <> 0
        sStr = String(GetWindowTextLength(lhWndP) + 1, Chr$(0))
        GetWindowText lhWndP, sStr, Len(sStr)
        sStr = Left$(sStr, Len(sStr) - 1)
        If InStr(1, sStr, sCaption) > 0 Then
            GetHandleFromPartialCaption = True
            lWnd = lhWndP
            Exit Do
        End If
        lhWndP = GetWindow(lhWndP, GW_HWNDNEXT)
    Loop

End Function
选项显式
私有声明函数findwindowlib“User32”别名“FindWindowA”(ByVal lpClassName作为字符串,ByVal lpWindowName作为字符串),长度为
私有声明函数GetWindowText Lib“User32”别名“GetWindowTextA”(ByVal hWnd为长,ByVal lpString为字符串,ByVal cch为长)为长
私有声明函数GetWindowTextLength Lib“User32”别名“GetWindowTextLengthA”(ByVal hWnd As Long)为Long
私有声明函数GetWindow Lib“User32”(ByVal hWnd为Long,ByVal wCmd为Long)为Long
私有声明函数IsWindowVisible Lib“User32”(ByVal hWnd长度)为布尔值
私人建筑GW_HWNDNEXT=2
专用子测试()
暗lhWndP为长
如果GetHandleFromPartialCaption(lhWndP,“Excel”)=True,则
如果IsWindowVisible(lhWndP)=True,则
MsgBox“找到可见窗口句柄:”&lhWndP,vbOKOnly+vbInformation
其他的
MsgBox“找到不可见窗口句柄:”&lhWndP,vbOKOnly+vbInformation
如果结束
其他的
MsgBox“未找到“Excel”窗口!”,vbOKOnly+VBEQUOTION
如果结束
端接头
私有函数GetHandleFromPartialCaption(ByRef lWnd为Long,ByVal sCaption为String)为布尔值
暗lhWndP为长
作为字符串的Dim sStr
GetHandleFromPartialCaption=False
lhWndP=FindWindow(vbNullString,vbNullString)'父窗口
当lhWndP为0时执行此操作
sStr=字符串(GetWindowTextLength(lhWndP)+1,Chr$(0))
GetWindowText lhWndP、sStr、Len(sStr)
sStr=左$(sStr,Len(sStr)-1)
如果仪表(1,sStr,sCaption)>0,则
GetHandleFromPartialCaption=True
lWnd=lhWndP
退出Do
如果结束
lhWndP=GetWindow(lhWndP,GW\U HWNDNEXT)
环
端函数
发件人:


另外,请参阅,以获取将
SendMessage
WM_CLOSE
一起使用的示例

问题是哪个弹出窗口?是什么导致了弹出窗口?弹出消息是什么?您是否尝试过
Application.DisplayAlerts=False
(之后将其设置为
True
)如果没有任何效果,您可以尝试作为最后一个选项使用
SendKeys“{ENTER}”
,但我不建议这样做(因为它不太可靠,可能会导致奇怪的副作用)。如果加载了弹出窗口,它无论如何都不会工作(但这取决于弹出窗口的来源)。如果您提供更多信息,我们可以检查一下,哪种解决方案是最好的。我两种都试过了,但都不起作用。弹出窗口要求输入数据库的名称,SQL(由VBA调用)必须从中查询要加载到数据透视表中的数据。我尝试用F8进行调试,但是弹出窗口出现在我的工具中看不到的一系列代码中,它们来自内置插件。如果弹出窗口是由Excel VBA生成的,并且由于Excel VBA是单线程的,则代码执行可能会卡在弹出窗口上,并且在关闭弹出窗口之前,OP将无法运行任何代码。如果弹出窗口是模态的,则相同因此,弹出窗口出现后可能没有代码解决方案。Excel VBA是单线程的,但我认为弹出窗口发生在Excel UI线程上,不会停止VBA的执行。但是
SendKeys“{ENTER}”
应该可以工作吗?他说“弹出窗口是一个内置的插件”,插件(可能他指的是插件)是否在另一个线程中运行?我以为他是在同一个线程中运行的。他可能在使用
GetHandleFromPartialCaption
查找窗口时执行
DoEvents()
。老实说,他需要告诉我们更多关于弹出窗口的原因,因为他的代码可能有一个重构可以防止它,预防和治疗分别像盎司和磅。我想可能弹出窗口没有焦点或者“确定”按钮没有焦点。也许他可以尝试用
O
来代替
SendKeys
,但实际上,他需要避免弹出窗口。