Mit VB.NET ein Excel Diagramm erstellen

  • VB.NET
  • .NET 4.5

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von friedel.

    Mit VB.NET ein Excel Diagramm erstellen

    Halle ich gehöre zur ü66 Generation und es fäfft mir sehr schwer mit den Objecten umzugehen.
    Meine 3 Gehirnzellen möchte ich aber nicht ganz verkümmern lassen deshalb versuche ich es trotzdem.
    Nun zu meimen Problem.
    Ich versuche ein Excel diagramm über VB.Net mit Daten die aus Access in eimer ARRAYListe vorliegen zu erstellen.
    Die Fehlermeldung, die ich erhalte:
    System.NullReferenceException: "Die Objektvariable oder die With-Blockvariable wurde nicht festgelegt."
    Der Code sieht wie folgt aus.
    Bitte keine Diskussion über Sinn oder Unsinn dieses Lösungansatzes.
    Bitte nur um Hilfe, die ich auch verstehe.
    Recht herzlichen Dank für Hilfestellungen
    Viele Grüße
    Friedel

    VB.NET-Quellcode

    1. 'Erstellt ein neues Datenblatt vor dem vorhandenem Blatt
    2. Dim xlSheet2 As Excel.Worksheet = CType(xlBook.Sheets.Add(), Worksheet)
    3. 'Neuer Name des Tabellenblatts
    4. xlSheet2.Name = "Aktien Chart"
    5. Dim myChart As Excel.ChartObjects
    6. myChart = xlBook.ActiveChart
    7. With myChart
    8. .ChartType = XlChartType.xlLine
    9. .SeriesCollection(1).HasDataLabels = True
    10. .SeriesCollection(1).XValues = a_datum.ToArray 'Die X-Daten Datum
    11. .SeriesCollection(1).Values = a_wert.ToArray 'Die Y Daten Kurswerte
    12. .HasTitle = True
    13. .ChartTitle.Text = AknName & " vom " & StartDatum & " bis " & EndDatum &
    14. vbCrLf & " min. Wert " & Format(min_werte, "#,##0.00 €") & " max. Wert " & Format(max_werte, "#,##0.00 €")
    15. .HasLegend = False
    16. End With


    Topic verschoben und Code von Textdatei in den Text+CodeTags gesetzt. ~VaporiZed
    Dateien
    • Fehler.txt

      (1,03 kB, 3 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    @friedel Willkommen im Forum. :thumbup:

    VB.NET-Quellcode

    1. Dim myChart As Excel.ChartObjects
    2. myChart = xlBook.ActiveChart ' hier

    Hier kommt bei myChart nix an, da greifen die folgenden Zeilen ins Leere.
    Woher hast Du denn diesen Code?
    Und:
    Beim nächsten Mal markierst Du bitte die Zeile, in der der Fehler auftritt. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es ist ein stückweit immer gefährlich mit ActiveSheet, ActiveChart etc. zu arbeiten. Manchmal glaubt man zu wissen, mit welchem Objekt man da gerade rumhantiert, aber oft liegt man auch daneben. Wie RfG schon sagt: hier geht's mit dem o.g. Code daneben, da Du zuerst der Arbeitsmappe ein neues Blatt hinzufügst und dann mit ActiveChart auf etwas zugreifen willst, was nicht mehr existiert. Auch wenn vorher in einer laufenden Excelanwendung ein Diagramm ausgewählt war, wird es durch das Hinzufügen eines neuen Blatts deselektiert. ActiveChart wird somit Nothing und schwupps: ist Deine Exception da. Daher immer quasi absolut referenzieren, also angeben, welches Chart auf welchem Sheet Du verändert willst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Erst einmal vielen Dank das Ihr euch die mühe gemacht habt euch mit meinem Problen zu beschäftigen.
    Es handelt sich nur um einen Auszug aus dem Programm.
    Auf dem 1. Excelblatt stehen nur allgemeine Infos.
    Auf dem neuen Blatt soll ein neues Diagramm erstellt werden mit den Daten die in demn Arrays d_datum und a_wert stehen. Geht das überhaupt?

    Mein Problem ist das ich das mit den Objekten nicht ganz verstanden habe.
    Gabs halt nicht zu meiner Zeit.
    Diese Anwendung hatte ich einmal vor über 30Jahren in VB6 geschrieben. Läuft aber mit win10 nicht mehr. Deshalb wäre es sehr nett von Euch wenn ich das Chart über das Array dastellen könnte.
    Vielen Dank

    Ich möchte noch kurz anmerken das ich kein Programmierer oder EDV Profi bin!

    friedel schrieb:

    in VB6 geschrieben.
    Möglicherweise bist Du da dem Fehler aufgelaufen, den Form-Namen als Instanz zu verwenden:

    VB.NET-Quellcode

    1. Form2.Show()
    Und spätestens hier musst Du Dich tatsächlich mal mit Instanzen und New und solch auseinandersetzen.
    Gugst Du hier:
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ein neues Sheet hat noch kein Chart. Deshalb kannst Du nicht darauf zugreifen. Das muss erst erstellt werden. Allerdings habe ich momentan nicht die Möglichkeit, da Code zu liefern. Schmeiß einfach in Excel den Makrorecoder an, erstell ein passendes Diagramm und übernimm den VBA-Code nach VB.NET. Meist sind da nur wenige Anpassungen nötig.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Also mit den Forms hat das nichts zu tun.
    Die Idee mit dem Macroreader ist zwar nicht schlecht leider hilt das nicht sehr weit, da die Daten aus Access kommen und ich sie als Array übergeben möchte. Wenn ich sie mir anzeigen lasse dauert es extrem lange.
    Wat? Dass das nix mit den Forms zu tun hat, ist klar, aber es war ein dezenter Hinweis von RfG, dass Dein Code ein stückweit unsauber aufgebaut ist. Wenn Dir das egal ist, ist das Deine Sache.
    Aber den Einwand mit dem Makrorecorder kann ich nicht gelten lassen. Mir ist das wurscht, woher die Daten kommen, aber nicht, wohin sie gehen. Und Dir auch nicht. Warum? Weil Du genau an der Stelle scheiterst, sagst Du ja selbst. Und um diesen Punkt zu beheben, schmeiß den Makrorecorder in Excel an und … ach, was soll's. Ich mach dann mal: Ich schmeiß den Recoder in Excel an, füge ein Diagramm ein, stoppe den Recorder, sieh mir den generierten Code an:

    Visual Basic-Quellcode

    1. ActiveSheet.Shapes.AddChart2(240, xlXYScatter).Select


    Reicht mir, um in VB.NET weiterzumachen und was rauszubekommen - und zwar unabhängig davon, woher die Diagrammdaten kommen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hallo VaporiZed
    danke das du dir die mühe mit dem Macroreader gemacht hast aber da fangen meine Verständnisprobleme an es ist scheinbar ein etwas anderes VB und nicht VB.NET.
    Ich versuch mein Problem mit VisualStudio2019 zu lösen und ich dachte mit dieser Zeile
    Dim xlSheet2 As Excel.Worksheet = CType(xlBook.Sheets.Add(), Worksheet)
    definiere ich das ActiveSheet dem ist leider nicht so.
    Ich bekomme die Fehlermeldung ActiveSheet wurde nicht definiert.
    Ich hoffe da kannst du mir noch einmal weiterhelfen.
    Mein Code war ja auch der in Excel generierte. Excel weiß, was da ActiveSheet ist. Aber Du hast stattdessen xlSheet2. Das solltest Du auch verwenden. Daher ergibt sich für diese Codezeile in VB.NET:

    VB.NET-Quellcode

    1. Dim Chart = xlSheet2.Shapes.AddChart2(-1, Excel.XlChartType.xlLine).Chart
    Und dann kannst Du mit Chart weitermachen, also so, wie Du in Post#1 ab Zeile#10 mit myChart gearbeitet hast.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hallo VaporiZed
    toll das du nicht an meiner Unwissenheit verzweifelst. Danke!
    Leider Führt dein Vorschlag zu dem Fehler:
    System.Runtime.InteropServices.COMException: "Mitglied nicht gefunden. (Ausnahme von HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))".

    Ich glaube mein Ansatz war schon nicht richtig das ich erst ein leere 2. Blatt erstellt habe.
    Da Chart Sheet kann man doch auch gleich bei der Add Methode generieren.

    Aber auch damit habe ich meine Probleme.
    Ich hoffe du investiest noch etwas Zeit für mich.
    Bei Erfolg komme ich auf ein Getränk vorbei!
    hier ein einfaches Bsp. deine Array Daten muss du mit Range angeben

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports Microsoft.Office.Interop.Excel
    3. Imports Microsoft.Office.Interop
    4. Public Class Form1
    5. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    6. Dim xlApp As New Microsoft.Office.Interop.Excel.Application()
    7. Dim xlWorkBook As Excel.Workbook
    8. Dim xlWorkSheet As Excel.Worksheet
    9. Dim misValue As Object = System.Reflection.Missing.Value
    10. xlWorkBook = xlApp.Workbooks.Add(misValue)
    11. xlWorkSheet = CType(xlWorkBook.Sheets("Tabelle1"), Worksheet)
    12. 'array data
    13. xlWorkSheet.Cells(1, 1) = ""
    14. xlWorkSheet.Cells(1, 2) = "Verkauf1"
    15. xlWorkSheet.Cells(1, 3) = "Verkauf2"
    16. xlWorkSheet.Cells(1, 4) = "Verkauf3"
    17. xlWorkSheet.Cells(2, 1) = "Stuttgart"
    18. xlWorkSheet.Cells(2, 2) = "80"
    19. xlWorkSheet.Cells(2, 3) = "65"
    20. xlWorkSheet.Cells(2, 4) = "45"
    21. xlWorkSheet.Cells(3, 1) = "Frankfurt"
    22. xlWorkSheet.Cells(3, 2) = "78"
    23. xlWorkSheet.Cells(3, 3) = "72"
    24. xlWorkSheet.Cells(3, 4) = "60"
    25. xlWorkSheet.Cells(4, 1) = "Köln"
    26. xlWorkSheet.Cells(4, 2) = "82"
    27. xlWorkSheet.Cells(4, 3) = "80"
    28. xlWorkSheet.Cells(4, 4) = "65"
    29. xlWorkSheet.Cells(5, 1) = "München"
    30. xlWorkSheet.Cells(5, 2) = "75"
    31. xlWorkSheet.Cells(5, 3) = "82"
    32. xlWorkSheet.Cells(5, 4) = "68"
    33. 'create chart
    34. Dim chartPage As Excel.Chart
    35. Dim xlCharts As Excel.ChartObjects
    36. Dim myChart As Excel.ChartObject
    37. Dim chartRange As Excel.Range
    38. xlCharts = CType(xlWorkSheet.ChartObjects, ChartObjects)
    39. myChart = xlCharts.Add(10, 80, 300, 250)
    40. chartPage = myChart.Chart
    41. chartRange = xlWorkSheet.Range("A1", "d5") 'dein Array
    42. chartPage.SetSourceData(Source:=chartRange)
    43. 'chartPage.ChartType = Excel.XlChartType.xlColumnClustered
    44. chartPage.ChartType = XlChartType.xlLine
    45. xlWorkSheet.SaveAs("E:\TestFolder\ChartVerkauf.xlsx")
    46. xlWorkBook.Close()
    47. xlApp.Quit()
    48. releaseObject(xlApp)
    49. releaseObject(xlWorkBook)
    50. releaseObject(xlWorkSheet)
    51. MsgBox("Excel Datei erstellt")
    52. End Sub
    53. Private Sub releaseObject(ByVal obj As Object)
    54. Try
    55. System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
    56. obj = Nothing
    57. Catch ex As Exception
    58. obj = Nothing
    59. Finally
    60. GC.Collect()
    61. End Try
    62. End Sub
    63. End Class