none
Problem mit CreateObject bei Visual Basic 2017 und bei Deklaration einer Excel.Application RRS feed

  • Frage

  • Beim Versuch, eine Excel-Datei mit VB zu öffnen war ein erster Versuch:

    'VERSUCH, Exceldatei zu öffnen

            Dim objExcel As Excel.Application

            Dim objworkbook As Excel.Workbook

            Dim objworksheet As Excel.Worksheet

            objExcel = CreateObject("Excel.Application") 'und weitere Zeilen Quelltext

    Hier sagt  das System: Das COM-Objekt des Typs "Microsoft.Office.Interop.Excel.ApplicationClass" kann nicht in den Klassentyp "TestApp3.Excel.Application" umgewandelt werden. Instanzen von Typen, die COM-Komponenten repräsentieren, können nicht in andere Typen umgewandelt werden, die keine COM-Komponenten repräsentieren. Eine Umwandlung in Schnittstellen ist jedoch möglich, sofern die zugrunde liegende COM-Komponente QueryInterface-Aufrufe für die IID der Schnittstelle unterstützt." >>>>>>>>>>>>>>>> Wie kann man das beheben???

    Das zweite Problem:

    Gibt es eine "einfache" Lösung, in einem DataGridView ein zweidimensionales Array (Zahlenwerte Int) anzuzeigen ? Die in den Foren zu findenden Vorschläge sind sehr kompliziert!

    Dank m Voraus für beratung

    MfG J. Schubert




         

    Freitag, 4. Januar 2019 14:10

Antworten

  • Hi Jürgen,
    CreateObject liefert einen Verweis auf ein "Object". Wenn also Option Strict On eingestellt ist, muss der Verweis als vom Typ Excel.Application bekanntgeben werden. Das macht man mit ein Typecasting entweder mit CType oder mit TryParse, alSo so:

            Dim objExcel As Excel.Application
            Dim objworkbook As Excel.Workbook
            Dim objworksheet As Excel.Worksheet
            objExcel = CType(CreateObject("Excel.Application"), Excel.Application)

    Mit Option Strict Off macht die Typkonvertierung vom Compiler im Hintergrund eingebauter Code zur Ausführungszeit. Empfehlen kann ich Option Strict Off nicht, da damit der Aufwand für die Erstellung einer Software mit hoher Qualität stark erhöht wird, da fehlerhafte Zuweisungen erst zur Ausführungszeit ggf. erst zufällig erkannt werden.

    Array sind in einem DataGrid nur mit zusätzlichem Aufwand darstellbar. Die einfachste Lösung ist die Nutzung des DataGrids im virtuellen Modus. Da braucht man nur in der entsprechenden Methode die Zeilen- und Spaltennummer für den Inhalt in einem 2-dimensionalen Array nutzen. Besser ist es in den meisten Fällen, anstelle mit Arrays mit Listen von Datenobjekten zu arbeiten. Jedes Datenobjekt wird dann in einer Zeile des DataGrids dargestellt. Die einzelnen Eigenschaften eines Datenobjektes werden dann in den Spalten der Zeile dargestellt. Das lässt sich einfach über Bindung (DataSource) lösen.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks


    Freitag, 4. Januar 2019 14:57
  • So Geht es auch mit  Option Strict On

    Option Strict On
    Imports Microsoft.Office.Interop
    Imports Microsoft.Office.Interop.Excel
    Public Class FrmHaupt
        Public Pfad As String
        Private Sub CmdZuExcel_Click(sender As Object, e As EventArgs) Handles CmdZuExcel.Click
            Pfad = "D:\Eigene Dokumente\VBA_Tests\Patientenbefragung\Versionen\" 'Dort steckt die Testdatei1.xlsm
            Dim objExcel As Excel.Application
            Dim objworkbook As Excel.Workbook
            Dim objworksheet As Excel.Worksheet
            objExcel = CType(CreateObject("Excel.Application"), Application)
            objExcel.Visible = True
            objExcel.WindowState = XlWindowState.xlMaximized
            objworkbook = objExcel.Workbooks.Add(Pfad & "Testmappe1") 'SO GEHT ES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            objworksheet = CType(objworkbook.Worksheets("Tabelle1"), Worksheet)
            Dim I As Integer
            Dim J As Integer
            For I = 1 To 5
                For J = 1 To 18
                    objworksheet.Cells(I, J) = I + J
                Next J
                ''objworkbook.SaveAs(Pfad & "ExcelMitVb.xlsx")
                '' objworkbook.Close()
                ''objExcel.Quit()
            Next I

        End Sub

    End Class

    _______________________________________________________________________________________

    Nochmals Dank an beide Berater

    Gruß Jürgen

    Samstag, 5. Januar 2019 13:08
  • Hallo Jürgen,

    mich irritiert die Klassenangabe in der Fehlermeldung. Kann es sein, dass Du gar keinen Verweis auf die Microsoft Excel Object COM Library in deinem Projekt hast, sondern aufgrund vorheriger Fehler eigene Klassen für Excel.Application, ... erstellt hast?

    Wenn ich den COM Verweis korrekt einbinde und über:

    Imports Microsoft.Office.Interop

    den Namespace einbinde, klappt dein Code bei mir problemlos.

    Den Tipp von Peter bzw. Option Strict On solltest Du aber dennoch beherzigen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Samstag, 5. Januar 2019 11:32
  • Hallo Peter,

    ich weiß, darum ging es mir aber nicht.

    Seine Fehlermeldung war ja "... nicht in den Klassentyp "TestApp3.Excel.Application" umgewandelt ..."

    Die dürfte so aber gar nicht kommen. Daher nehme ich an, dass zur Entwicklungszeit die Zeilen rot unterkringelt waren und Jürgen dann als "Abhilfe" entsprechende Klassen von VS hat erstellen lassen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Samstag, 5. Januar 2019 12:25

Alle Antworten

  • Hi Jürgen,
    CreateObject liefert einen Verweis auf ein "Object". Wenn also Option Strict On eingestellt ist, muss der Verweis als vom Typ Excel.Application bekanntgeben werden. Das macht man mit ein Typecasting entweder mit CType oder mit TryParse, alSo so:

            Dim objExcel As Excel.Application
            Dim objworkbook As Excel.Workbook
            Dim objworksheet As Excel.Worksheet
            objExcel = CType(CreateObject("Excel.Application"), Excel.Application)

    Mit Option Strict Off macht die Typkonvertierung vom Compiler im Hintergrund eingebauter Code zur Ausführungszeit. Empfehlen kann ich Option Strict Off nicht, da damit der Aufwand für die Erstellung einer Software mit hoher Qualität stark erhöht wird, da fehlerhafte Zuweisungen erst zur Ausführungszeit ggf. erst zufällig erkannt werden.

    Array sind in einem DataGrid nur mit zusätzlichem Aufwand darstellbar. Die einfachste Lösung ist die Nutzung des DataGrids im virtuellen Modus. Da braucht man nur in der entsprechenden Methode die Zeilen- und Spaltennummer für den Inhalt in einem 2-dimensionalen Array nutzen. Besser ist es in den meisten Fällen, anstelle mit Arrays mit Listen von Datenobjekten zu arbeiten. Jedes Datenobjekt wird dann in einer Zeile des DataGrids dargestellt. Die einzelnen Eigenschaften eines Datenobjektes werden dann in den Spalten der Zeile dargestellt. Das lässt sich einfach über Bindung (DataSource) lösen.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks


    Freitag, 4. Januar 2019 14:57
  • Hallo Peter, vielen Dank für die erste Antwort >werde versuchen, damit weiter zu kommen.

    Viele Grüße Jürgen

    Freitag, 4. Januar 2019 18:04
  • Hallo Jürgen,

    mich irritiert die Klassenangabe in der Fehlermeldung. Kann es sein, dass Du gar keinen Verweis auf die Microsoft Excel Object COM Library in deinem Projekt hast, sondern aufgrund vorheriger Fehler eigene Klassen für Excel.Application, ... erstellt hast?

    Wenn ich den COM Verweis korrekt einbinde und über:

    Imports Microsoft.Office.Interop

    den Namespace einbinde, klappt dein Code bei mir problemlos.

    Den Tipp von Peter bzw. Option Strict On solltest Du aber dennoch beherzigen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Samstag, 5. Januar 2019 11:32
  • Hi Stefan,
    der Code von Jürgen klappt aber nur mit Option Strict Off. Mit Option Strict On ist Typconvertierung angesagt:


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    Samstag, 5. Januar 2019 12:16
  • Hallo Peter,

    ich weiß, darum ging es mir aber nicht.

    Seine Fehlermeldung war ja "... nicht in den Klassentyp "TestApp3.Excel.Application" umgewandelt ..."

    Die dürfte so aber gar nicht kommen. Daher nehme ich an, dass zur Entwicklungszeit die Zeilen rot unterkringelt waren und Jürgen dann als "Abhilfe" entsprechende Klassen von VS hat erstellen lassen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Samstag, 5. Januar 2019 12:25
  • Hallo Stefan, das war*s erst einmal. Ich hatte angenommen, der Verweis ist drin, war er aber nicht. Jetzt geht das erst einmal. Den Hinweis mit Option Strict On werde ich beachten. Nochmals danke sagt Jürgen auch für den Hinweis von Peter
    Samstag, 5. Januar 2019 12:27
  • So Geht es auch mit  Option Strict On

    Option Strict On
    Imports Microsoft.Office.Interop
    Imports Microsoft.Office.Interop.Excel
    Public Class FrmHaupt
        Public Pfad As String
        Private Sub CmdZuExcel_Click(sender As Object, e As EventArgs) Handles CmdZuExcel.Click
            Pfad = "D:\Eigene Dokumente\VBA_Tests\Patientenbefragung\Versionen\" 'Dort steckt die Testdatei1.xlsm
            Dim objExcel As Excel.Application
            Dim objworkbook As Excel.Workbook
            Dim objworksheet As Excel.Worksheet
            objExcel = CType(CreateObject("Excel.Application"), Application)
            objExcel.Visible = True
            objExcel.WindowState = XlWindowState.xlMaximized
            objworkbook = objExcel.Workbooks.Add(Pfad & "Testmappe1") 'SO GEHT ES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            objworksheet = CType(objworkbook.Worksheets("Tabelle1"), Worksheet)
            Dim I As Integer
            Dim J As Integer
            For I = 1 To 5
                For J = 1 To 18
                    objworksheet.Cells(I, J) = I + J
                Next J
                ''objworkbook.SaveAs(Pfad & "ExcelMitVb.xlsx")
                '' objworkbook.Close()
                ''objExcel.Quit()
            Next I

        End Sub

    End Class

    _______________________________________________________________________________________

    Nochmals Dank an beide Berater

    Gruß Jürgen

    Samstag, 5. Januar 2019 13:08