2014-04-18 191 views
0

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

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 
+0

首先,您没有显示Dim的几个变量,所以不知道它们是什么。其次,你确定'Exit Do'是否真的让你走出困境?你有两个“尽管是真的”循环。如果你把一个断点放入并且没有所需的三个文件,它应该显示问题出在哪里。 –

+0

感谢韦恩的评论!我注意到'vItem'描述丢失了,所以我编辑了这个帖子来澄清这个变量。我再次检查了代码,无法找到任何未声明的其他变量。如果你愿意指出,我会编辑帖子以澄清这些变量。在另一个'Do while'循环中,你有一个很好的观点。让我看一看。但无论如何,即使在监视器打开后我添加了其他循环之前,excel文件上的任何内容都不可点击,直到监视完成。 – ExcelMind1434

+0

在模块顶部添加'Option Explicit',然后'Debug |编译”。将显示缺少的Dim's。您应该能够在第一个“Do While True”时在代码中放置断点,然后单击该按钮以启动该过程。然后在代码窗口中,只需按F8即可遍历代码。应该很容易找到问题。最后,你的'尽管真正'看起来有点奇怪,因为你没有任何条件会改变'真实'的条件 - 因此循环会一直运行,直到你'退出'。如果你说'Do While blnFlag = True'并且你在循环中改变了blnFlag,那么这将停止Do. –

回答

0

这里是你如何能停止循环(但我真的希望你能回答的,如果所有的三个文件不存在应发生什么问题? - 出口等待?)

发生在以下形式水平(即,在模块的顶部 - 所有子程序的外部):

Dim fvStopTheLoop    As Boolean 

小组cmdStart_Click内部,插入如下:

fvStopLoop = False 

各处理之后你'做,当真正的陈述,添加以下行:

DoEvents 

如果你有“如果我= 3,那么”,取代类似如下:

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 
+0

非常感谢您的评论Wayne!回答你最初的问题 - “但我真的希望你能回答如果所有三个文件都不存在会发生什么 - 退出?等等?'如果3个文件不存在,那么我肯定会退出..这是我面临的唯一困难。不幸的是,即使使用您提供的代码,它也不起作用。正如我在最初的帖子中提到的...一旦监控开始,excel页面上的所有按钮都不可点击..所以我无法点击cmdstop按钮来结束循环.. – ExcelMind1434

+0

嗯,我故意拼错一个变量只是为了看如果您曾尝试使用'Option Explicit'来查找未定义的变量(请参阅我以前的几篇帖子,要求您尝试这些变量)。如果您更正了拼写,我提供的代码将工作。 –

+0

我明白你已经让我声明了我所做的变量..并且我修正了“mispelled”变量..但是你的代码不起作用,因为一旦你点击启动监视的cmdbutton,excel表单上的所有内容都变得无法点击直到3个文件被添加到文件夹..这意味着cmdSTOP按钮也不可点击,这就是为什么你的代码不工作。尽管感谢您的帮助! – ExcelMind1434