【问题标题】:DoWhile Loop Stuck while using colMonitoredevents在使用 colMonitoredevents 时执行 While Loop Stuck
【发布时间】:2014-04-18 15:41:04
【问题描述】:

我正在使用脚本来监视文件夹以添加文件。如果将 3 个文件(满足条件)添加到受监视的文件夹中,则脚本运行良好。它很好地从这些文件中提取数据并添加到打开的 excel 文件中。但是,如果条件不是我,脚本会继续通过Do While Loop,并且我无法使用 excel 上的任何按钮(正在考虑使用另一个命令按钮来退出循环)。请帮忙!!任何建议表示赞赏!谢谢!

Public vItem As Variant
'vItem contains the folder path that the user selects.  
'Another function deals with this and only its values is passed to `CommandButton2 Click()` 

Private Sub CommandButton2_Click()
Dim i As Integer
    i = 0
Dim fcounter, pcounter, vcounter As Integer
    fcounter = 0
    pcounter = 0
    vcounter = 0



Set objShell = CreateObject("Wscript.Shell")

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Dim vItemstr As String
vItemstr = Replace(vItem, "\", "\\\\")
MsgBox vItemstr



Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _
        & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _
            & "TargetInstance.GroupComponent= " _
                & "'Win32_Directory.Name=" & Chr(34) & vItemstr & Chr(34) & "'")



Do While True

    Set objLatestEvent = colMonitoredEvents.NextEvent
    StrNewfile = objLatestEvent.TargetInstance.PartComponent


    arrNewFile = Split(StrNewfile, "=")
    strFileName = arrNewFile(1)
    strFileName = Replace(strFileName, "\\", "\")
    strFileName = Replace(strFileName, Chr(34), "")
        Dim justfilename, namestr As String
            justfilename = Dir(strFileName)
            Do While True
                     novaval = InStr(1, justfilename, "SampleResults")

                             If novaval > 0 Then
                                     namestr = "f"
                                     Exit Do
                             End If
                     novaval = InStr(1, justfilename, "v")
                             If novaval > 0 Then
                                     namestr = "v"
                                     Exit Do
                             End If
                     novaval = InStr(1, justfilename, "p")
                             If novaval > 0 Then
                                     namestr = "p"
                                     Exit Do
                             End If
            Loop

        If namestr = "f" And fcounter = 0 Then
            i = i + 1

            Dim OpenFileName As String
            Dim wb As Workbook

                Set wb = Workbooks.Open(strFileName, UpdateLinks:=0)
                    ThisWorkbook.Sheets(1).Range("K18:P18").Value = wb.Sheets(1).Range("G1:L1").Value
                    ThisWorkbook.Sheets(1).Range("K19:P19").Value = wb.Sheets(1).Range("G5:L5").Value
                    ThisWorkbook.Sheets(1).Range("K20:P20").Value = wb.Sheets(1).Range("G4:L4").Value
                    ThisWorkbook.Sheets(1).Range("K21:P21").Value = wb.Sheets(1).Range("G3:L3").Value
                    ThisWorkbook.Sheets(1).Range("K22:P22").Value = wb.Sheets(1).Range("G2:L2").Value
                    ThisWorkbook.Save
                wb.Close
            fcounter = fcounter + 1
        ElseIf namestr = "v" And vcounter = 0 Then
                i = i + 1
                Set wb = Workbooks.Open(strFileName, UpdateLinks:=0)
                    ThisWorkbook.Sheets(1).Range("C18:E18").Value = wb.Sheets(1).Range("C1:E1").Value
                    ThisWorkbook.Sheets(1).Range("C19:E19").Value = wb.Sheets(1).Range("C5:E5").Value
                    ThisWorkbook.Sheets(1).Range("C20:E20").Value = wb.Sheets(1).Range("C4:E4").Value
                    ThisWorkbook.Save
                wb.Close
            vcounter = vcounter + 1
        ElseIf namestr = "p" And pcounter = 0 Then
                i = i + 1
                Set wb = Workbooks.Open(strFileName, UpdateLinks:=0)
                    ThisWorkbook.Sheets(1).Range("F18:H18").Value = wb.Sheets(1).Range("X1:Z1").Value
                    ThisWorkbook.Sheets(1).Range("F19:H19").Value = wb.Sheets(1).Range("X5:Z5").Value
                    ThisWorkbook.Sheets(1).Range("F20:H20").Value = wb.Sheets(1).Range("X4:Z4").Value
                    ThisWorkbook.Save
                wb.Close
            pcounter = pcounter + 1

        End If


        If i = 3 Then
            Exit Do
        End If


Loop

End Sub

【问题讨论】:

  • 首先,您没有显示几个变量的 Dim,所以不知道它们是什么。其次,你确定“退出”真的让你脱离了循环吗?您有两个“Do While True”循环。如果你放了一个断点并且没有所需的三个文件,它应该会显示问题所在。
  • 感谢韦恩的评论!我注意到缺少vItem 描述,因此我编辑了帖子以澄清该变量。我再次浏览了代码,找不到任何其他未声明的变量。如果您愿意指出这一点,我将编辑帖子以澄清这些变量。关于另一个 Do while 循环,您有一个很好的观点。让我看一看。但无论如何,即使在我打开监视器后添加另一个循环之前,excel文件上的任何内容都不是“可点击”的,直到监视完成。
  • 在模块顶部添加“Option Explicit”,然后添加“Debug |编译'。将显示丢失的 Dim。您应该能够在代码中的第一个“Do While True”处放置一个断点,然后单击按钮开始该过程。然后在代码窗口中,只需按 F8 即可单步执行代码。应该很容易找到问题。最后,您的“Do While True”似乎有点奇怪,因为您没有任何条件会改变“True”条件 - 因此循环将永远运行,直到您“退出”。如果您说“Do While blnFlag = True”并且您在循环中更改 blnFlag,那么这将停止 Do。
  • 代码底部Loop 之前的最后一个If 语句是结束Do While True 循环的内容。基本上它的作用是,只要将 3 个文件添加到受监视的文件夹(每个文件名中都包含“f”或“p”或“v”),Do While True 循环就会中断。我想要的是另一个选项,例如,用户可以使用命令按钮手动打破Do While True 循环。但不幸的是,正如我上面提到的,一旦循环开始,我就无法点击 Excel 工作表上的任何控件。
  • (1) 以下内容未定义(您是否使用过 Option Explicit 并编译过??):objShell、strComputer、objWMIService、colMonitoredEvents、objLatestEvent、StrNewfile、arrNewFile、strFileName、novaval; (2) 您是否曾尝试使用断点单步执行代码? (3) 如果您修复代码,则无需提供“破解”能力。可能您可以使用计时器和 DoEvents 来让用户中断。

标签: vba directory monitor


【解决方案1】:

这是停止循环的方法(但我真的希望你能回答如果所有三个文件都不存在会发生什么的问题 - 退出?等等?)

将以下内容放在表单级别(即在模块的顶部 - 在所有子例程之外):

Dim fvStopTheLoop              As Boolean

在 Sub cmdStart_Click 中,插入以下内容:

fvStopLoop = False

在您的每个“Do While True”语句之后,添加以下行:

DoEvents

如果你有 'If i = 3 then',替换如下:

    If i = 3 Then
        Exit Do
    End If
    If fvStopLoop = True Then
        MsgBox "Ending the loop due to user request", vbOKOnly, "End"
        Exit Sub
    End If

使用以下代码添加一个新的命令按钮:

Private Sub cmdStop_Click()
    fvStopLoop = True
End Sub

【讨论】:

  • 非常感谢您的 cmets Wayne!回答您最初的问题 - but I really wish you would answer the question of what should happen if all three files are NOT present - exit? Wait? 好吧,如果这 3 个文件不存在,那么我肯定想退出 ..这是我面临的唯一困难.. 不幸的是,即使您提供的代码也不起作用..正如我在最初的帖子中提到的......一旦监控开始,excel页面上的所有按钮都不可点击......所以我无法点击cmdSTOP按钮结束循环......
  • 好吧,我故意拼错一个变量,只是为了看看你是否曾尝试使用“Option Explicit”来查找未定义的变量(请参阅我之前的几篇要求你尝试的帖子)。如果您更正拼写,我提供的代码确实有效。
  • 我了解您曾要求我声明我所做的变量.. 并且我修复了“拼写错误”的变量.. 您的代码仍然无法正常工作,因为一旦您单击启动监控的 cmd 按钮在将 3 个文件添加到文件夹之前,excel 表单上的所有内容都变得不可点击。这意味着 cmdSTOP 按钮也不可点击,这就是您的代码无法正常工作的原因。不过感谢您的帮助!
  • 我有另一个解决这个问题的方法,但是在我弹出一个 vbyesno 对话框的地方一点也不优雅(你想终止监控吗?)所以如果用户点击是,那么监控会以“退出做”。但是用户单击“否”然后它继续循环......唯一的问题是,当最终添加文件时,对于每个文件,都会出现对话框,用户必须继续单击“否”才能从添加的文件。但它确实有效.. 如果我为超过 3 个文件创建代码,它不会很优雅
  • “挂起”的原因是“Set objLatestEvent = colMonitoredEvents.NextEvent”行,它将一直等待直到创建文件。如果您希望用户等待(永远?)保持代码原样......否则您需要考虑一种全新的方法(即使用 FSO 来旋转文件列表)
猜你喜欢
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 2022-01-27
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 2021-05-29
相关资源
最近更新 更多