2017-01-11 5 views
-2

folgenden Code funktioniert, weil Option Strict Off Excel löschen: weil Option StrictIch möchte alle Blätter für Sheet1 außer

Option Strict Off    
xlApp.DisplayAlerts = False 
For Each i In wb1.Worksheets 
    Select Case True 
     Case i.Name Like "Sheet1" 
     Case Else 
      i.Delete() 
    End Select 
Next 
xlApp.DisplayAlerts = True 

Arbeit folgenden Code doesnt auf:

Option Strict On 
xlApp.DisplayAlerts = False 
For Each i In wb1.Worksheets 
    Select Case True 
     Case CType(wb1.Sheets(i), Excel.Worksheet).Name Like "Sheet1" 
     Case Else 
      CType(wb1.Sheets(i), Excel.Worksheet).Delete() 
    End Select 
Next 
xlApp.DisplayAlerts = True 

zweiten Code muss repariert werden.

Antwort

0

ich Ihren Code getestet und haben festgestellt, das der Fehler sein:

enter image description here

Für diejenigen, die nicht sehen können, der Screenshot klar, das ist der Fehler:

An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in WindowsApplication3.exe

Additional information: Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))

Sie haben i als Worksheet etabliert und versuchen, in wb1.Sheets(i) zu verweisen, dass. wb1.Sheets benötigt einen Index als Parameter, kein Worksheet.

Dieser Code funktioniert mit Option Strict On:

Dim xlApp As New Excel.Application 
xlApp.Workbooks.Open(filename) 

Dim xlWorkbook As Excel.Workbook = CType(xlApp.Workbooks, Excel.Workbooks)(1) 

xlApp.DisplayAlerts = False 
For Each ws As Excel.Worksheet In xlWorkbook.Worksheets 
    Select Case True 
     Case ws.Name Like "Sheet1" 
     Case Else 
      ws.Delete() 
    End Select 
Next 
xlApp.DisplayAlerts = True 

Bitte beachte, dass ich ws als Excel.Worksheet festgestellt haben, und ich bin Referenzierung jetzt, dass direkt.

Ihre Verwendung der Case Anweisung funktioniert, aber ich denke nicht, dass es notwendig ist und möglicherweise fehlschlagen könnte.

mit Option
If ws.Name <> "Sheet1" Then 
    ws.Delete() 
End If 

Screenshot von Code Strict On: Ich würde das Stück Code ändern enter image description here

aber ich Option Strict On in Mein Projekt unter den einzustellen bevorzugen Kompilieren tab:

enter image description here

+1

Gelöst. Vielen Dank. –

0

Wie wäre es so etwas wie:

Option Strict On 

    xlApp.DisplayAlerts = False 

    For Each i In wb1.Worksheets 
     If CType(wb1.Sheets(i), Excel.Worksheet).Name <> "Sheet1" 
       CType(wb1.Sheets(i), Excel.Worksheet).Delete() 
     End If 
    Next 

    xlApp.DisplayAlerts = True 

Die Select Case wahre Aussage keinen Sinn macht. Warum verwenden Sie einen Select Case für einen booleschen Wert und nicht für eine Variable? Select Case Wahr wird immer führen ... Das ist richtig ... „TRUE“

+0

Das 'Select Case' funktioniert, obwohl ich kein Fan davon bin. Im Grunde prüft es, welche Case-Anweisung "True" ist, also wenn "Case CType (wb1.Sheets (i), Excel.Worksheet) .Name" tatsächlich "Gefällt mir" ** Sheet1 ** ist, trifft es diesen Block von code und tue nichts und wenn es nicht 'Like' ** Sheet1 ** (False) ist, wird es gelöscht. Die 'If' Aussage ist viel besser. – Bugs

Verwandte Themen