#excel #vba
#excel #vba
Вопрос:
У меня есть код в VB.net чтобы удалить определенные листы Excel с именами: T10, T12, T16 и так далее, я написал этот код для их удаления следующим образом:
Sub DeleteTSheets_Restart()
Dim xl As New Excel.Application
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
Dim cnt As Integer
xl.DisplayAlerts = False
cnt = 0
wb = xl.Workbooks.Open("C:PatchesMain_Master_VB.xlsm")
For Each ws In wb.Sheets
If InStr(1, ws.Name, "T") And Len(ws.Name) = 3 Then
ws.Delete()
End If
cnt = cnt 1
Next ws
xl.DisplayAlerts = True
wb.Close(SaveChanges:=vbTrue)
End Sub
Но это не удаляет их, но если я использую тот же код и изменяю только строку:
ws.Delete with ws.Cells.ClearContents()
Код работает и очищает весь лист, так почему удаление не работает??
Спасибо, с уважением
Мохеб Лабиб
Комментарии:
1. ws.Delete изменяет коллекцию wb.Sheets, поэтому лист после того, который вы удалили, пропускается. Обойдите это, выполнив итерацию в обратном направлении с помощью цикла For
2. @ Hans Passant, спасибо за ваш ответ, однако, можете ли вы дать мне подсказку, как? с помощью
For i = 1 to wb.sheets.count
или как??3. Наоборот, поэтому для i = wb.Sheets. Считать до 1 шага -1
4. @ Hans Passant , я отредактировал приведенный выше код, но он все еще не работает, вы можете его пересмотреть? Спасибо
5. Вы не избавились от цикла для каждого. Замените его циклом For. Вам нужно установить ws = wb.Sheets (i) для ссылки на лист.
Ответ №1:
Sub DeleteTSheets_Restart()
Dim xl As New Excel.Application
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
Dim cnt As Integer
xl.DisplayAlerts = False
cnt = 0
wb = xl.Workbooks.Open("C:PatchesMain_Master_VB.xlsm")
For Each ws In wb.Sheets
If InStr(1, ws.Name, "T") And Len(ws.Name) = 3 Then
ws.Delete()
End If
cnt = cnt 1
Next ws
xl.DisplayAlerts = True
wb.Close(SaveChanges:=vbTrue)
End Sub