none
SeriesCollection.Errorbars TypMismatch Fehler bei erstellen von Fehlerindikatoren in PowerPoint Charts via VB.net RRS feed

  • Frage

  • Hallo,

    ich bin neu hier und habe folgendes Problem:

    Ich möchte per VB.net in einem PowerPoint Chart Fehlerindikatoren (Errorbars) einfügen. Dazu greife ich in einer PowerPoint Instanz auf das Chart Objekt in der aktiven Präsentation zu. Eine Excelinstanz wird geöffnet, in der die Daten für das Chart hinterlegt sind.

    Mit folgender Zeile weise ich einer Datenreihe dann die Errorbar Parameter zu.

    MyChart.SeriesCollection(1).ErrorBar(Direction:=Excel.XlErrorBarDirection.xlY, Include:=Excel.XlErrorBarInclude.xlErrorBarIncludeBoth, _
                                                  Type:=Excel.XlErrorBarType.xlErrorBarTypeCustom, Amount:=MaxRng, MinusValues:=MinRng)


    an dieser Stelle bekomme ich immer einen Typ Mismatch Fehler. 0x80020005 (DISP_E_TYPEMISMATCH)

    Ich habe versucht, die Parameter direkt als Long Werte zu übergeben, aber es kommt der gleiche Fehler.

    Wenn man das Ganze in VBA direkt in Excel ausführt klappt es einwandfrei.

    With ActiveSheet.ChartObjects(1).Chart
        
            .SeriesCollection(1).ErrorBar Direction:=dir, Include:=linc, _
                Type:=ltyp, Amount:=Range("B9:B11"), _
                MinusValues:=Range("B13:B15")
    end with

    Leider finde ich im Objektbrowser keine Information über die genauen Parameter für die Errorbar Methode.

    Ich hoffe, das jemand eine Idee hat, wie ich die Errorbars per VB.net in einem Chart anzeigen kann.

    Gruß,

    Michael

    Montag, 9. November 2015 10:21

Antworten

Alle Antworten

  • Hallo Michael,

    die Methode ErrorBar von Series erwartet die Parameter nicht von Microsoft.Office.Interop.Excel sondern von  Microsoft.Office.Interop.PowerPoint:

    Microsoft.Office.Interop.PowerPoint.XIErrorBarDirection

    Microsoft.Office.Interop.PowerPoint.XIErrorBarInclude

    Microsoft.Office.Interop.PowerPoint.XIErrorBarType

    Grüße

    Montag, 9. November 2015 11:16
  • Hallo,

    Danke für die schnelle Antwort. Ich habe das jetzt im Code geändert, aber es tritt immer noch der Fehler auf.

    Zum besseren Verständnis habe ich hier mal den Code:

    Sub InsertErrorBars(ByVal mySlide As PowerPoint.Slide)
            Dim myChart As PowerPoint.Chart
            Dim gChartData As PowerPoint.ChartData
            Dim gWorkBook As Excel.Workbook
            Dim gWorkSheet As Excel.Worksheet
    
            ' Das Chart "TopDiag" referenzieren und aktivieren
            myChart = mySlide.Shapes("TopDiag").Chart
            gChartData = myChart.ChartData
            gChartData.Activate()
            ' Es öffnet sich Excel mit den Daten des Charts
    
            ' Auf das Excel Workbook / sheet referenzieren
            gWorkBook = gChartData.Workbook
            gWorkSheet = gWorkBook.Worksheets(1)
    
            With gWorkSheet
                'Bereich für die Fehlerindikatoren definieren
                Dim MaxRng = .Range(.Cells(6, 2), .Cells(8, 2)).Address
                Dim MinRng = .Range(.Cells(10, 2), .Cells(12, 2)).Address
    
                With myChart
                    'Fehlerindikatoren einfügen
                    .SeriesCollection(1).HasErrorBars = True
    
                    ' Benutzerdefinierte Werte für Fehlerindikatoren setzen
                    .SeriesCollection(1).ErrorBar(Direction:=PowerPoint.XlErrorBarDirection.xlChartY, Include:=PowerPoint.XlErrorBarInclude.xlErrorBarIncludeBoth, _
                                                  Type:=PowerPoint.XlErrorBarType.xlErrorBarTypeCustom, Amount:=MaxRng, MinusValues:=MinRng)
                    Dim ldir As Long = 1
                    Dim ltyp As Long = -4114
                    Dim linc As Long = 1
                    '.SeriesCollection(1).errorbar(0, 1, 0) '(Direction:=ldir, Include:=linc, Type:=ltyp, Amount:=MaxRng, MinusValues:=MinRng)
                    'Hier ensteht die Fehlermeldung TypMismatch.
                    'Selbst wenn alle Enums durch gültige Zahlenwerte ersetzt werden wird ein Ausnahmefehler ausgegeben.
                    'Der gleiche Befehl in VBA direkt in Excel ausgeführt funktioniert einwandfrei.
    
                End With
            End With
            ' schließen des Excelsheets. Datenänderungen werden in das Chart übernommen.
            gWorkBook.Close()
            Marshal.ReleaseComObject(gWorkBook)
            Marshal.ReleaseComObject(gChartData)
            Marshal.ReleaseComObject(myChart)
        End Sub
     

    Gruß,

    Michael

    Montag, 9. November 2015 13:52
  • Hallo Michael,

    Versuch Mal in der Methode die Range Objekte zu übergeben.

    Dim MaxRng = .Range(.Cells(6, 2), .Cells(8, 2))
    Dim MinRng = .Range(.Cells(10, 2), .Cells(12, 2))

    Grüße

    Montag, 9. November 2015 22:16
  • Hallo,

    ich habe jetzt folgendes ausprobiert:

                    .SeriesCollection(1).ErrorBar(Direction:=PowerPoint.XlErrorBarDirection.xlChartY, Include:=PowerPoint.XlErrorBarInclude.xlErrorBarIncludeBoth, _
                                                  Type:=PowerPoint.XlErrorBarType.xlErrorBarTypeCustom, _
                                                  Amount:=gWorkSheet.Range(gWorkSheet.Cells(6, 2), gWorkSheet.Cells(8, 2)).Address, _
                                                  MinusValues:=gWorkSheet.Range(gWorkSheet.Cells(10, 2), gWorkSheet.Cells(12, 2)).Address)
                   

    Damit bekomme ich einen Ausnahmefehler 0x800A03EC

    Wenn ich es so versuche:

    .SeriesCollection(1).ErrorBar(Direction:=PowerPoint.XlErrorBarDirection.xlChartY, Include:=PowerPoint.XlErrorBarInclude.xlErrorBarIncludeBoth, _
                                                  Type:=PowerPoint.XlErrorBarType.xlErrorBarTypeCustom, _
                                                  Amount:=gWorkSheet.Range(gWorkSheet.Cells(6, 2), gWorkSheet.Cells(8, 2)), _
                                                  MinusValues:=gWorkSheet.Range(gWorkSheet.Cells(10, 2), gWorkSheet.Cells(12, 2)))

    bekomme ich weiterhin den TypeMismatch Fehler.

    Grüße,

    Dienstag, 10. November 2015 07:41
  • Hallo,

    dann kann man  versuchen einen String in der Form "MyShapeName!$A$1:$A$5" in der Methode zu übergeben, d.h. ein String aus gWorkSheet.Name + "!" +  myRange.get_Address() zu bilden.

    Grüße

    Dienstag, 10. November 2015 10:16
  • Hallo,

    SUUUPER  !!!!!

    Es funktioniert jetzt !!!  Vielen Dank. Das war die Lösung.

     .SeriesCollection(1).ErrorBar(Direction:=PowerPoint.XlErrorBarDirection.xlChartY, Include:=PowerPoint.XlErrorBarInclude.xlErrorBarIncludeBoth, _
                                                  Type:=PowerPoint.XlErrorBarType.xlErrorBarTypeCustom, _
                                                  Amount:="Tabelle1!B6:B8", _
                                                  MinusValues:="Tabelle1!B10:B12")
     

    Auch wenn ich nicht wirklich verstehe, warum ich ein Range Objekt nicht als Parameter übergeben kann (anders als direkt in Excel VBA), ist die Übergabe als String die Lösung.

    Danke für Deine Hilfe !

    Grüße,

    Michael

    Dienstag, 10. November 2015 11:00