Benutzer mit den meisten Antworten
Problem mit CreateObject bei Visual Basic 2017 und bei Deklaration einer Excel.Application

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
- Verschoben Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 18. Januar 2019 14:38 Richtiges Forum, aus: Visual Studio Team Foundation Server
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- Bearbeitet Peter Fleischer Freitag, 4. Januar 2019 19:09
- Als Antwort vorgeschlagen Stefan Falz Montag, 7. Januar 2019 08:34
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 18. Januar 2019 14:41
-
So Geht es auch mit Option Strict On
Option Strict OnImports Microsoft.Office.Interop
Imports Microsoft.Office.Interop.ExcelPublic 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
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 18. Januar 2019 14:42
-
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- Als Antwort vorgeschlagen Stefan Falz Montag, 7. Januar 2019 08:34
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 18. Januar 2019 14:42
-
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- Als Antwort vorgeschlagen Stefan Falz Montag, 7. Januar 2019 08:34
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 18. Januar 2019 14:42
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- Bearbeitet Peter Fleischer Freitag, 4. Januar 2019 19:09
- Als Antwort vorgeschlagen Stefan Falz Montag, 7. Januar 2019 08:34
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 18. Januar 2019 14:41
-
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- Als Antwort vorgeschlagen Stefan Falz Montag, 7. Januar 2019 08:34
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 18. Januar 2019 14:42
-
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 -
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- Als Antwort vorgeschlagen Stefan Falz Montag, 7. Januar 2019 08:34
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 18. Januar 2019 14:42
-
-
So Geht es auch mit Option Strict On
Option Strict OnImports Microsoft.Office.Interop
Imports Microsoft.Office.Interop.ExcelPublic 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
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 18. Januar 2019 14:42