2016-10-27 20 views
1

数値以外の名前のシートを削除するサブプログラムがあります。それはシートを見つけることですが、シートは削除しません。私は理由を理解できません....Visual BasicとInteropを使用してExcelからシートを削除する

それはエラーを投げていない、それはPDFを(すべてのシートで)作成しています。変更を保存するようにxlsBook.Closeを設定すると、プロセスの実行後にブックにすべてのシートが残っています。

私はで実行しています。Visual Studio 2015MSOffice 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 
+2

最後のシートから逆方向に働いてみを追加し、[削除前]あなたが必要とするように見えますFor Eachを使用して繰り返している間に –

+0

@TimWilliams(おそらく)関係のないメモで、削除するワークシートのリストを作成することをお勧めします: 'Dim sheetsToDelete = xlBook.Sheets.Cast(Of Worksheet).Where(Function (x)NotNumeric(x.Name))。ToList'。その後、反復収集を心配することなく、そのリスト内のすべてのワークシートを安全に削除することができます。また、リストの長さがワークブック内のすべてのワークシートの数よりも多いかどうかチェックするのも簡単です。 –

+0

'If Not IsNumeric(xlSheet.Name)Then'ブロック内で' Try..Catch'を削除するとどうなりますか? –

答えて

1

ここで、@TimWilliamsが言ったことについて。なぜここでエラーが発生しないのか分かりません。

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

コレクションを変更するには、Whileループを使用する必要があります。

実際にはforループをwhileループに変更するまでは、正確にどこの問題が発生するのかは不明です。それは、コレクションから項目を削除するには良いアイデアことはない:

更新 一部が行き来した後、

xlsApp.Application.DisplayAlerts = False 
+0

私はブックを保存しようとしていません。単にシートを削除してPDFとしてエクスポートしてください。私はインデックスを使用していません。私は、xlsSheetが削除メソッドを使った実際のワークシートだったので、私は考えました。 – wrkoch

+0

@wrkochファイン。それは削除されますが、 'xlsBook.Sheets'コレクションは突然変異しており、' for-loop'のために生成した列挙子はもはや有効ではありません。 –

+0

あなたはどこに行くのか見ています。私はそれを行ってあげるよ。 – wrkoch

関連する問題