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

Makro programmieren

Makro programmieren
20.04.2009 15:21:12
Lukas
Hallo zusammen
Für meine Diplomarbeit habe ich ein kleines Problem, welches aber für einen VBA-Fortgeschrittenen kein Problem sein dürfte. Das Makro soll einfach bei jedem Datenbereich aller Diagramme der ganzen Arbeitsmappe Zeilen subtrahieren und dazuzählen. Dies sieht dann so aus:
Ich habe insgesamt etwa 70 Diagramme auf dem Tabellenblatt Gesamtübersich_Projekte. Jetzt möchte ich ein Makro, welches mir bei jedem Diagramm den Datenbereich folgendermassen anpasst:
z.B soll er aus dem Datenbereich =Gesamtübersicht_Projekte!$AA$2:$AJ$19 16 Zeilen subtrahieren, was dann diesen Bereich ergibt: =Gesamtübersicht_Projekte!$AA$2:$AJ$3. danach soll er jeweils den Wert aus G4 dazuzählen.
Beispiel:
Das sieht dann folgendermassen aus für G4 =3:
Diagramm 1:
Datenbereich: =Gesamtübersicht_Projekte!$AA$2:$AJ$19
jetzt soll das Makro 16 Zeilen subtrahieren, was dann daraus =Gesamtübersicht_Projekte!$AA$2:$AJ$3 macht. Schlussendlich soll dann der Wert von G4 als Zeilen noch dazugezählt werden, was dann =Gesamtübersicht_Projekte!$AA$2:$AJ$6 macht.
Könnte mir jemand dieses Makro programmieren? Ich wäre sehr dankbar, denn dann wäre ich endlich am Ziel meiner Diplomarbeit..:)
Achtung: der fette Bereich kann auch variiren: =Gesamtübersicht_Projekte!$AA$2:$AJ$3
Man kann es vielleicht so einschränken, dass das Makro erst nach dem Letzten Dollarzeichen in der Formel die Änderungen vornimmt.
Vielen Dank für deine/eure Hilfe!
Gruss Lukas

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro programmieren
20.04.2009 17:22:42
Luschi
Hallo Lukas,
sowas kann man auch mit Hilfe der Funktion 'Indirekt' mittels eines Names machen.
In einem Hilfsblatt habe ich die Werte für den zu berechnenden Zellbereich als Einzelparameter eingegeben.
In der Zelle 'B12' werden diese dann als Textkette zusamengefügt.
Jetzt wird ein Name definiert (Strg + F3 - Taste) und der Inhalt von 'B12' per Indirekt-Funktion in einen Wertebereich umgewandelt.
Der vergebene Name wird dann als Datenquelle für die Diagramme benutzt.
Ändern sich die Einzelparameter, wird auch der Wertebereich automatisch angepaßt.
Das Hilfsblatt kann dann ausgeblendet werden.
Testen kann man den Wertebereich, indem man mit Strg + F3 den Namens-Manager aufruft, den Namen per Maus
aktiviert und in das untere Textfeld klickt [bezieht sich auf:]
So wird der Zellbereich, der für diesen Namen steht, markiert mit einer umlaufenden gestrichelten Linie.
siehe Beispiel:

Die Datei https://www.herber.de/bbs/user/61316.xls wurde aus Datenschutzgründen gelöscht


Gruß von Luschi
aus klein-Paris
Anzeige
besser ein Makro, da..
21.04.2009 07:03:23
Lukas
Hallo Luschi
erstmal vielen Dank für deine Antwort!
Mein Problem ist, dass ich schon alle Diagramme erstellt habe und nur für alle 70 dies manuell ändern müsste. Deswegen wäre ich froh, wenn dies ein Makro für mich übernehmen würde.
Könnte mir jemand so eines programmieren oder den Ansatz dazu geben, wie ich das machen müsste?
besser ein Makro, da..
21.04.2009 07:04:03
Lukas
Hallo Luschi
erstmal vielen Dank für deine Antwort!
Mein Problem ist, dass ich schon alle Diagramme erstellt habe und nur für alle 70 dies manuell ändern müsste. Deswegen wäre ich froh, wenn dies ein Makro für mich übernehmen würde.
Könnte mir jemand so eines programmieren oder den Ansatz dazu geben, wie ich das machen müsste?
Gruss Lukas und Vielen Dank für euer Intresse!
Anzeige
AW: besser ein Makro, da..
21.04.2009 15:00:36
Dirk
Hallo!
Kannst Du mal ein Beispiel hochladen, das macht das einfacher.
Gruss
Dirk aus Dubai
AW: besser ein Makro, da..
21.04.2009 15:05:15
Martin
sehr gerne!
hier die Datei, und noch meine Idee, wie ich es machen würde:
Einen Vorschlag hätte ich ja, aber ich weiss nicht wie ich das in VBA umsetzen muss, da mir das Wissen fehlt. Der Vorschlag ist folgender:
Nehmen wir z.B den Bereich =Gesamtübersicht_Projekte!$AA$43:$AJ$60 mit G4=5
ich würde das in zwei Makros aufteilen, ein Makro, welches nur einmal ausgeführt wird, sagen wir dem Makro1 und ein Makro, welches die Diagramme immer wieder ändert, je nach Wert in G4.
Zu Makro 1:
Makro1 soll bei jedem Diagramm im Datenbereich am Schluss (nach dem letzten Dollarzeichen) 16 Zeilen subtrahieren, sprich aus unserem Beispiel =Gesamtübersicht_Projekte!$AA$43:$AJ$60 wird dann =Gesamtübersicht_Projekte!$AA$43:$AJ$44
Dieses Makro wird genau einmal benutzt und dann ist es nutzlos, da nur einmal 16 Zeilen subtrahiert werden müssen.
Jetzt zu Makro 2:
Makro 2 soll dann immer am Schluss des Datenbereichs noch den Wert aus G4 addieren (in unserem Falle den Wert 5). Dies macht dann aus unserem bereits von Makro1 bearbeiteten Datenbereich =Gesamtübersicht_Projekte!$AA$43:$AJ$44 den Datenbereich =Gesamtübersicht_Projekte!$AA$43:$AJ$49.
=Gesamtübersicht_Projekte!$AA$43:$AJ$49 besteht aus =Gesamtübersicht_Projekte!$AA$43:$AJ$44 + am Schluss noch den Wert aus G4.
Ich hoffe das dies irgendwie mit einem Makro zu realisieren ist. Für deine Hilfe bin ich dir schon mal riesig dankbar!
Gruss Lukas
http://rapidshare.com/files/223915712/Test.xls.html
die Datei ist leider zu gross für den Forumserver, daher Rapidshare!
Anzeige
AW: besser ein Makro, da..
21.04.2009 15:25:05
Dirk
Hallo!
Leider geht Rapidshare bei mir nicht, da ich hinter einem Firewall sitze und damit meine IP nicht richtig zugeordnet werden kann. Kannst Du mal http://www.2shared.com/ verwenden, das arbeitet wesentlich besser.
Gruss
Dirk aus Dubai
AW: besser ein Makro, da..
21.04.2009 15:53:05
Dirk
Hallo!
Nochmal zur Klaerung:
Die ersten beiden Tabellen pro Monat bekommen die daten aus AA2:AJ19, die dritte Tabelle aus AN2:AW19
Fuer Monat 2 dann das Ganze AA2+41:AJ19+41 und die dritte Tabelle AN2+41:AW19+41 usw.
Was soll die Eingabe in G4 bewirken bzw welchen bereich soll diese Eingabe beinflussen? Ist damit der start fuer das erste Diagramm festzulegen oder etwas anderes?
Gruss
Dirk aus Dubai
Anzeige
AW: besser ein Makro, da..
21.04.2009 16:01:20
Martin
Genau du hast alles richtig Verstanden..
G4 bewirkt, dass sich der Datenbereich der Diagramme verändert. Wenn ich z.B in G4 eine 1 schreibe, dann soll das Diagramm nur den Monat Januar08 anzeigen. Wenn ich hingegen eine 14 schreibe, dann soll das Diagramm von Monat Januar08 bis Monat Februar09 alles anzeigen usw. G4 ist sozusagen der Endwert des Diagramms.
Alle Diagramme sind momentan manuell und richig angepasst für G4=17, gehen also bis Monat Mai09. Hoffe du versteht was ich meine.
Gruss
AW: besser ein Makro, da..
22.04.2009 15:57:30
Dirk
Hallo Martin,
sorry, hat etwas laenger gedauert, da ich nebenbei noch arbeiten muss.
Hier mal ein code um die Diagramme entsprechend anzupassen. Leider hat Deine Tabelle 71 Diagramme, von denen aber nur 9 sichtbar sind. Da kommt es zu diversen fehlern.
Um das komplett abzufangen braeuchte ich die komplette Tabelle, wuerde aber wohl zu weit fuehren.
Also:
Hier die Macros.
Diese bitte in das Tabellenblatt kopieren und schon sollte das laufen.
privat Sub adjust_diagrams()
'this is to set the start month for all diagrams by macro
Dim TargetSh As String, ChObj As ChartObject, ChtNo As Long, MyChart As Chart
Dim IChart As Long, NChart As Long, MonthNo As Long, Chart As ChartObject
Dim NoSeries As Long, SerName As String, SerXValues, SerValue
TargetSh = "Gesamtübersicht_Projekte"
' get the set number of month to be represented
MonthNo = 0
MonthNo = ThisWorkbook.Sheets(TargetSh).Range("G4").Value
If MonthNo > 0 And MonthNo 'just a short step to make sure...
ElseIf MonthNo > 36 Then
MsgBox "Monatsnummer in G4 zu gross." & vbCrLf & vbCrLf & "Bitte Zahl ninimum 1 und maximum 36 eingeben"
Thsiworkbook.Sheets(TargetSh).Range("G4").Select
Exit Sub
End If
nCharts = ThisWorkbook.Sheets(TargetSh).ChartObjects.Count
'loop through all charts on sheet
For IChart = 1 To nCharts
chtname = ChartObjects(IChart).Name
ChartObjects(IChart).Select
'get the series range of the chart series
Set MyChart = ThisWorkbook.Sheets(TargetSh).ChartObjects(IChart).Chart
'get number of series in chart
NoSeries = MyChart.SeriesCollection.Count
'loop through all series and set datarange
myname = MyChart.Name
With MyChart
For i = NoSeries To 1 Step -1
'MsgBox "Serien in Diagram: " & NoSeries
On Error Resume Next
tmptxt = .SeriesCollection(i).Formula
tmpname = .SeriesCollection(i).Name
SerName = Left(tmptxt, InStr(1, tmptxt, ",") - 1)
SerStart = Left(StrReverse(SerName), InStr(1, StrReverse(SerName), "$") - 1)
SerXValues = Mid(tmptxt, Len(SerName) + 2, InStr(Len(SerName) + 1, tmptxt, ",") - 2)
serendtemp = Left(StrReverse(tmptxt), Len(tmptxt) - (Len(tmptxt) - InStr(1, StrReverse(tmptxt), "$")))
serend2 = InStr(1, serendtemp, ",")
SerEnd = Mid(StrReverse(serendtemp), 2, (Len(serendtemp) - serend2 - 1))
serValTmp = Right(tmptxt, Len(tmptxt) - Len(SerName) - Len(SerXValues) - 2)
SerValue = Left(serValTmp, Len(serValTmp) - serend2)
lastrow = SerStart + MonthNo
With .SeriesCollection(i)
.Values = SerValues
.XValues = SerXValues
End With
Next i
End With
NextChart:
Next IChart
ThisWorkbook.Sheets(TargetSh).Range("G4").Select
MsgBox "Fertig. Alle Diagramme sind angepasst."
End Sub



Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G4")) Is Nothing Then
Call adjust_diagrams
End If
End Sub


Lass' bitte von Dir hoeren, ob so ok.
Gruss
Dirk aus Dubai (z.Z. Kuwait)

Anzeige
AW: besser ein Makro, da..
22.04.2009 16:01:55
Martin
Hallo
Vielen Dank!
Werde es so schnell wie möglich ausprobieren und die das entsprechende Feedback liefern!
Gruss
AW: besser ein Makro, da..
22.04.2009 16:02:50
Dirk
Hallo!
Hier nochmal, ist mit der Formatierung besser.
Dirk aus Dubai

Private Sub adjust_diagrams()
'this is to set the start month for all diagrams by macro
Dim TargetSh As String, ChObj As ChartObject, ChtNo As Long, MyChart As Chart
Dim IChart As Long, NChart As Long, MonthNo As Long, Chart As ChartObject
Dim NoSeries As Long, SerName As String, SerXValues, SerValue
TargetSh = "Gesamtübersicht_Projekte"
' get the set number of month to be represented
MonthNo = 0
MonthNo = ThisWorkbook.Sheets(TargetSh).Range("G4").Value
If MonthNo > 0 And MonthNo  36 Then
MsgBox "Monatsnummer in G4 zu gross." & vbCrLf & vbCrLf & "Bitte Zahl ninimum 1 und maximum  _
36 eingeben"
Thsiworkbook.Sheets(TargetSh).Range("G4").Select
Exit Sub
End If
nCharts = ThisWorkbook.Sheets(TargetSh).ChartObjects.Count
'loop through all charts on sheet
For IChart = 1 To nCharts
chtname = ChartObjects(IChart).Name
ChartObjects(IChart).Select
'get the series range of the chart series
Set MyChart = ThisWorkbook.Sheets(TargetSh).ChartObjects(IChart).Chart
'get number of series in chart
NoSeries = MyChart.SeriesCollection.Count
'loop through all series and set datarange
myname = MyChart.Name
With MyChart
For i = NoSeries To 1 Step -1
'MsgBox "Serien in Diagram: " & NoSeries
On Error Resume Next
tmptxt = .SeriesCollection(i).Formula
tmpname = .SeriesCollection(i).Name
SerName = Left(tmptxt, InStr(1, tmptxt, ",") - 1)
SerStart = Left(StrReverse(SerName), InStr(1, StrReverse(SerName), "$") - 1)
SerXValues = Mid(tmptxt, Len(SerName) + 2, InStr(Len(SerName) + 1, tmptxt, ",") - 2)
serendtemp = Left(StrReverse(tmptxt), Len(tmptxt) - (Len(tmptxt) - InStr(1, StrReverse( _
tmptxt), "$")))
serend2 = InStr(1, serendtemp, ",")
SerEnd = Mid(StrReverse(serendtemp), 2, (Len(serendtemp) - serend2 - 1))
serValTmp = Right(tmptxt, Len(tmptxt) - Len(SerName) - Len(SerXValues) - 2)
SerValue = Left(serValTmp, Len(serValTmp) - serend2)
lastrow = SerStart + MonthNo
With .SeriesCollection(i)
.Values = SerValues
.XValues = SerXValues
End With
Next i
End With
NextChart:
Next IChart
ThisWorkbook.Sheets(TargetSh).Range("G4").Select
MsgBox "Fertig. Alle Diagramme sind angepasst."
End Sub



Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G4")) Is Nothing Then
Call adjust_diagrams
End If
End Sub


Anzeige
AW: besser ein Makro, da..
23.04.2009 13:59:27
Martin
Hallo Dirk
Makro läuft bestens und ich möchte dir für deine Mühe recht herzlich Danken!
Gruss

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige