알아 내기 위해 며칠이 걸렸지 만 마침내 여기에 Windows 이벤트를 관찰하기 위해 WinAPI 함수를 사용하는 작업 영역이 있습니다. 후크가 활성 상태 인 동안 모든 새 창은 해당 클래스가 PDF 저장 대화 상자 클래스와 동일한 것인지 여부와 비교됩니다. 이 경우 창이 닫힙니다. 솔루션 아이디어에 대한
덕분에 일부 중국 남자로 이동 : 이 http://www.itjie.wang/officebase/516998.html
사용 요구 사항 :
OS (= 운영 체제) 때문에 WinAPI를 사용의 윈도우를해야합니다.
경고 :
일부 오류로 인해 "SetWinEventHook"가 다시 중지되지 않으면 시스템을 다시 시작하는 것이 좋습니다. 그렇지 않으면 Windows에서 심각한 문제가 발생할 수 있습니다.
참고 :
기본적으로 PDF 저장 대화 상자는 정기적으로 나타나지 않습니다. PDF 파일을 저장하는 데 필요한 시간에 따라 다릅니다. 시간이 오래 걸리면 저장 팝업이 나타납니다. 저장 팝업이 짧아지면 저장 팝업이 나타나지 않습니다. 어쨌든 저장 대화 상자가 나타나는지 여부에 대해 걱정할 필요가 없습니다. 코드가 이미이 작업을 수행합니다.
명령 : 당신의 VBA 코드에서
' WINDOWS API FUNCTIONS:
Private Declare Function SetWinEventHook Lib "user32" (ByVal eventMin As Long, ByVal eventMax As Long, ByVal hmodWinEventProc As Long, ByVal pfnWinEventProc As Long, ByVal idProcess As Long, ByVal idThread As Long, ByVal dwFlags As Long) As Long
Private Declare Function UnhookWinEvent Lib "user32" (ByVal hWinEventHook As Long) As Long
Private Declare Function apiGetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassname As String, ByVal nMaxCount As Long) As Long
Private Declare Function apiShowWindow Lib "user32" Alias "ShowWindow" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
' CONSTANT VARIABLES:
Private Const SW_HIDE = 0
Private Const DLG_CLSID = "CMsoProgressBarWindow"
Private Const EVENT_SYSTEM_FOREGROUND = &H3&
Private Const WINEVENT_OUTOFCONTEXT = 0
' GLOBAL VARIABLES:
Dim long_WinEventHook As Long
Public Function StartEventHook() As Long
long_WinEventHook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, 0&, AddressOf WinEventFunc, 0, 0, WINEVENT_OUTOFCONTEXT)
StartEventHook = long_WinEventHook
End Function
Public Sub StopEventHook()
Dim b_unhooked As Boolean
If long_WinEventHook = 0 Then
MsgBox "WinEventHook couldn't be stopped! " & _
"Variable 'long_WinEventHook' is empty! " & _
"Better restart Windows now!"
Exit Sub
End If
b_unhooked = UnhookWinEvent(long_WinEventHook)
If b_unhooked = True Then
Else
MsgBox "WinEventHook couldn't be stopped! " & _
"Variable 'b_unhooked' is false! " & _
"Better restart Windows now!"
End If
End Sub
' CALLBACK FUNC OF "SetWinEventHook" (DEFINE ACTIONS TO RUN ON THE EVENTS):
' http://stackoverflow.com/questions/20486944/detecting-in-vba-when-the-window-containing-an-excel-instance-becomes-active
Public Function WinEventFunc(ByVal HookHandle As Long, ByVal LEvent As Long, ByVal hWnd As Long, ByVal idObject As Long, ByVal idChild As Long, ByVal idEventThread As Long, ByVal dwmsEventTime As Long) As Long
'This function is a callback passed to the win32 api
'We CANNOT throw an error or break. Bad things will happen
On Error Resume Next
Dim l_handle As Long
Dim s_buffer As String
Dim b_visible As Boolean
Dim i_bufferLength As Integer
s_buffer = String$(32, 0)
i_bufferLength = apiGetClassName(hWnd, s_buffer, Len(s_buffer))
If Left(s_buffer, i_bufferLength) = DLG_CLSID Then
b_visible = apiShowWindow(hWnd, SW_HIDE)
WinEventFunc = hWnd
End If
End Function
: & 붙여 넣기 다음 코드를 이미 모듈이없는 경우 Excel 통합 문서에서
는, 새로 생성 (이름은 중요하지 않음) 당신이 PDF로 엑셀 통합 문서를 저장할 때,이 같은 매크로 위에 부를 것이다 :
' ADD WINDOWS EVENT HOOK BEFORE SAVING:
Application.Run XL_WB.Name & "!StartEventHook"
' SAVE EXCEL AS PDF:
' https://msdn.microsoft.com/de-de/library/microsoft.office.tools.excel.worksheetbase.exportasfixedformat.aspx
XL_WB.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:="C:\PDF.pdf", _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False
' REMOVE WINDOWS EVENT HOOK AFTER SAVING:
Application.Run XL_WB.Name & "!StopEventHook"
을 위의 VBA 코드 예제 "XL_WB"에서하는 변수입니다. 필요에 맞게 조정해야합니다. 예를 들어 "ActiveSheet"를 대신 사용하십시오.
또한 특정 문제에 도움을 요청 다음 다른 웹 사이트 사용자의
: