我正在构建一个宏来打开文件夹中的每个文件,检查它是否已共享,如果是共享则取消共享,保存并关闭它。它嵌入在该文件夹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
答案 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