Ich habe ein Unterprogramm, das Blätter mit einem nicht-numerischen Namen löschen soll. Es wird die Blätter gefunden, aber nicht gelöscht. Ich kann nicht herausfinden, warum ....Löschen von Blättern aus Excel mit Visual Basic und Interop
Es ist nicht werfen Fehler und es erstellt die PDF (mit allen Blättern). Wenn ich die xlsBook.Close
zum Speichern von Änderungen festlegen, hat die Arbeitsmappe immer noch alle Blätter, nachdem der Prozess ausgeführt wird.
Ich laufe dies in Visual Studio 2015 mit MSOffice 2013. Hier ist das Code-Snippet;
Imports System
Imports System.IO
Imports Microsoft.Office.Interop.Excel
Imports Microsoft.Office.Interop.PowerPoint
Imports Microsoft.Office.Interop.Word
Imports Microsoft.Office.Core
Private Sub Convert_Excel(ByVal InFormat As String, ByVal InSpecial As String)
Dim xlsApp = New Microsoft.Office.Interop.Excel.Application()
Dim xlsBook As Microsoft.Office.Interop.Excel.Workbook
Dim xlsSheet As Microsoft.Office.Interop.Excel.Worksheet
xlsApp.Application.DisplayAlerts = False
Try
xlsApp.ScreenUpdating = False
xlsBook = xlsApp.Workbooks.Open(theFile, UpdateLinks:=False, ReadOnly:=False)
For Each xlsSheet In xlsBook.Sheets
If Not IsNumeric(xlsSheet.Name) Then
Try
xlsSheet.Delete()
Catch ex As Exception
Environment.ExitCode = ERROR_EXCEL_NOSHEETS
End Try
End If
Next
If xlsBook.Worksheets.Count > 1 And Environment.ExitCode <> ERROR_EXCEL_NOSHEETS Then
If LCase(InFormat) = "standard" Then
xlsBook.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, thePDFFile, XlFixedFormatQuality.xlQualityStandard,
True, True, Type.Missing, Type.Missing, False, Type.Missing)
Else
Environment.ExitCode = ERROR_EXCEL_BADOP
If Not Command_In Then
System.Windows.Forms.MessageBox.Show("INVALID OPERATION SELECTED")
End If
End If
End If
xlsBook.Close(SaveChanges:=False)
xlsApp.Quit()
xlsBook = Nothing
xlsApp = Nothing
pdfnameLabel.Text = "Created " & Convert_FilePDF
Catch ex As Exception
Environment.ExitCode = ERROR_EXCEL_UNKNOWN
If Not Command_In Then
System.Windows.Forms.MessageBox.Show(ex.Message)
End If
Finally
If xlsBook IsNot Nothing Then
xlsBook.Close(SaveChanges:=False)
End If
If xlsApp IsNot Nothing Then
xlsApp.Quit()
End If
End Try
End Sub
Versuchen rückwärts aus dem letzten Blatt arbeiten: Es ist nie eine gute Idee, um Elemente aus einer Sammlung zu löschen während Sie es mit For For Everything wiederholen –
@TimWilliams In einer (wahrscheinlich) nicht verwandten Anmerkung würde ich vorschlagen, eine Liste der zu löschenden Arbeitsblätter zu erstellen: 'Dim SheetsToDelete = xlBook.Sheets.Cast (Of Worksheet) .Where (Function (x) Nicht IsNumerisch (x.Name)). Dann können Sie alle Arbeitsblätter in dieser Liste sicher löschen, ohne sich um die Iterationssammlung kümmern zu müssen. Außerdem wäre es trivial, zu überprüfen, ob die Länge der Liste größer ist als die Anzahl aller Arbeitsblätter in der Arbeitsmappe. –
Was passiert, wenn Sie die 'Try..Catch' aus dem Block' If Not IsNumeric (xlSheet.Name) Then' entfernen? –