Excel Diagramme Dynamisch erweitern

Hallo Excel-Experten,

ich habe hier mal eine Beispielmappe hochgeladen.
Auf dem Blatt „Tabelle1“ gibt es 3 Spalten mit „Messergebnissen“:
Spalte A: Infos zu den Messungen
Spalte B: Die Position eines Polarisators bei der Messung (leere Zellen = kein Polarisator)
Spalte C: Die Messwerte.
In dieser Tabelle habe ich 2 Namen definiert: info und messwerte. Zur Erläuterung stehen die Definitionen in Spalte G.
Im Diagramm auf Blatt „Diag Alle“ habe ich die definierte Namen in die Diagrammformel eingebaut: Wenn ich jetzt in der Tabelle weitere Messdaten anfüge, werden sie automatisch im Diagramm mit angeezigt, ohne dass ich die Diagrammformel erweitern muss. Klappt wunderbar. Die Anleitung dazu gab’s hier.
Es gibt aber noch 3 weitere Diagrammblätter:
In „Diag ohne Pol“ sind nur die Werte aufgetragen, bei denen die Spalte B leer ist.
In „Diag Pol 0“ sind nur die Werte aufgetragen, bei denen in Spalte B eine 0 steht.
In „Diag Pol 90“ sind nur die Werte aufgetragen, bei denen in Spalte B eine 90 steht.

Die Diagrammformeln in diesen Diagrammen sind noch statisch. Ich muss sie also für alle neuen Messwerte immer erweitern.

Lange Rede, kurze Frage:
Gibt’s eine Möglichkeit, mit Namensdefinitionen (und vermutlich mit DIAGRAMM.VERSCHIEBEN) auch diese Diagramme dynamisch anzupassen?
Experten vor!

Danke und Gruß,
Andreas

Hallo Andreas,

ich habe leider nur eine halbe Lösung für Dich :

Im Prinzip möchtest Du deine Liste durch eine Bedingung  ( Polarisator= leer/0/90 )  reduzieren und dann diese verkürzte Liste ausgeben. Das könntest Du mit einem zweiten Tabellenblatt erreichen, in dem Deine Original-Liste mit dieser Nebenbedingung versehen ist oder unter Verwendung weiterer Spalten.

Ich habe die die mögllchen Bedingung in die Zellen E1/F1/G1 geschrieben und in der Zelle  E2  steht  =WENN(E$1=$B2;$C2;"")
Diese Zelle E2 kann ich dann auf E2:G31 kopieren und sehe dann zumindest die Reduktion, kann aber die Leer-Angaben immer noch nicht verhindern.

Ein weiterer kleiner Wermuts-Tropfen :
Die Anzeige Deines Blattes „Diag Alle“ ist bei mir nicht funktionsfähig und zeigt nur ein leeres Diagramm, da ich mit OpenOffice.Calc arbeite. Die Datenbereiche wurden einfach nicht mit konvertiert - oder die von Dir verwendete Funktion ist relativ neu.

Mit Gruß,
                   Frank-Thomas

Berichtigung
Sorry,

statt DIAGRAMM.VERSCHIEBEN muss es natürlich heißen BEREICH.VERSCHIEBEN.

Andreas

Vba Diagramm diskontinuierliche Daten dynamisch
http://www.file-upload.net/download-8394481/Dynamisc…

Gibt’s eine Möglichkeit, mit Namensdefinitionen (und
vermutlich mit DIAGRAMM.VERSCHIEBEN) auch diese Diagramme
dynamisch anzupassen?

K.A., ich fand bislang keine, aber bedeutet wenig da Diagramme nicht so mein Ding sind.

Experten vor!

Nönö, bei Diagrammen stelle ich mich da mangels Wissen gerne hinten an :smile:

Trotz allem habe ich dir eine Vba-Lösung gebastelt.
http://www.file-upload.net/download-8402398/DiagDisk…

Teste sie bitte ausgiebig. Wenn dir irgendwas an der Form der vier erstellten Diagrammblätter nicht passt, ändere das in der Sub „Erstelle“ ab.
Dann starte sie und sie zeichnet die Diagramme neu.

Wenn die vier Diagramme so sind wie du sie willst brauchste die Prozedur „Erstelle“ nicht mehr. Dann sollten sich die Diagramme automatisch aktualisieren wenn du in Ax:Cx etwas änderst.

Wenn für dich alles rund läuft kann man ja hier die Codes zeigen für Interessierte da fileupload nach irgendeiner Zeit die Mappe löscht, das gibt dann ungültigen Link hier im Archiv.

PS: Eine Vba-freie Lösung kann ich mir vorstellen, allerdings noch ungetestet und sie hätte Hilfsspalten.

Gruß
Reinhard

Hallo Reinhard,

ich hab eben leider nur kurz über deinen Code schauen können. Sieht für mich gut aus. So ähnlich hatte ich mir das als eine Hilfslösung auch gedacht. Dein Code ist aber wesentlich kompakter als meine Idee.
Ich komme vermutlich erst am Dienstag dazu deinen Code intensiver zu testen. Ich melde mich dann wieder.
Danke schon mal für deine Mühe und Gruß,
Andreas

PS: Auf deine VBA-freie Lösung wäre ich sehr gespannt.

Vielleicht geht das mit Pivot-Charts
Hallo Andreas,

Ich komme vermutlich erst am Dienstag dazu deinen Code
intensiver zu testen. Ich melde mich dann wieder.

okay, teste ihn dann ausgiebig ob er auch stabil ist in allen Situationen…

PS: Auf deine VBA-freie Lösung wäre ich sehr gespannt.

*aarrggss* Ich auch :smile: Denn bislang scheiterten alle Ansätze das ohne Vba zu lösen :smile:
Egal, noch habe ich die Hoffnung daß es irgendwie gehen MUß. Schaun wir ma…

Bist du in Pivot-Tabellen einigermaßen fit? Ich nämlich gar nicht. Das geht soweit daß ich gar nicht weiß ob dieser Link:
http://www.controllingportal.de/Fachinfo/Excel-Tipps…
dein Problem überhaupt lösen könnte :frowning:

Trotz Demomappe ist mir das zu kompliziert. Versuch dich dadran, ich versuche es mit normalen Funktionen zu lösen.

Gruß
Reinhard

Das muss später kommen

Hallo Andreas,

Hi Reinhard,

Bist du in Pivot-Tabellen einigermaßen fit? Ich nämlich gar

Nö, sorry. Da hab ich noch weniger Ahnung als du … :wink:

Gruß
Reinhard

Dito,
Andreas

Hallo Reinhard,

ich hab deinen Code jetzt getestet. Läuft für meine Belange einwandfrei. Vielen Dank dafür.
Um es hier vielleicht für die Allgemeinheit interessant zu machen habe ich versucht, das ganze noch etwas zu verallgemeinern:
http://www.file-upload.net/download-8413578/DiagDisk…
Kannst es dir ja mal anschauen und wenn du es für gut befindest, hier posten.
Einen Fehler habe ich noch nicht ausgemerzt: Wenn man an der Tabelle was ändert bevor die Diagramme erstellt sind, gibts einen „Index außerhalb des gültigen Bereichs“ in der Zeile „With Charts(Namen(N))“ in „Sub Aktualisiere()“. Ist auch klar. Evtl. zu Beginn der Routine abfragen, ob schon Diagramme existieren.
Man könnte auch noch darüber nachdenken, die Blattnamen und die Auswahlkriterien flexibler zu gestalten; vielleicht durch Eintragen in ein Hilfsblatt. Aber da kann man sich beleibig verkünsteln.

Gruß, Andreas

sehr dynamisches Diagramm
Hallo Andreas,

http://www.file-upload.net/download-8413578/DiagDisk…

Kannst es dir ja mal anschauen und wenn du es für gut
befindest, hier posten.

deine Änderungen sind sehr okay. Da ja Bemerkungen von dir im Code auf meinen Vorgängercode beziehen hae ich die liquidiert da sie ohne das zu wissen andere irritieren.

Wenn man an der
Tabelle was ändert bevor die Diagramme erstellt sind, gibts
einen „Index außerhalb des gültigen Bereichs“ in der Zeile
„With Charts(Namen(N))“ in „Sub Aktualisiere()“. Ist auch
klar. Evtl. zu Beginn der Routine abfragen, ob schon Diagramme
existieren.

Ist bereinigt bzw. integriert.

Man könnte auch noch darüber nachdenken, die Blattnamen und
die Auswahlkriterien flexibler zu gestalten; vielleicht durch
Eintragen in ein Hilfsblatt. Aber da kann man sich beleibig
verkünsteln.

„beleibig“? Jawoll, das passt sehr zu kommenden Festtagen in Folge :smile:)

Was du vorschlägst ginge natürlich aber ich sehe da keinen Handlungsbedarf alles was da möglich wäre auch zu machen. Sehe es realistisch, versuche mal meine deine Uploads downzuladen, dann kannste ja leicht das hier vorhandene Interesse einschätzen da ja da die Anzahl der Downloadzeil angezeigt wird :frowning:

Was völlig anderes ist es wenn jmd. nachfragt wie er dies oder jenes „einbauen“ könnte.

Nachfolgend unser Code

Gruß
Reinhard

Wenn der Link zu der Datei nicht mehr funktioniert:

Legende:
Blatt Tabelle1 hat dreispältige Tabelle in A:C.
In A stehen Bezeichnungen.
In B steht entweder 90 oder 0 oder nix.
In C stehen Messwerte.

Aufgabe:
Code basteln der aus diesen Rohdaten vier Diagrammblätter erstellt. Diagrammtyp „Säule“.
Diagramm1: alle A-Werte als x und alle C-Werte als y.
Diagramm2: nur A-Werte als x und nur C-Werte als y wo in B die 90 steht
Diagramm3: nur A-Werte als x und nur C-Werte als y wo in B die 0 steht
Diagramm4: nur A-Werte als x und nur C-Werte als y wo in B nix steht

Das ganze vollautomatisch aktualisiert bei jedweder Änderung von Zellen in A:C.

Lösungscode von Andreas und mir:
PS: Kann uns beiden ein guter Excelianer weiterhelfen bei der „Warum“-Frage die im Code steht?

Im Modul von Tabelle1:

Option Explicit

Private Sub Worksheet\_Change(ByVal Target As Range)
Dim N As Integer, Namen, Sh, Anz As Integer
Namen = Array("DiagAlle", "DiagOhne", "DiagNull", "Diag90")
Set Target = Intersect(Target, Range("A:C"))
If Target Is Nothing Then Exit Sub
For N = LBound(Namen) To UBound(Namen)
 For Each Sh In ThisWorkbook.Sheets
 If Sh.Name = Namen(N) Then Anz = Anz + 1
 Next Sh
Next N
If Anz 4 Then Call Erstelle
If Cells(Target.Row, 1) "" And Cells(Target.Row, 3) "" Then
 Call Aktualisiere
End If
End Sub

In ein Standardmodul:

Option Explicit
Option Base 1

Sub Aktualisiere()
Dim N As Integer, Namen
Namen = Array("DiagAlle", "DiagOhne", "DiagNull", "Diag90")
For N = LBound(Namen) To UBound(Namen)
 With Charts(Namen(N))
 .SetSourceData Source:=Bereich(N), PlotBy:=xlColumns
 If .SeriesCollection.Count \> 1 Then .SeriesCollection(1).Delete
 End With
Next N
End Sub

Sub Erstelle()
Dim Diag, N As Integer, Namen
Namen = Array("DiagAlle", "DiagOhne", "DiagNull", "Diag90")
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For Each Diag In Sheets
 If Diag.Name Like "Diag\*" Then Diag.Delete
Next Diag
Application.DisplayAlerts = True
For N = LBound(Namen) To UBound(Namen)
 ' klappt nicht mit .Add After:=..., egal sheet oder worksheet,
 ' neues Blatt beibt erstes Blatt, erst mit .Move after:=... klappts. Warum???
 Charts.Add after:=Sheets(Sheets.Count)
 With ActiveChart
 .Move after:=Sheets(Sheets.Count) ' mit dieser Krücke geht's dann.
 .Name = Namen(N)
 .ChartType = xlColumnClustered
 .SetSourceData Source:=Bereich(N), PlotBy:=xlColumns
 If .SeriesCollection.Count \> 1 Then .SeriesCollection(1).Delete
 .SeriesCollection(1).Interior.ColorIndex = 37
 .SeriesCollection(1).Name = .Name & " Messwerte"
 .Location Where:=xlLocationAsNewSheet
 End With
Next N
Application.ScreenUpdating = True
End Sub

Function Bereich(ByVal N As Integer) As Range
Dim Zei As Long, Z As Long, Kriterium
Kriterium = Array("alle", "", 0, 90)
With Worksheets("Tabelle1")
 Zei = .Cells(.Rows.Count, 1).End(xlUp).Row
 Select Case N
 Case 1 ' "DiagAlle"
 Set Bereich = Union(.Range("A2:A" & Zei), .Range("C2:C" & Zei))
 Case 2 To 4 ' Alle anderen Diags
 For Z = 2 To Zei
 If CStr(.Cells(Z, 2).Value) = CStr(Kriterium(N)) Then
 If Not Bereich Is Nothing Then
 Set Bereich = Union(Bereich, .Range("A" & Z, "C" & Z))
 Else
 Set Bereich = .Range("A" & Z, "C" & Z)
 End If
 End If
 Next Z
 Case Else
 'nix
 End Select
End With
End Function

Danke, sehr schön! owT
owT

Lösung ohne Vba
Hallo Andreas,

http://www.file-upload.net/download-8416669/DiagDisk…

Chart2 mit Blatt Hilf2 als Datenquelle funktioniert. Das ist für Pol=90, die anderen Charts kriegste ja nach dem Muster hin. DiagAlle haste ja schon gelöst.

Chart mit Blatt Hilf ist einer von vielen gescheiterten Versuchen :frowning:

Gruß
Reinhard

Ich war mir sicher …
Hallo Reinhard,

ich wusste, dass dir das keine Ruhe lässt. Und mir war auch klar, dass du eine Lösung findest. Die anderen Diagramme werde ich mir nach gleichem Muster erstellen.

Noch mal vielen Dank. Ich hoffe, es hat dir nicht nur Mühe sondern auch ein Bisschen Spaß gemacht.

Gruß, Andreas

Hallo Andreas,

ich wusste, dass dir das keine Ruhe lässt. Und mir war auch
klar, dass du eine Lösung findest.

in diesem Fall, der vermeintlich einfach aussieht aber im winzigen Detail sehr schwierig wird, es soll ja automatisch geschehen, war ich mir in einem sehr sicher, IRGENDEINE Formellösung werde ich finden/basteln. Und wenn ich 500 Hilfsspalten brauche *lächel*

Manuelle Dateneingabe ins Diagramm klappt ja und auch mit Autofilter, aber der ist ja auch manuell zu bedienen bezogen auf dynamische Datenliste .

Die anderen Diagramme werde ich mir nach gleichem Muster erstellen.

Ja, kriegste leicht hin. Ein Problemchen ist noch in Excel. Wenn A1 leer oder 0 sein kann und du prüfst mit Zählenwenn o.ä. ob A1 leer ist so stimmt das Ergebnis.
Prüfung auf A1=0 versagt gewissermaßen da ein Wahr herauskommt auch wenn A1 leer ist. Grad das willste ja bei dir getrennt zählen.
Eine Lösung, prüfung auf Und(A1=0;A1"") die ich in der neuen Lsg. benutzt habe.

Mit neuer Lsg. meine ich dieses:

Tabellenblatt: K:\[DiagDiskontinuierlich2.xls]!Tabelle2
 │ A │ B │ C │ D │ E │ F │ G │ H │
──┼────────────┼────────┼─────────┼──────────┼───────────┼──────────┼───────────┼──────┤
1 │ Pol-Gruppe │ Info90 │ Messw90 │ InfoLeer │ MesswLeer │ InfoNull │ MesswNull │ 1=90 │
──┼────────────┼────────┼─────────┼──────────┼───────────┼──────────┼───────────┼──────┤
2 │ 1 │ Info1 │ 18 │ Info3 │ 16 │ Info2 │ 53 │ 2="" │
──┼────────────┼────────┼─────────┼──────────┼───────────┼──────────┼───────────┼──────┤
3 │ 3 │ Info5 │ 50 │ Info4 │ 10 │ Info10 │ 50 │ 3=0 │
──┼────────────┼────────┼─────────┼──────────┼───────────┼──────────┼───────────┼──────┤
4 │ 2 │ Info8 │ 90 │ Info6 │ 90 │ Info12 │ 48 │ │
──┼────────────┼────────┼─────────┼──────────┼───────────┼──────────┼───────────┼──────┤
5 │ 2 │ Info9 │ 61 │ Info7 │ 75 │ Info18 │ 9 │ │
──┼────────────┼────────┼─────────┼──────────┼───────────┼──────────┼───────────┼──────┤
6 │ 1 │ Info14 │ 73 │ Info11 │ 20 │ Info30 │ 52 │ │
──┼────────────┼────────┼─────────┼──────────┼───────────┼──────────┼───────────┼──────┤
7 │ 2 │ Info15 │ 80 │ Info13 │ 32 │ │ │ │
──┼────────────┼────────┼─────────┼──────────┼───────────┼──────────┼───────────┼──────┤
8 │ 2 │ Info21 │ 83 │ Info16 │ 56 │ │ │ │
──┴────────────┴────────┴─────────┴──────────┴───────────┴──────────┴───────────┴──────┘
Benutzte Formeln:
A2: =WENN(Tabelle1!A2="";"";(Tabelle1!B2=90)\*1+(Tabelle1!B2="")\*2+(Tabelle1!B2=0)\*(Tabelle1!B2"")\*3)
A3: =WENN(Tabelle1!A3="";"";(Tabelle1!B3=90)\*1+(Tabelle1!B3="")\*2+(Tabelle1!B3=0)\*(Tabelle1!B3"")\*3)
usw. in A

C2: =WENN(B2="";"";INDEX(Tabelle1!$C:blush:C;VERGLEICH(B2;Tabelle1!$A:blush:A;0)))
C3: =WENN(B3="";"";INDEX(Tabelle1!$C:blush:C;VERGLEICH(B3;Tabelle1!$A:blush:A;0)))
usw. in C

Benutzte Matrixformeln:
B2: {=WENN(ZÄHLENWENN($A:blush:A;SPALTE()/2) 
Tabellendarstellung erreicht mit dem Code in [FAQ:2363](/t/faq/9292363)



> Noch mal vielen Dank. Ich hoffe, es hat dir nicht nur Mühe  
> sondern auch ein Bisschen Spaß gemacht.


Spaß? Nadenadena, ich hab unsäglich gelitten ...

 :smile:)

Gruß
Reinhard

Ach, du Armer :wink:

Spaß? Nadenadena, ich hab unsäglich gelitten …

 :smile:)

Gruß
Reinhard

Na, dann wünsche ich dir zum Ausgleich für das unsägliche Leid ein paar säglich (gibt’s das?) schöne Feitertage.

Danke noch mal und Gruß,
Andreas

Nachgefragt:

Hallo Andreas,

Hallo noch mal,

Ein Problemchen ist noch in Excel.
Wenn A1 leer oder 0 sein kann und du prüfst mit Zählenwenn
o.ä. ob A1 leer ist so stimmt das Ergebnis.
Prüfung auf A1=0 versagt gewissermaßen da ein Wahr herauskommt
auch wenn A1 leer ist.

Jain,
ich hab mal getestet (Excel 2010):
Wenn A1 leer ist …
… kommt für =WENN(A1=0;„Null“;„Leer“)

Null

raus, nicht richtig.
… kommt für =WENN(A1="";„Leer“;„Null“)

Leer

raus, richtig.
… kommt für =ZÄHLENWENN(A1;"")

1

raus, richtig.
… kommt für =ZÄHLENWENN(A1;0)

0

raus, richrig.

Wenn A1

0

ist …
… kommt für =WENN(A1=0;„Null“;„Leer“)

Null

raus, richtig.
… kommt für =WENN(A1="";„Leer“;„Null“)

Null

raus, richtig.
… kommt für =ZÄHLENWENN(A1;"")

0

raus, richtig.
… kommt für =ZÄHLENWENN(A1;0)

1

raus. richtig.

D.h., ZÄHLENWENN macht es in allen Fällen richt. WENN macht einen „Fehler“, und zwar wenn eine leere Zelle auf

 0

abgefragt wird.
Mit ZÄHLENWENN müsste die Prüfung also eigentlich immer funktionieren.

Gruß
Reinhard

Gruß, Andreas

Ein Problemchen ist noch in Excel.
Wenn A1 leer oder 0 sein kann und du prüfst mit Zählenwenn
o.ä. ob A1 leer ist so stimmt das Ergebnis.
Prüfung auf A1=0 versagt gewissermaßen da ein Wahr herauskommt
auch wenn A1 leer ist.

Jain,

Hallo Andreas,

dein Jain ist korrekt. Bei „Zählenwenn o.ä.“ lag meine Betonung auf „o.ä.“

Ich wollte da nicht gezielt eine Warnung vor Zählenwenn aussprechen sondern eher allgemeiner Art zu allen möglichen Prüfungsmöglichkeiten einer Zelle auf ihren Inhalt.

Derartige Prüfungen finden ja sehr häufig in unterschiedlicher Form statt:
=A1=0, =Zählenwenn(), =sysverweis(), =Anzahl(), =vergleich(),…
Und je nachdem wird, kann, Excel unterschiedlich bewerten, das wollte ich ausdrücken.

Du hast dir die Mühe gemacht die vorkommenden Fälle mal durchzuspielen.
Dieses Vorgehen, also austesten, ist für mich DIE Wunderwaffe um Dinge für mich zu durchleuchten.

Dann weiß ich das kurze Zeit lang.
Wenn ich aber erst nach einigen Wochen wieder mal Vergleich() benutze habe ich doch längst vergessen wie jetzt Vergleich() auf „“ oder 0 reagiert.
Dann teste ich das kurz und fertig.

Genauso mit Anzahl oder Anzahl2, die gebrauche ich zu selten um mir die Unterschiede einzuprägen. Mich ärgert bei beiden daß es nicht Anzahl3() gibt bzw. besser so
=Anzahl(Bereich;Nummer)
und die Nummer kann man sich zusammensetzen sodaß genau das gezählt wird was man will.

Gruß
Reinhard