使用Visual Basic和Interop从Excel中删除工作表

使用Visual Basic和Interop从Excel中删除工作表,excel,vb.net,office-interop,Excel,Vb.net,Office Interop,我有一个子程序,可以删除非数字名称的工作表。它正在查找工作表,但没有删除它们。我不明白为什么 它不是抛出错误,而是创建PDF(包含所有工作表)。如果我设置xlsBook.Close保存更改,则在流程运行后,工作簿仍保留所有工作表 我正在Visual Studio 2015中与MSOffice 2013一起运行此功能。下面是代码片段 Imports System Imports System.IO Imports Microsoft.Office.Interop.Excel

我有一个子程序,可以删除非数字名称的工作表。它正在查找工作表,但没有删除它们。我不明白为什么

它不是抛出错误,而是创建PDF(包含所有工作表)。如果我设置
xlsBook.Close
保存更改,则在流程运行后,工作簿仍保留所有工作表

我正在Visual Studio 2015中与MSOffice 2013一起运行此功能。下面是代码片段

    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
导入系统
导入System.IO
导入Microsoft.Office.Interop.Excel
导入Microsoft.Office.Interop.PowerPoint
导入Microsoft.Office.Interop.Word
导入Microsoft.Office.Core
专用子转换\u Excel(ByVal信息作为字符串,ByVal作为特殊字符串)
Dim xlsApp=新的Microsoft.Office.Interop.Excel.Application()
将xlsBook设置为Microsoft.Office.Interop.Excel.Workbook
Dim xlsSheet作为Microsoft.Office.Interop.Excel.Worksheet
xlsApp.Application.DisplayAlerts=False
尝试
xlsApp.screenUpdate=False
xlsBook=xlsApp.Workbooks.Open(文件,UpdateLinks:=False,只读:=False)
对于xlsBook.Sheets中的每个xlsSheet
如果不是数字(xlsSheet.Name),则
尝试
xlsSheet.Delete()
特例
Environment.ExitCode=错误\u EXCEL\u NOSHEETS
结束尝试
如果结束
下一个
如果xlsBook.Worksheets.Count>1且Environment.ExitCode错误\u EXCEL\u NOSHEETS,则
如果LCase(InFormat)=“标准”,则
xlsBook.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF、PDF文件、XlFixedFormatQuality.xlQualityStandard、,
True,True,Type.Missing,Type.Missing,False,Type.Missing)
其他的
Environment.ExitCode=错误\u EXCEL\u BADOP
如果没有命令_,则
System.Windows.Forms.MessageBox.Show(“选择的操作无效”)
如果结束
如果结束
如果结束
xlsBook.Close(保存更改:=False)
xlsApp.Quit()
xlsBook=Nothing
xlsApp=无
pdfnameLabel.Text=“已创建”&Convert\u FilePDF
特例
Environment.ExitCode=错误\u EXCEL\u未知
如果没有命令_,则
System.Windows.Forms.MessageBox.Show(例如Message)
如果结束
最后
如果xlsBook不是什么,那么
xlsBook.Close(保存更改:=False)
如果结束
如果xlsApp不是什么,那么
xlsApp.Quit()
如果结束
结束尝试
端接头

现在,听@TimWilliams的话。我不知道你为什么没有在这里得到错误,你应该在某个时候

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

试着从最后一张工作表开始反向工作:在使用For对集合进行迭代时,从集合中删除项从来都不是一个好主意Each@TimWilliams在一个(可能)不相关的注释中,我建议创建一个要删除的工作表列表:
Dim sheetsToDelete=xlBook.Sheets.Cast(工作表的)。其中(函数(x)不是数字(x.Name)).ToList
。然后,您可以安全地删除该列表中的所有工作表,而不必担心迭代集合,而且检查列表的长度是否大于工作簿中所有工作表的计数也很简单。如果从
中删除
Try..Catch
,如果不是数字(xlSheet.Name),会发生什么情况然后
block?另外,您是否可以使用调试器一步一步地执行此操作,并查看它何时执行异常操作?删除try-catch,但不执行任何操作。仅供参考-如果所有工作表都是非数字的,并导致一个空文件,那么它就在那里。逐行调试没有显示任何内容。请注意,它没有删除任何内容。我可以试着倒着做,但我会想,如果一本4页的工作簿有两张不好的工作表,我最终会得到一本PDF格式的两张工作表。虽然它们可能不是我想要的,但某些内容可能已被删除……我不想保存工作簿。只需删除工作表并将其导出为PDF。我没有使用索引。我想,因为xlsSheet是一个实际的工作表,带有delete方法,所以它会删除。@wrkoch Ok。好的它将删除,但随后
xlsBook.Sheets
集合将发生变化,并且它为
for loop
生成的枚举数不再有效,请查看您将使用它。我要试一试。叹气。不走运。然而我回到了基础,将代码设置为:@wrkoch我没有100%理解你的消息。您是否添加了
while-loop
,通过它进行了调试,它删除了一些内容,打印前的纸张数量与开始时不同,没有进入
catch
,并且您打印后仍会得到您认为已删除的纸张?您的代码是否确实符合条件
,如果不是数字(xlsSheet.Name),则
Dim index as Integer
While index < xlsBook.Sheets.Count -1
    . . . . . . . 
    ' here, when you remove Sheets(index), don't increment it 
    ' because next sheet will now have this index.
    ' NOTE, I am not sure if sheets it 0 or 1-based collection            
xlsApp.Application.DisplayAlerts = False