完了するまで応答していない状態になるマクロのステータス更新を提供する
-
09-12-2019 - |
質問
私は電子メールアーカイブを検索するためのVBAマクロを持っています。
数万の電子メール(またはテストマシンでは数百の電子メール)を検索すると、数秒間ステータスが表示され、残りの電子メールを実行している間に応答しな
これにより、せっかちなユーザーはタスクを途中で終了するようになりました。
私は次の解決策をコード化しましたが、問題はループ中にVbaでGarbageCollectorが機能する方法にあると考えています。
Public Sub searchAndMove()
UserForm1.Show
' Send a message to the user indicating
' the program has completed successfully,
' and displaying the number of messages sent during the run.
End Sub
Private Sub UserForm_Activate()
Me.Width = 240
Me.Height = 60
Me.Label1.Width = 230
Me.Label1.Height = 50
Dim oSelectTarget As Outlook.Folder
Dim oMoveTarget As Outlook.Folder
Dim oSearchCriteria As String
' Select the target folder to search and then the folder to
' which the files should be moved
Set oSelectTarget = Application.Session.PickFolder
Set oMoveTarget = Application.Session.PickFolder
oSearchCriteria = InputBox("Input search string: ")
Dim selectedItems As Outlook.Items
Set selectedItems = oSelectTarget.Items
Dim selectedEmail As Outlook.MailItem
Dim StatusBarMsg As String
StatusBarMsg = ""
Dim initialCount As Long
initialCount = selectedItems.count
Dim movedCounter As Long
movedCounter = 0
Dim x As Long
Dim exists As Long
' Function Loop, stepping backwards
' to prevent errors derived from modifying the collection
For x = selectedItems.count To 1 Step -1
Set selectedEmail = selectedItems.Item(x)
' Test to determine if the subject contains the search string
exists = InStr(selectedEmail.Subject, oSearchCriteria)
If Len(selectedEmail.Subject) > 999 Then
selectedEmail.Move oMoveTarget
Else:
If exists <> 0 Then
selectedEmail.Move oMoveTarget
movedCounter = (movedCounter + 1)
Else: End If
End If
Set selectedEmail = Nothing
StatusBarMsg = "Processing " & x & " out of " & initialCount & " messages."
UserForm1.Label1.Caption = StatusBarMsg
UserForm1.Repaint
Next x
Dim Msg As String
Dim Response
Msg = "SearchAndMove has detected and moved " & movedCounter & _
" messages since last run."
Response = MsgBox(Msg, vbOKOnly)
' Close the References to prevent a reference leak
Set oSelectTarget = Nothing
Set oMoveTarget = Nothing
Set selectedItems = Nothing
Set selectedEmail = Nothing
Unload Me
End Sub
解決
行を変更する
UserForm1.Repaint
に
DoEvents
はい、これは実行時間を増加させますが、何千もの電子メールがある場合は、オプションの多くを持っていません。
ヒント: また、あなたは変更したいかもしれません
StatusBarMsg = "Processing " & x & " out of " & initialCount & " messages."
に
StatusBarMsg = "Please do not interrupt. Processing " & x & " out of " & initialCount & " messages."
また、プロセスの開始時にユーザーに時間がかかる可能性があることを通知することをお勧めします。したがって、そのpcで作業したくないと確信している場合は、プロセスを実行できますか?この記事では、プロセスの開始時にユーザーに通知することをお勧めします。
このようなもの
Sub Sample()
Dim strWarning As String
Dim Ret
strWarning = "This process may take sometime. It is advisable to run this " & _
"when you don't intend to use the pc for sometime. Would you like to Continue?"
Ret = MsgBox(strWarning, vbYesNo, "Information")
If Ret <> vbYes Then Exit Sub
For x = SelectedItems.Count To 1 Step -1
'~~> Rest of the code
End Sub
HTH
シド
所属していません StackOverflow