Удалить или очистить содержимое VB.net

#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