Do While Loop不跳过它应该的文件

时间:2014-08-12 16:19:11

标签: excel vba loops excel-vba do-while

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

最初有一个If Filename <> 'Lockfolder.xlsm' Then工作正常,但我在那里嵌入If语句If Activeworkbook.MultiUserEditing时遇到了麻烦,所以我觉得将前者放在&#34中会更容易;做什么&#34;代码部分。

它不起作用。代码仍会打开我希望它跳过的文件,然后关闭它,将整个事件中止只有几个文件进入循环。

我做错了什么?

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

3 个答案:

答案 0 :(得分:4)

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

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

这一行:

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

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

Do While FileName <> ""

然后只需检查你想要在循环中跳过的文件名,然后跳过那个文件

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

答案 1 :(得分:4)

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

任何字符串都不是b或不是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
        :

答案 2 :(得分:2)

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