Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1724to1728
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

ohne doppelten Legenden-Eintrag

ohne doppelten Legenden-Eintrag
21.11.2019 19:43:50
Toni
Hallo!
weiß jemand, wie man doppelte Einträge in der Legende eines Charts vermeidet? In der Datei anbei funktioniert es nur, weil es jeweils 2 Auftreten der Überschriften gibt ; wünschenswert wäre, dass das auch dynamisch bei unterschiedlicher Anzahl Überschriften funktionieren täten tut.
https://www.herber.de/bbs/user/133358.xlsm
es betrifft diese Zeilen, deren Ergebnis richtig und Code aber Schrott ist:
  • On Error Resume Next For i = 1 To .Legend.LegendEntries.Count .Legend.LegendEntries(i).Delete Next i
  • Danke für jedwede Tipps!
    lG
    Toni

    5
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: ohne doppelten Legenden-Eintrag
    22.11.2019 08:08:20
    Luschi
    Hallo Toni,
    bei mir klappt das so:
    
    Sub Diagramm()
    Dim cht As ChartObject, i As Integer, cont, rg2 As Range
    Dim j As Integer, such As String, matsuch As Integer, rg1 As Range
    Dim legText As String, legIndex As String, legArr As Variant
    With Worksheets("Tabelle1")
    Set rg1 = .Range("M1:M4")
    Set rg2 = .Range("A2").CurrentRegion
    End With
    For Each cht In ActiveSheet.ChartObjects
    cht.Delete
    Next cht
    Set cht = ActiveSheet.ChartObjects.Add(100, 100, 400, 250)
    With cht.Chart
    .ChartType = xlBarStacked
    .SetSourceData Source:=rg2, PlotBy:=xlColumns
    legText = "*": legIndex = "*"
    For j = 1 To .SeriesCollection.Count
    such = .SeriesCollection(j).Name
    matsuch = Application.WorksheetFunction.Match(such, rg1, 0)
    .SeriesCollection(j).Interior.ColorIndex = matsuch
    If InStr(1, legText, such, vbTextCompare) = 0 Then
    'Index der doppelten Einträge sammeln
    'SerienCollection.Name = Teil der Legenden-Üverschrift
    legText = legText & such & "*"
    Else
    'doppelte Eintrage (Index des Eintrags) sammeln
    legIndex = legIndex & j & "*"
    End If
    Next j
    .Legend.Clear
    .HasLegend = True
    .Legend.Position = xlLegendPositionTop
    legArr = Split(legIndex, "*", -1, vbTextCompare)
    For i = UBound(legArr) To LBound(legArr) Step -1 'rückwärts Array durchlaufen!
    'vorwärts wird mit Löschung eines Legendeneintrags neu indiziert!
    If legArr(i)  "" Then
    .Legend.LegendEntries(CInt(legArr(i))).Delete
    End If
    Next i
    legText = "": legIndex = ""
    If VarType(legArr) >= vbArray Then
    Erase legArr
    End If
    ''        legText = ""
    ''        For i = 1 To 4
    ''            cont = rg1.Cells(i, 1).Value
    ''            .Legend.LegendEntries(1).Item(1).Text = rg1.Cells(1, i).Value
    ''            .Legend.LegendEntries(1).MarkerBackgroundColorIndex = i
    ''            .SeriesCollection(i).Name = "=""" & cont & """"
    ''            .Legend.LegendEntries(i).LegendKey.Interior.ColorIndex = 11 + i
    ''        Next i
    End With
    End Sub
    
    Gruß von Luschi
    aus klein-Paris
    Anzeige
    AW: ohne doppelten Legenden-Eintrag
    22.11.2019 11:08:40
    Toni
    Hallo Luschi,
    die Indizes in den String abfischen hatte mir gefehlt. Durch das Outsourcen ins Array läuft man dann auch nicht gegen den LegendEntries.count step-1 - Fehler, wie ich es beim Probieren getan habe. Die Neuindizierung hatte ich ebenfalls vermutet, hatte jetzt aber nicht die Verbindung von LegendEntries & SeriesCollection auf dem Schirm.
    Sehr cool, Danke für Deine Zeit!
    Reine Verständnisfrage: Aus Codierungs-Sicht sicher folgerichtig, nur: könnte man das Erase auch weglassen oder gibt es da irgend einen Vorteil bzw. Notwendigkeit, die ich noch nicht kenne?
    lG
    Toni
    Anzeige
    AW: ohne doppelten Legenden-Eintrag
    22.11.2019 11:36:03
    Luschi
    Hallo Toni,
    selbsterzeugte Objektvariablen (und 'legArr' ist solch ein Speicherobjekt), sollte man schon selber auch wieder deaktivieren/löschen und es nicht Vba überlassen, auch wenn in Schulungsvideos von Video2Brain/ LinkedIn (z.B. von Lorenz Hölscher) es für nicht erforderlich gehalten wird.
    In höheren Programmiersprachen wie C#/VB.Net wurde extra eine USING-Methode eingeführt, die diese Bereichs-Objektvariablen überwachen und bei END USING diese Variablen frei geben für den GC (Garbage Collector). In Vba gibt es solche Technologie nicht und die Variablen sind zwar nicht mehr ansprechbar, liegen aber sinnlos im Heap-Speicher rum. Die einfachen Variablen [Integer, Long usw. (außer Strings)] liegen im Stack-Speicher und werden nach Verlassen der Sub/Function gelöscht.
    Gruß von Luschi
    aus klein-Paris
    Anzeige
    AW: Nachtrag...
    22.11.2019 11:44:41
    Luschi
    Hallo Toni,
    natürlich sollten zum Schluß auch 'cht', 'rg1' und 'rg2' zerstört werden:
    Set cht = Nothing: Set rg1 = Nothing: Set rg2 = Nothing
    End Sub
    mfg Luschi
    AW: Nachtrag...
    22.11.2019 13:11:51
    Toni
    OK,
    also hat es auch einen Lerneffekt in Bezug auf andere Sprachen. Falls ich die mal anfange, brauche ich den Teil schonmal nicht mehr zu lernen. Ich nehme das auf jeden Fall mit, den Code, den man so 'verzapft' grundsätzlich am Ende auch wieder 'sauber' zu machen :).
    DANKE, dass Du Dein Wissen teilst! Ich schätze das sehr.
    Ein schönes Wochenende Dir!
    lG
    Toni

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige