【问题标题】:Do While Loop not skipping the file it is supposed toDo While Loop 不跳过它应该跳过的文件
【发布时间】:2014-10-05 19:37:54
【问题描述】:

我正在构建一个宏来打开文件夹中的每个文件,检查它是否共享,如果是,则取消共享,保存并关闭它。它嵌入在该文件夹LockFolder.xlsm 中的一个文件中,所以我需要它跳过它所在的文件,否则它会在循环中途自行关闭。

最初有一个 If Filename <> 'Lockfolder.xlsm' Then 工作正常,但我在其中嵌套 If 语句 If Activeworkbook.MultiUserEditing 时遇到了麻烦,所以我认为将前者放在“Do While”部分可能更容易代码。

它不工作。代码仍然会打开我希望它跳过的文件,然后将其关闭,仅将几个文件中止到循环中。

我做错了什么?

Sub Unshare()

    Dim FileName As String
    Dim cPwd As String

    FileName = Dir(CurDir() & "\" & "*.xls")
    Do While FileName <> "LockFolder.xlsm" Or FileName <> ""
        Application.DisplayAlerts = False
        Workbooks.Open (CurDir & "\" & FileName)
        If ActiveWorkbook.MultiUserEditing Then
            ActiveWorkbook.ExclusiveAccess
            ActiveWorkbook.Save
            ActiveWorkbook.Close
        Else
            ActiveWorkbook.Close
        End If
        FileName = Dir()
    Loop
    Application.DisplayAlerts = True

End Sub

【问题讨论】:

    标签: vba loops excel do-while


    【解决方案1】:
    FileName = Dir(CurDir() & "\" & "*.xls")
    
    Application.DisplayAlerts = False
    Do While FileName <> ""
      If FileName <> "LockFolder.xlsm" Then
          With Workbooks.Open(CurDir & "\" & FileName)
            If .MultiUserEditing Then
              .ExclusiveAccess
              .Save
            End If
    
            .Close
          End With
      End If
    
      FileName = Dir()
    Loop
    Application.DisplayAlerts = True
    

    【讨论】:

      【解决方案2】:

      您的问题是您的 while 循环在找到名为 "LockFolder.xlsm" 的文件后立即退出。

      你不需要让你的 while 循环退出条件依赖于这个文件,而是在循环中跳过这个文件

      这一行:

      Do While FileName <> "LockFolder.xlsm" Or FileName <> ""
      

      是问题所在。如果你找到这个"LockFolder.xlsm" 文件,你真的不想停止循环,只有当 FileName 为空时。所以把它改成这样:

      Do While FileName <> ""
      

      然后只需检查您想要顶部跳过的文件名 inside 循环,然后跳过那个文件

      Do While FileName <> ""
          If FileName <> "LockFolder.xlsm" Then
              ...
          End If
          FileName = Dir()
      Loop
      

      【讨论】:

        【解决方案3】:

        它没有跳过你的特殊文件的原因是你在do while中使用了or

        任何 字符串要么不是 a 要么不是 b,因为它不能同时是 a 和 b:

        FileName            <>"LockFolder.xlsm" (a)   <>"" (b)   a or b
        -----------------   -----------------------   --------   ------
        "LockFolder.xlsm"   false                     true       true
        ""                  true                      false      true
        <all others>        true                      true       true
        

        请注意,我没有在上面的 false/false 案例中添加一行,因为我很难非常找到会生成它的测试数据:-)

        您还会遇到这样的问题,即您的循环在找到您的特殊文件时会终止,可能会跳过一些不应该的文件。

        您需要您的do while 来简单地检查终止值"" 并在其中使用if 来跳过:

        Do While FileName <> ""
            If FileName <> "LockFolder.xlsm" Then
                :
        

        【讨论】:

        • 在这种情况下,使用文件名终止循环是问题的一部分,而不是条件中的逻辑运算符。
        • Jimmy,or 的使用具体是导致不可跳过的原因,提前终止是由组合引起的额外问题(即使您使用了and )。
        • 我先用“And”试过了,我应该指定的。两种情况都发生了同样的事情。
        猜你喜欢
        • 1970-01-01
        • 2013-03-23
        • 1970-01-01
        • 2016-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多