Do While Loop не пропускает файл, он должен

Я создаю макрос, чтобы открыть каждый файл в папке, проверить, является ли он общим, отбросить его, если он есть, сохранить его и закрыть. Он встроен в файл в этой папке LockFolder.xlsm , поэтому мне нужно, чтобы он пропустил файл, в котором он находится, или же он закроется в середине цикла.

Первоначально было « If Filename <> 'Lockfolder.xlsm' Then это работало нормально, но у меня были проблемы с вложением инструкции If Activeworkbook.MultiUserEditing , поэтому я подумал, что было бы проще просто поставить первое в «Do Пока "раздел кода.

Он не работает. Код по-прежнему открывает файл, который я хочу, чтобы он пропускал, затем закрывает его, прервав всего лишь несколько файлов в цикле.

Что я делаю не так?

 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 

Причина, по которой он не пропускает ваш специальный файл, – это то, что вы использовали or использовали.

Любая строка либо не является, либо не является b, поскольку она не может быть одновременно и а, и 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 : 

ваша проблема в том, что ваш цикл 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 
 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 
  • Является ли эта строка ненужной линией в VBA?
  • VBA - копировать и вставлять столбцы в один столбец, а затем копировать соответствующий заголовок x раз
  • Макрос Excel с использованием циклов
  • VBA: как описать строку с определенной строкой
  • Ошибка несоответствия типа петли рабочего листа
  • Noob - Автоматизация вырезания и вставки VBA, циклов?
  • Печать нескольких текстовых строк из одной ячейки
  • Повторение кода, зацикливание столбцов до пустой ячейки
  • Отслеживание значений предыдущих дат в базе данных Excel
  • Скопируйте не объединенные ячейки из одного листа в объединенные ячейки в другом, используя цикл
  • Необходимо извлекать данные из всех файлов в каталоге
  • Interesting Posts

    Установить лист на основе значения ячейки

    Применение UDF к каждому значению, используемому в качестве диапазона для sumproduct

    Autohotkey сохраняет файл excel без просмотра перезаписи

    Silverlight на стороне сервера Excel генерирует отчет на основе запроса к базе данных

    Код ошибки: 80040213 Источник CDO.Message.1 Не удалось подключиться

    Комплекс INDEX MATCH возвращает # N / A

    Выход VBA в отношении кнопок выбора

    Как преобразовать из десятичной координаты (1,1) в Excel Style Coordinate A1 в powershell

    Улучшено «найти дубликаты», но условное форматирование не работает

    Вставка SQL с использованием файла Excel

    Переменная объекта или с заблокированной переменной блока

    Исключение условного массива Sumproduct

    Раскрашивание клеток на основе двух условий в vba

    Преобразование таблицы excel в C # DataTable обрезает некоторые данные

    Столбец Date, обнаруженный как VarChar с помощью мастера импорта SQL Server

    Давайте будем гением компьютера.