2016-10-27 3 views
1

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 
+2

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 –

+0

@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. –

+0

Was passiert, wenn Sie die 'Try..Catch' aus dem Block' If Not IsNumeric (xlSheet.Name) Then' entfernen? –

Antwort

1

Nun, was @TimWilliams gesagt hat. Ich bin nicht sicher, warum Sie Fehler nicht bekommen, hier-Sie irgendwann sollte

For Each xlsSheet In xlsBook.Sheets 
    If Not IsNumeric(xlsSheet.Name) Then 
     Try 
      xlsSheet.Delete() ' <-- should error here 
     . . . . . . . . 

Sie sollten zum Mutieren Sammlungen While-Schleife verwenden.

In Wahrheit, bis Sie Ihre for-Schleife zu While-Schleife ändern, wird es unklar sein, wo genau das Problem.

aktualisiert Nach einigen hin und es hervor scheint, dass Sie [vor Löschen] hinzufügen müssen

xlsApp.Application.DisplayAlerts = False 
+0

Ich versuche nicht, die Arbeitsmappe zu speichern. Löschen Sie einfach die Blätter und exportieren Sie sie als PDF. Ich verwende keine Indizes. Ich dachte, da das xlsSheet ein tatsächliches Arbeitsblatt mit einer löschenden Methode war, löschte es. – wrkoch

+0

@ wrkoch Ok. Fein. Es würde löschen, aber dann "xlsBook.Sheets" Sammlung ist mutiert und Enumerator, dass es generiert für "for-Schleife" ist nicht mehr gültig –

+0

Ich sehe, wohin Sie damit gehen. Ich werde es versuchen. – wrkoch

Verwandte Themen