Outlook VBA 매크로 : '기다려주세요'를 표시하는 가장 좋은 방법
문제
매크로가 Outlook 내에서 실행되고 있음을 사용자에게 표시하는 모범 사례는 무엇입니까? 매크로는 완료하는 데 약 1-30 초가 걸릴 수 있습니다.
매크로가 실행되기 전에 모달 'msgbox'가 나타나는 것을 피하고 싶습니다.
가능하다면 모래 시계 커서를 피하고 더 나은 방법이 있는지 궁금해했습니다.
매크로가 실행되는 동안 비 모달 '상태'메시지를 올리는 방법이 있습니까?
(매크로 I는 현재 선택된 MailItem에 대해 실행되었으며 빠른 액세스 도구 모음의 버튼으로 시작했습니다).
다른 팁
그 두 가지가 떠오르는 것, 나는 다른 사람도 아이디어를 가질 것이라고 확신합니다.
1. 진행률 표시 줄이있는 양식을 보여주십시오. 진행 상황을보고하거나 진행 상황을보고 할 수없는 경우 Marque 모드로 진행률 표시 줄이 있습니다. . 버튼 등을 끌 수 있습니다. 3. Win API를 사용하여 Outlook Staus Bar를 플레이하십시오.
매크로에서 무엇을하고 있는지 알지 못하면 양식을“맨 위에”유지하고 비동기 진행 상황을 펌핑하는 데 다루어야 할 수도 있습니다.
건배
마커스
@76mel의 답변을 확장하면이를 수행하는 좋은 방법은 비 모달 사용자 형식입니다. 다음과 같은 라벨과 캡션으로 정말 간단한 것을 만드십시오.
내가 좋아하는 것은 userform 세트를 다음과 같은 것입니다.
- 비 모달 (속성 F4, 세트
ShowModal
거짓으로)- 즉, 상태 표시 줄 밖에서 클릭 할 수 있으며 멈추지 않습니다.
- 나는 그것을 설정했다
StartupPosition
에게0-Manual
그리고Top
그리고Left
상태 양식이 화면의 왼쪽 상단에 나타나도록 100과 같은 것입니다 (기본적으로 중앙에 나타나는 다른 메시지의 방향으로)
라벨을 설정하십시오 value
userform이 처음로드 할 때의 일부 기본 텍스트로
Public strStatus As String
Public Const defaultStatus As String = "Default status text" 'set this to whatever you want
Sub statusReporter()
frmStatus.Show
'''
'Your code here
'''
frmStatus.lblStatus = "Step 1"
'...
frmStatus.lblStatus = "Step 2"
'...
'''
'Unload the form
'''
frmStatus.lblStatus = defaultStatus
frmStatus.Hide
End Sub
Excel과 마찬가지로 참고하십시오 Application.Statusbar
나중에 Excel의 동일한 인스턴스에서 사용하려는 경우 userform을 기본값으로 재설정해야합니다.
'Written By RobDog888 - VB/Office Guru™
'Add a Command Button so you can toggle the userform's topmost effect
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function SetWindowPos Lib "user32" ( _
ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long) As Long
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private mlHwnd As Long
Private Sub UserForm_Initialize()
Dim overTim As Single
overTim = Timer
mlHwnd = FindWindow("ThunderDFrame", "Status") 'Change "Status" to match your userforms caption
Do While mlHwnd = 0 And Timer - overTim < 5
mlHwnd = FindWindow("ThunderDFrame", "Status")
DoEvents
Loop
'Set topmost
SetWindowPos mlHwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End Sub
사용자 형식 코드 자체에서 항상 맨 위에 유지하기 위해