2010-07-24 4 views
0

Я использую каждую версию подпрограмм Kill для удаления файлов xls в текущем каталоге без каких-либо успехов. Вот мой код. Я хочу удалить каждый xls-файл, кроме wbCntl. Выполнение этого кода показывает, что все работает, за исключением команды Kill swb. (SWB является публичной определяется как строка)Не удается убить файлы xls

'Close all files except wbCntl 
     swb1 = wbCntl.Name 
     For Each wb In Application.Workbooks 
      swb = wb.Name 
      If swb <> swb1 Then 
       Workbooks(swb).Close SaveChanges:=False 
       On Error Resume Next 
       Kill swb 
       Err.Clear 
      End If 
     Next wb 

Может кто-нибудь помочь мне с этим

ответ

0

Я не думаю, что Application.Workbooks является то, что вы хотите. The Excel 2003 VBA help дает следующее значение для этой коллекции:

Коллекция всех Workbook объектов, которые в настоящее время открыты в приложении Microsoft Excel.

Однако вы хотите итерировать файлы Excel в текущем каталоге, что совсем не так.

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

+1

Почему нижний предел, если я могу спросить? (Если что-то не так с ответом, я сделаю все возможное, чтобы исправить или улучшить его.) – stakx

+0

Согласовано - в первоначальном вопросе не упоминается, что он должен удалять только открытые xls-файлы. Если это означает это, тогда первоначальный вопрос должен быть изменен. –

0

Это не работает, потому что свойство Name - это просто имя файла. Метод Kill требует полного пути. Вместо этого попробуйте использовать свойство FullName.

Также вы можете столкнуться с странностью, когда вы удаляете элемент из коллекции, которую вы итерируете, используя «Для каждого». Попробуйте следующее:

Public Sub Example() 
    Dim lngIndx As Long 
    Dim strFilePath As String 
    For lngIndx = Excel.Workbooks.Count To 1& Step -1 
     strFilePath = Excel.Workbooks(lngIndx).FullName 
     If strFilePath <> ThisWorkbook.FullName Then 
      Excel.Workbooks(lngIndx).Close False 
      SafeKill strFilePath 
     End If 
    Next 
End Sub 

Private Sub SafeKill(ByVal path As String) 
    On Error Resume Next 
    Kill path 
End Sub 
0

Благодаря как stakx, так и особенно Oorang. Ваш код работал отлично. Извините, мне так долго нужно было поработать над этим. Кроме того, я не понимаю, насколько это способ ответить на ваши хорошие решения. Я новичок на этом сайте. Хотелось бы преподнести вам оба. Грант

Смежные вопросы