使用Visual Basic和Interop从Excel中删除工作表
我有一个子程序,可以删除非数字名称的工作表。它正在查找工作表,但没有删除它们。我不明白为什么 它不是抛出错误,而是创建PDF(包含所有工作表)。如果我设置使用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
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