Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1308to1312
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

Diagramme-Makro

Diagramme-Makro
24.04.2013 10:33:32
Nik
Einen schönen guten Morgen zusammen..
Karin (Beverly) hier im Forum hat mir letzte Woche ein geniales Makro gemacht, dass mir Diagramme generiert (kopiert), was auch perfekt funktioniert :-) Allerdings habe ich jetzt die Diagrammbasis insofern angepasst, dass ich bestimmte Linien ausblenden kann indem ich einfach mittels Formel ein na() generiere. Aber genau damit hat das Makro ein Problem, so dass unten im fett markierten Teil aufhört. Kann man das Problem irgendwie umgehen? Hier das Makro:
Dim lngZeile As Long ' Schleifenvariable
Dim dblOben As Double ' Variable für die Position der Diagrammoberkante
Dim dblHoehe As Double ' Variable für die Diagrammhöhe
Cells.Select
Selection.Copy
Workbooks.Add
ActiveSheet.Paste
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
' Schleife von zeile 16 bis zur letzten belegten Zeile in Spalte A in 3er Schritten
For lngZeile = 17 To IIf(IsEmpty(Cells(Rows.Count, 3)), Cells(Rows.Count, 3).End(xlUp).Row, _
Rows.Count) Step 4
' Position Oberkante des letzten Diagramms
dblOben = ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).Top
' Höhe des letzten Diagrams
dblHoehe = ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).Height
' 1. Diagramm kopieren
ActiveSheet.ChartObjects(1).Copy
' Kopie ins Tabellenblatt einfügen
ActiveSheet.Paste
' bezogen auf das zuletzt erstellte Diagramm
With ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).Chart
' Datenbereich zuweisen aus laufende Zeile Spalte B bis laufende Zeile + 2 Spalte N
.SetSourceData Source:=ActiveSheet.Range(ActiveSheet.Cells(lngZeile, 3), ActiveSheet. _
Cells(lngZeile + 3, 14))
.SeriesCollection(1).XValues = ActiveSheet.Range("E12:P12") ' Position obere Kante des eingefügten Diagrammobjektes
.Parent.Top = dblOben + dblHoehe
' Position linke Kante des eingefügten Diagrammobjektes auf linke Kante Spalte A
.Parent.Left = ActiveSheet.Columns(1).Left
End With
DoEvents
Next lngZeile
Vielen lieben Dank..
Gruss
Nik

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Diagramme-Makro
24.04.2013 15:25:44
Beverly
Hi Nik,
da müsstest du schon mal deine Mappe hochladen.
Übrigens: dieser Codeteil
Cells.Select
Selection.Copy
Workbooks.Add
ActiveSheet.Paste
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
stammt bestimmt nicht von mir, denn in VBA kann man zu 99% aller Fälle auf Select verzichten. Außerdem würde ich nicht die Zellen des gesamten Tabellenblattes kopieren und dann in eine neu erstellte Arbeitsmappe einfügen, sondern das Tabellenblatt sofort in eine neue Arbeitsmappe kopieren.


Anzeige
AW: Diagramme-Makro
24.04.2013 16:49:52
Nik
Hallo Karin,
nein, den Teil den habe ich Deinem Code vorangestellt, da im Originalfile eben Datenbankformeln hinterlegt waren und durch die Berechnungen das dann recht lange gedauert hat...das habe ich also verbrochen! Mea Culpa! Das mit dem Tabellenblatt in die neue Arbeitsmappe kopieren habe ich dem Macro-Rekorder versucht (was ja dann auch gleich den Namen mitgenommen hätte), aber so wirklich etwas gescheites kam nicht dabei raus, von daher habe ich das dann eher diletantisch gelöst.
Ich lade morgen mal das File hoch...hab jetzt eben noch einen längeren Termin. Aber vielen vielen lieben Dank für das Feedback! :-)
Gruss und einen schönen Abend
Nik

Anzeige
Tabellenblatt in neue Arbeitsmappe kopieren
24.04.2013 16:58:14
Beverly
Hi Nik,
zum Koperen von Tabellenblättern in eine neue Arbeitsmappe:
    ActiveSheet.Copy
With ActiveSheet.UsedRange
.Copy
.Cells(1).PasteSpecial Paste:=xlValues
End With
Application.CutCopyMode = False


AW: Tabellenblatt in neue Arbeitsmappe kopieren
25.04.2013 08:16:07
Nik
Einen schönen guten Morgen Karin,
vielen lieben Dank für Deine erneute Hilfe :-) Das oben werde ich nacher gleich mal ausprobieren. Ich habe eben mal das File hochgeladen mit der gestern angesprochenen Problematik mit den bewusst generierten na() im Diagramm um auf Wunsch bestimmte Linien auszublenden, wenn mich bspw. mal nur 2 Linien interessieren (der Übersichtlichkeit halber).. Aber eben das Makro bricht ab :-(
https://www.herber.de/bbs/user/85042.xls
Vielen Dank und Gruss
Nik

Anzeige
AW: Tabellenblatt in neue Arbeitsmappe kopieren
25.04.2013 10:45:27
Beverly
Hi Nik,
ersetze diese Zeile:
          .SeriesCollection(1).XValues = ActiveSheet.Range("C12:N12")
durch diese Zeilen:
          On Error Resume Next
.SeriesCollection(1).XValues = ActiveSheet.Range("C12:N12")
.SeriesCollection(2).XValues = ActiveSheet.Range("C12:N12")
.SeriesCollection(3).XValues = ActiveSheet.Range("C12:N12")
On Error GoTo 0


AW: Tabellenblatt in neue Arbeitsmappe kopieren
25.04.2013 14:37:27
Nik
Hi Karin,
ich weiss gar nicht wie ich Dir für Deine Hilfe überhaupt danken soll, schon toll wie Du das so einfach und schnell programmierst! Respekt! Es funktioniert jetzt auch soweit, sprich das Makro hält nicht mehr an. Allerdings werden die Grafiken noch etwas verdreht. Sprich den Namen holt sich das Diagramm nun nur noch aus Spalte A, nicht wie das Original-Diagramm aus Spalte A und B.
Woran könnte das liegen? Muss ich noch irgendwo etwas anpassen?
Vielen lieben Dank und Gruss
Nik

Anzeige
AW: Tabellenblatt in neue Arbeitsmappe kopieren
25.04.2013 15:18:17
Beverly
Hi Nik,
der Fehler tritt aber nur bei den Datenreihen auf, bei denen in A und/oder B #NV steht.
Dann ist es das beste, den Datenreihen den Bezug zum Zellbereich für den Namen gesondert zugzuweisen:
          On Error Resume Next
.SeriesCollection(1).XValues = ActiveSheet.Range("C12:N12")
.SeriesCollection(1).Name = ActiveSheet.Range(ActiveSheet.Cells(lngZeile, 1),  _
ActiveSheet.Cells(lngZeile, 2))
.SeriesCollection(2).XValues = ActiveSheet.Range("C12:N12")
.SeriesCollection(2).Name = ActiveSheet.Range(ActiveSheet.Cells(lngZeile + 1, 1),  _
ActiveSheet.Cells(lngZeile + 1, 2))
.SeriesCollection(3).XValues = ActiveSheet.Range("C12:N12")
.SeriesCollection(3).Name = ActiveSheet.Range(ActiveSheet.Cells(lngZeile + 2, 1),  _
ActiveSheet.Cells(lngZeile + 2, 2))
On Error GoTo 0


Anzeige
AW: Tabellenblatt in neue Arbeitsmappe kopieren
25.04.2013 15:36:57
Nik
Hi Karin,
vielen Dank für Dein Feedback und den Code :-) Die zweite Grafik ist noch etwas strange, die Januar-Werte sind komischerweise auf "0" und nach dem Dezember fügt er mir noch ein Feld ein!?
Hängt das eventuell damit zusammen?
ActiveSheet.Cells(lngZeile + 1, 2))
.SeriesCollection(3).XValues = ActiveSheet.Range("C12:N12")
.SeriesCollection(3).Name = ActiveSheet.Range(ActiveSheet.Cells(lngZeile + 2, 1), _
Hab da echt null Ahnung. Dein Know-How ist schon zu bewundern..echt toll!
Vielen Dank und Gruss
Nik
PS: kann erst morgen wieder reinschauen..

Anzeige
AW: Tabellenblatt in neue Arbeitsmappe kopieren
25.04.2013 16:46:17
Beverly
Hi Nik,
ich sehe jetzt nur noch eine Möglichkeit: wenn in A und/oder B #NV steht, dann wird diese Datenreihe komplett ignoriert:
Sub DiasKopieren()
Dim lngZeile As Long       ' Schleifenvariable
Dim dblOben As Double      ' Variable für die Position der Diagrammoberkante
Dim dblHoehe As Double     ' Variable für die Diagrammhöhe
Application.ScreenUpdating = False
For lngZeile = 16 To IIf(IsEmpty(Cells(Rows.Count, 1)), _
Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count) Step 3
' Position Oberkante des letzten Diagramms
dblOben = ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).Top
' Höhe des letzten Diagramsm
dblHoehe = ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).Height
' 1. Diagramm kopieren
ActiveSheet.ChartObjects(1).Copy
' Kopie ins Tabellenblatt einfügen
ActiveSheet.Paste
' bezogen auf das zuletzt erstellte Diagramm
With ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).Chart
' Datenbereich zuweisen auf leere Zelle A1, damit keine
' Datenreihe mehr vorhanden ist
.SetSourceData Source:=ActiveSheet.Range("A1")
' in Spalte A und B kein #NV
If Not IsError(ActiveSheet.Cells(lngZeile, 1)) And _
Not IsError(ActiveSheet.Cells(lngZeile, 2)) Then
' neue Datenreihe hinzufügen
With .SeriesCollection.NewSeries
' Beschriftung Rubrikenachse
.XValues = ActiveSheet.Range("C12:N12")
' Werte Spalte C nis N
.Values = ActiveSheet.Range(ActiveSheet.Cells(lngZeile, 3), _
ActiveSheet.Cells(lngZeile, 14))
' Name Spalte A und B
.Name = ActiveSheet.Range(ActiveSheet.Cells(lngZeile, 1), _
ActiveSheet.Cells(lngZeile, 2))
End With
End If
If Not IsError(ActiveSheet.Cells(lngZeile + 1, 1)) And _
Not IsError(ActiveSheet.Cells(lngZeile + 1, 2)) Then
With .SeriesCollection.NewSeries
.XValues = ActiveSheet.Range("C12:N12")
.Values = ActiveSheet.Range(ActiveSheet.Cells(lngZeile + 1, 3), _
ActiveSheet.Cells(lngZeile + 1, 14))
.Name = ActiveSheet.Range(ActiveSheet.Cells(lngZeile + 1, 1), _
ActiveSheet.Cells(lngZeile + 1, 2))
End With
End If
If Not IsError(ActiveSheet.Cells(lngZeile + 2, 1)) And _
Not IsError(ActiveSheet.Cells(lngZeile + 2, 2)) Then
With .SeriesCollection.NewSeries
.XValues = ActiveSheet.Range("C12:N12")
.Values = ActiveSheet.Range(ActiveSheet.Cells(lngZeile + 2, 3), _
ActiveSheet.Cells(lngZeile + 2, 14))
.Name = ActiveSheet.Range(ActiveSheet.Cells(lngZeile + 2, 1), _
ActiveSheet.Cells(lngZeile + 2, 2))
End With
End If
' Position obere Kante des eingefügten Diagrammobjektes
.Parent.Top = dblOben + dblHoehe
' Position linke Kante des eingefügten Diagrammobjektes auf linke Kante Spalte A
.Parent.Left = ActiveSheet.Columns(1).Left
End With
DoEvents
Next lngZeile
Application.ScreenUpdating = True
End Sub


Anzeige
AW: Tabellenblatt in neue Arbeitsmappe kopieren
26.04.2013 08:40:46
Nik
Einen schönen guten Morgen Karin,
vielen vielen lieben Dank für Deine Hilfe...Auch wenn ich teils (oder sogar überwiegend) nur Bahnhof verstehe möchte ich wirklich mal ganz laut DANKE sagen. Ist schon toll wie der Code razzfazz abläuft. :-)
Meine Arbeit ist es jetzt den Code irgendwann mal zu verstehen. Vor diesem Know How hab ich allerhöchsten Respekt! Alle Achtung!
Also nochmals vielen lieben Dank für Deine Hilfe und Dir jetzt natürlich schonmal ein schönes erholsames Weekend!
Liebe Grüsse
Nik

AW: Tabellenblatt in neue Arbeitsmappe kopieren
26.04.2013 09:35:22
Beverly
Hi Nik,
vielleicht hilft dir zum besseren Verständnis der prinzipielle Codeablauf:
1. es wird eine Schleife über den Bereich der Zeile 16 bis zur letzten belegten Zeile in Spalte A in 3er Schritten ausgeführt
2. die Position der oberen Kante und die Höhe des letzen vorhandenen Diagramms werden auf die Variablen geschrieben - das ist erforderlich um das nächste Diagramm richtig zu positionieren
3. das 1. Diagramm wird kopiert und eingefügt
4. an dem neu eingefügten Diagramm werden folgende Schritte ausgeführt:
4.1 als Datenbereich wird die Zelle A1 zugewiesen - da diese leer ist, werden sozusagen alle
vorhandenen Datenreihen "gelöscht"
4.2 wenn in A und B der laufenden Zeile kein Fehler (#NV) steht, dann neue Datenreihe hinzufügen
4.2.1 für die X-Werte den Bereich C12:N12 eintragen
4.2.2 für die Y-Werte den Bereich laufende Zeile Spalten C:N eintragen
4.2.3 für den Namen den Bereich laufende Zeile Spalten A:B eintragen
4.3 wenn in A und B der laufenden Zeile+1 kein Fehler (#NV) steht, dann neue Datenreihe hinzufügen
4.3.1 für die X-Werte den Bereich C12:N12 eintragen
4.3.2 für die Y-Werte den Bereich laufende Zeile+1 Spalten C:N eintragen
4.3.3 für den Namen den Bereich laufende Zeile+1 Spalten A:B eintragen
4.4 wenn in A und B der laufenden Zeile+2 kein Fehler (#NV) steht, dann neue Datenreihe hinzufügen
4.4.1 für die X-Werte den Bereich C12:N12 eintragen
4.4.2 für die Y-Werte den Bereich laufende Zeile+2 Spalten C:N eintragen
4.4.3 für den Namen den Bereich laufende Zeile+2 Spalten A:B eintragen
5. dem erstellten Diagramm die vorher ermittelte Position für seine Oberkente (direkt unterhalb anschließend an das vorhergehende - also dessen Position der Oberkante + seine Höhe) und Position seiner linken Kante an linker Kante der Spalte A zuweisen
6. mittels DoEvents die Steuereung kurzzeitig an das System übergeben, damit genügend Zeit ist um die Diagramme im Tabellenblatt richtig zu positionieren, da Grafiken großen Speicherbedarf haben
6. Schleife so oft wiederholen bis alle Zeilen abgearbeitet sind
Mittels der Zeile Application.ScreenUpdating = False wird zu Beginn die Bildschirmaktualisierung ausgeschaltet, um das Flackern des Bildschirmes während des Kopierns/Einfügens der Diagramme auszuschalten (oder zumindest zu minimieren) und dadurch außerdem den Programmablauf zu beschleunigen. Am Ende wird die Bildschirmaktualisierung mit der Zeile Application.ScreenUpdating = True wieder eingeschaltet.
Ich hoffe, ich konnte damit den "Bahnhof" ein wenig verkleinern ;-)


Anzeige
AW: Tabellenblatt in neue Arbeitsmappe kopieren
26.04.2013 13:16:10
Nik
Hallo Karin,
hey super, vielen Dank für die Erklärungen! Ich habe diese eben mal neben den Code in die entsprechenden Bereiche geschrieben! Wirklich tolle Erklärung, die mir sehr weitergeholfen hat! Ich habe den Code nun jetzt mal von 3 Zeilen auf 4 Zeilen erweitert, was auch gut funktioniert hat.
Eine weitere Änderung, nämlich die das der Diagrammbereich nun nicht mehr in Spalte A, sonder C beginnt macht schon ein paar Probleme mehr. Vermutlich kommt das hauptsächlich daher dass ich die Zeile (lngZeile + 1, 3) [kommt in abgeänderter Form ja öfer vor] mit Sicherheit noch falsch interprtiere, sie nicht so richtig verstehe. Also hauptsächlich was diese Zahlen in der Klammer machen. Weil ich vermute mal dass ich an gewissen Stellen im Code genau dort etwas anpassen muss weil der Diagramme nun um 2 Spalten nach links gerutscht ist (A und B ist nun ausgeblendet).
Wenn Du mir noch einen kleinen Schubs in die richtige Richtung gibst wäre das super :-)
Vielen lieben Dank und liebe Grüsse
Nik

Anzeige
AW: Tabellenblatt in neue Arbeitsmappe kopieren
26.04.2013 13:30:38
Beverly
Hi Nik,
eine Zelladresse kann man bekanntlich auf verschiedene Art und Weise in VBA darstellen. Bei Verwendung von Cells bedeutet die erste Zahl in der Klammer die Zeile und die zweite Zahl die Spaltennummer - Zelle C5 wäre demnach Cells(5, 3). Im Code bedeutet (lngZeile + 1, 3) deshalb die laufende Zeile + 1 in Spalte C.


AW: Tabellenblatt in neue Arbeitsmappe kopieren
26.04.2013 14:12:28
Nik
Hi Karin,
DANKE für die Erklärungen, welche ich nun versucht habe auch umzusetzen. Viele Zeilen klingen nun auch ganz logisch, so dass ich einige Dinge nachvollziehen konnte. Allerdings bleibt er dennoch hängen :-(
Habe ich eventuell noch etwas vergessen anzupassen?
Nochmals vielen lieben Dank für Deine Hilfe. Durch dieses Thema bin ich nun in kürzester Zeit sehr viel weiter gekommen. Weiter als ich mir das erträumt hätte, auch wenn ich noch weit weit entfernt bin was den Begriff "verstehen" rechtfertigen würde. Du kannst das echt toll erklären und weiterbringen, solltest echt mal überlegen damit Kurse anzubieten...wenn Du das nicht schon machst!
Vielleicht kannst Du nochmals über meine Änderungen schauen?
https://www.herber.de/bbs/user/85081.xls
Vielen vielen lieben DANK!
Gruss
Nik

AW: Tabellenblatt in neue Arbeitsmappe kopieren
26.04.2013 16:32:29
Nik
Hi Karin,
ich glaube es funktioniert es jetzt so wie es sollte, ich habe den Fehler wie es scheint gefunden!
Trotzdem nochmals vielen vielen lieben DANK!
Ja und jetzt geht es ins Weekend! :-)
LG
Niklas

AW: Tabellenblatt in neue Arbeitsmappe kopieren
26.04.2013 17:34:27
Beverly
Hi Nik,
manchmal macht Excel Dinge, die es an anderer Stelle nicht macht - das muss man nicht unbedingt verstehen. Das ist auch hier der Fall - weshalb der Fehler plötzlich auftritt ist nicht nachvollziehbar.
Du hast den Code vom Prinzip her schon richtig verändert und an deine Bedingugnen angepasst. Was nicht korrekt war ist, dass du die Spalten A, B und C prüfst, ob dort ein Fehler steht - korrekt müssen Spalte C und D geprüft werden, das ist aber nicht die Ursache des auftretenden Codefehlers. Den Spaltenbereich, aus dem die Daten entnommen werden, musst du auch anpassen - jetzt ist Spalte P die letzte und nicht mehr N, weshalbe anstelle der 14 die 16 beim Zellbezug als Spaltennummer stehen muss. Aber auch das löst nicht den Fehler aus. Der Fehler wird urplötzlich bei der Zuweisung des Zellbereichs für den Namen ausgelöst, obwohl du den Teil korrekt angepasst hast. Möglicherweis knn Excel nicht damit umgehen, wenn nicht Spalte A mit inbegriffen ist sondern nur Spalten weiter rechts - aber das ist nur eine Vermutung, ich kenne die tatsächliche Ursache nicht.
Es gibt aber die Möglichkeit, den Zellbereich auch auf andere Weise zuzuweisen, und zwar als Formel für den Bezug zum Zellbereich - genau so wie es dann im Diagramm zu sehen ist, z.B. "=Sheet1!B17:C17".
Ich habe mal den Code entsprechend geändert (auch mit den o.g. Anpassungen):
Sub DiasKopieren()
Dim lngZeile As Long       ' Schleifenvariable
Dim dblOben As Double      ' Variable für die Position der Diagrammoberkante
Dim dblHoehe As Double     ' Variable für die Diagrammhöhe
ActiveSheet.Copy
With ActiveSheet.UsedRange
.Copy
.Cells(1).PasteSpecial Paste:=xlValues
End With
Application.CutCopyMode = False
Application.ScreenUpdating = False
For lngZeile = 17 To IIf(IsEmpty(Cells(Rows.Count, 3)), _
Cells(Rows.Count, 3).End(xlUp).Row, Rows.Count) Step 4
' Position Oberkante des letzten Diagramms
dblOben = ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).Top
' Höhe des letzten Diagramsm
dblHoehe = ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).Height
' 1. Diagramm kopieren
ActiveSheet.ChartObjects(1).Copy
' Kopie ins Tabellenblatt einfügen
ActiveSheet.Paste
' bezogen auf das zuletzt erstellte Diagramm
With ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).Chart
' Datenbereich zuweisen auf leere Zelle C1, damit keine
' Datenreihe mehr vorhanden ist
.SetSourceData Source:=ActiveSheet.Range("C1")
'4.2 wenn in C und D der laufenden Zelle kein Fehler steht, dann neue Datenreihe
If Not IsError(ActiveSheet.Cells(lngZeile, 3)) And _
Not IsError(ActiveSheet.Cells(lngZeile, 4)) Then
' neue Datenreihe hinzufügen
With .SeriesCollection.NewSeries
' 4.2.1 Beschriftung Rubrikenachse (X-Werte für E12:P12 eintragen)
.XValues = ActiveSheet.Range("E12:P12")
' 4.2.2 Y-Werte für E bis P laufende Zeile eintragen)
.Values = ActiveSheet.Range(ActiveSheet.Cells(lngZeile, 5), _
ActiveSheet.Cells(lngZeile, 16))
' 4.2.3 Name für den Bereich laufende Zeile in Spalte C und D)
.Name = "=" & ActiveSheet.Name & "!" & ActiveSheet.Range( _
ActiveSheet.Cells(lngZeile, 3), _
ActiveSheet.Cells(lngZeile, 4)).Address
End With
End If
If Not IsError(ActiveSheet.Cells(lngZeile + 1, 3)) And _
Not IsError(ActiveSheet.Cells(lngZeile + 1, 4)) Then
With .SeriesCollection.NewSeries
.XValues = ActiveSheet.Range("E12:P12")
.Values = ActiveSheet.Range(ActiveSheet.Cells(lngZeile + 1, 5), _
ActiveSheet.Cells(lngZeile + 1, 16))
.Name = "=" & ActiveSheet.Name & "!" & ActiveSheet.Range( _
ActiveSheet.Cells(lngZeile + 1, 3), _
ActiveSheet.Cells(lngZeile + 1, 4)).Address
End With
End If
If Not IsError(ActiveSheet.Cells(lngZeile + 2, 3)) And _
Not IsError(ActiveSheet.Cells(lngZeile + 2, 4)) Then
With .SeriesCollection.NewSeries
.XValues = ActiveSheet.Range("E12:P12")
.Values = ActiveSheet.Range(ActiveSheet.Cells(lngZeile + 2, 5), _
ActiveSheet.Cells(lngZeile + 2, 16))
.Name = "=" & ActiveSheet.Name & "!" & ActiveSheet.Range( _
ActiveSheet.Cells(lngZeile + 2, 3), _
ActiveSheet.Cells(lngZeile + 2, 4)).Address
End With
End If
If Not IsError(ActiveSheet.Cells(lngZeile + 3, 3)) And _
Not IsError(ActiveSheet.Cells(lngZeile + 3, 4)) Then
With .SeriesCollection.NewSeries
.XValues = ActiveSheet.Range("E12:P12")
.Values = ActiveSheet.Range(ActiveSheet.Cells(lngZeile + 3, 5), _
ActiveSheet.Cells(lngZeile + 3, 16))
.Name = "=" & ActiveSheet.Name & "!" & ActiveSheet.Range( _
ActiveSheet.Cells(lngZeile + 3, 3), _
ActiveSheet.Cells(lngZeile + 3, 4)).Address
End With
End If
' Position obere Kante des eingefügten Diagrammobjektes
.Parent.Top = dblOben + dblHoehe
' Position linke Kante des eingefügten Diagrammobjektes auf linke Kante Spalte C
.Parent.Left = ActiveSheet.Columns(3).Left
End With
DoEvents
Next lngZeile
Application.ScreenUpdating = True
End Sub
Ich habe auch noch die Position der linken Diagrammkante angepasst, die ja nun nicht mehr Spalte A sondern Spalte C ist.


AW: Tabellenblatt in neue Arbeitsmappe kopieren
29.04.2013 09:52:45
Nik
Schönen guten Morgen Karin,
vielen lieben Dank für Deine erneute Hilfe und die Erklärungen...in so kurzer Zeit habe ich glaube ich noch nie soviel dazugelernt :-) Allerdings komme ich bei diesem Code nicht weiter:
.Name = "=" & ActiveSheet.Name & "!" & ActiveSheet.Range( _
ActiveSheet.Cells(lngZeile, 3), _
ActiveSheet.Cells(lngZeile, 4)).Address
Denn genau hier kommt eine Fehlermeldung..im kleinen Testfile, als auch im grossen Originalfile. Was sollte denn der Code machen?
Vielen lieben Dank und Gruss
Nik

AW: Tabellenblatt in neue Arbeitsmappe kopieren
29.04.2013 10:43:17
Beverly
Hi Nik,
dann lade doch deine Testdatei hoch, denn ich kann den Fehler nicht nachvollziehen.
Der Code macht das, was ich in meinem letzten Beitrag geschrieben habe (Zitat):
Es gibt aber die Möglichkeit, den Zellbereich auch auf andere Weise zuzuweisen, und zwar als Formel für den Bezug zum Zellbereich - genau so wie es dann im Diagramm zu sehen ist, z.B. "=Sheet1!B17:C17".
Er setzt also die Zelleadresse einschließlich Name des Tabellenblattes zusammen und trägt dies als Formelbezug in den Namen-Datenbereich der Datenreihe im Diagramm ein.


AW: Tabellenblatt in neue Arbeitsmappe kopieren
29.04.2013 11:04:49
Nik
Morgen Karin,
sorry, das habe ich dann auf die Schnelle wohl nicht realisiert. Ich werde mir das grad mal schnell noch anschauen. Anbei noch das Testfile:
https://www.herber.de/bbs/user/85113.xls
Vielen lieben Dank und Gruss
Nik

AW: Tabellenblatt in neue Arbeitsmappe kopieren
29.04.2013 12:13:41
Beverly
Hi Nik,
es gibt noch eine weitere Möglichkeit, den Bereich einzutragen:
.Name = Range(ActiveSheet.Name & "!" & ActiveSheet.Range( _
ActiveSheet.Cells(lngZeile, 3), _
ActiveSheet.Cells(lngZeile, 4)).Address)
Ich habe dies in deiner Mappe getestet und es hat fehlerfrei funktioniert.


AW: Tabellenblatt in neue Arbeitsmappe kopieren
29.04.2013 14:29:13
Nik
Hi Karin,
vielen lieben Dank für den Code. Funktioniert auch soweit ganz gut, allerdings habe ich eben eine besondere Konstellation entdeckt, wobei so besonders ist sie eben gar nicht. Und zwar steht zwar in Spalte C und D kein na(), allerdings dann jedoch im Datenbereich, und zwar durchgehend von Jan bis Dez., siehe auch im Beispiel-File..(Bereich ist rot markiert) Hab mir zwar auch Gedanken gemacht, komme aber nicht weiter :-(
https://www.herber.de/bbs/user/85122.xls
Und noch eine kleine Frage zum Verständnis: Was bewirkt das Fragezeichen in dieser Zeile:
.Name = Range(ActiveSheet.Name & "!" &
Ich hoffe ich nerve Dich nicht schon zu lange...hab schon fast ein schlechtes Gewissen..
LG
Nik

AW: Tabellenblatt in neue Arbeitsmappe kopieren
29.04.2013 16:42:14
Beverly
Hi Nik,
wenn du dir im Diagramm mal anschaust, wie die Zellbezüge eingetragen sind (gleichgültig ob von Hand oder per VBA), dann steht nach dem = als erstes immer der Tabellenname, dahinter ein ! und dann der Zellbezug. Der Code macht also nichts weiter, als zwischen Tabellename und Zelladresse das ! zu setzen.
Ich kann dir leider nicht erklären, weshalb VBA-Code bei Diagrammen mal so oder mal anders funktioniert oder eben nicht funktioniert. Das ist außerdem von Excel-Version zu Excel-Version sehr unterschiedlich.
Es ist hier jedenfalls so, dass Excel in der Datenreihe mindestens einen Nicht-Fehlerwert benötigt, um die Datenreihe per VBA erstellen zu können. Aus diesem Grund muss noch geprüft werden, ob Spalte E ebenfalls keinen Fehlerwert enthält, wenn die Datenreihe überhaupt erstellt werden soll.
Ich habe den Code mal umgeschrieben und mit Excl2003 in deiner Arbeitsmappe getestet - bisher funktioniert er.
Sub Test()
Dim lngZeile As Long       ' Schleifenvariable für die Zeile
Dim dblOben As Double      ' Variable für die Position der Diagrammoberkante
Dim dblHoehe As Double     ' Variable für die Diagrammhöhe
Dim lngZaehler As Long     ' Schleifenvariable für die Anzahl an Diagrammobjekten
Dim wksTab As Worksheet    ' Variable für das neu erstellt Tabellenblatt
Application.ScreenUpdating = False
ActiveSheet.Copy
' neu erstelltes Tabellenblatt auf die Variable schreiben
Set wksTab = ActiveWorkbook.Worksheets(1)
With wksTab.UsedRange
.Copy
.Cells(1).PasteSpecial Paste:=xlValues
' alle Diagramme erstellen in Abhängigkeit von der Anzahl an Werten in Spalte C
For lngZaehler = 1 To (Application.CountA(.Columns(3)) / 4) - 1
' Position Oberkante des letzten Diagramms
dblOben = wksTab.ChartObjects(wksTab.ChartObjects.Count).Top
' Höhe des letzten Diagramsm
dblHoehe = wksTab.ChartObjects(wksTab.ChartObjects.Count).Height
' 1. Diagramm kopieren
wksTab.ChartObjects(1).Copy
' Kopie ins Tabellenblatt einfügen
ActiveSheet.Paste
With wksTab.ChartObjects(wksTab.ChartObjects.Count)
' Position obere Kante des eingefügten Diagrammobjektes
.Top = dblOben + dblHoehe
' Position linke Kante des eingefügten Diagrammobjektes auf linke Kante Spalte C
.Left = wksTab.Columns(3).Left
End With
Next lngZaehler
End With
lngZeile = 17
Application.CutCopyMode = False
For lngZaehler = 2 To wksTab.ChartObjects.Count
' bezogen auf das laufende Diagramm
With wksTab.ChartObjects(lngZaehler).Chart
' Datenbereich zuweisen auf leere Zelle C1, damit keine
' Datenreihe mehr vorhanden ist
.SetSourceData Source:=wksTab.Range("C1")
'4.2 wenn in C und D und E der laufenden Zelle kein Fehler steht, dann neue Datenreihe
If Not IsError(wksTab.Cells(lngZeile, 3)) And _
Not IsError(wksTab.Cells(lngZeile, 4)) And _
Not IsError(wksTab.Cells(lngZeile, 5)) Then
' neue Datenreihe hinzufügen
With .SeriesCollection.NewSeries
' 4.2.1 Beschriftung Rubrikenachse (X-Werte für E12:P12 eintragen)
.XValues = wksTab.Range("E12:P12")
' 4.2.2 Y-Werte für E bis P laufende Zeile eintragen)
.Values = wksTab.Range(wksTab.Cells(lngZeile, 5), _
wksTab.Cells(lngZeile, 16))
' 4.2.3 Name für den Bereich laufende Zeile in Spalte C und D)
.Name = wksTab.Range(wksTab.Cells(lngZeile, 3), wksTab.Cells(lngZeile, 4))
End With
End If
If Not IsError(wksTab.Cells(lngZeile + 1, 3)) And _
Not IsError(wksTab.Cells(lngZeile + 1, 4)) And _
Not IsError(wksTab.Cells(lngZeile + 1, 5)) Then
With .SeriesCollection.NewSeries
.XValues = wksTab.Range("E12:P12")
.Values = wksTab.Range(wksTab.Cells(lngZeile + 1, 5), _
wksTab.Cells(lngZeile + 1, 16))
.Name = wksTab.Range(wksTab.Cells(lngZeile + 1, 3), wksTab.Cells(lngZeile + 1, 4)) _
End With
End If
If Not IsError(wksTab.Cells(lngZeile + 2, 3)) And _
Not IsError(wksTab.Cells(lngZeile + 2, 4)) And _
Not IsError(wksTab.Cells(lngZeile + 2, 5)) Then
With .SeriesCollection.NewSeries
.XValues = wksTab.Range("E12:P12")
.Values = wksTab.Range(wksTab.Cells(lngZeile + 2, 5), _
wksTab.Cells(lngZeile + 2, 16))
.Name = wksTab.Range(wksTab.Cells(lngZeile + 2, 3), wksTab.Cells(lngZeile + 2, 4)) _
End With
End If
If Not IsError(wksTab.Cells(lngZeile + 3, 3)) And _
Not IsError(wksTab.Cells(lngZeile + 3, 4)) And _
Not IsError(wksTab.Cells(lngZeile + 3, 5)) Then
With .SeriesCollection.NewSeries
.XValues = wksTab.Range("E12:P12")
.Values = wksTab.Range(wksTab.Cells(lngZeile + 3, 5), _
wksTab.Cells(lngZeile + 3, 16))
.Name = wksTab.Range(wksTab.Cells(lngZeile + 3, 3), wksTab.Cells(lngZeile + 3, 4)) _
End With
End If
End With
DoEvents
lngZeile = lngZeile + 4
Next lngZaehler
Application.ScreenUpdating = True
Set wksTab = Nothing
End Sub


Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige