Anzeige
Archiv - Navigation
824to828
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
824to828
824to828
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Markierte zellen in Diagramm übertragen
09.12.2006 16:02:58
Stefan
Hallo Ihr lieben Helferlein,
ich glaub ich hab mich mal wieder in VBA etwas übernommen!
Zu meiner Aufgabe:
Ich möchte in einem Dynamisches Tabellenblatt ein Diagramm erzeugen.
Funktionen:
1. in Spalte A:A markiere ich die einzelnen Zellen, in denen die Datenreihen stehen die in das Diagramm übernommen werden sollen.
2. Die einzelnen Datenreihen von A? bis zur letzten benutzten Spalte in dieser Zeile benennen.
3.Diagramm mit dem benannten Datenbereich in bestehende Tabelle einbetten. Wie kann ich die Größe mit einem Faktor verändern?
Hört sich einfach an ist es nur leider für mich nicht :-(
Meine Ansätze:
Zu 1u.2. Mit einer For each Schleife die markierten Zellen und letzte Spalte auslesen. Mein Problem wie bekomme ich einen Datenbereich hin, den ich für das Diagramm weiterverwenden kann? Ich hab momentan nur Zahlen ausgelesen.
Zu2. Das Diagramm hab ich als function erstellt. Wie kann ich den Größenfaktor des Diagramms verändern?
Dank im voraus
Stefan

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Markierte zellen in Diagramm übertragen
09.12.2006 16:09:15
ramses
Hallo
Bei "VBA nur mit Rekorder" ist mir folgendes etwas suspekt
"..Das Diagramm hab ich als function erstellt...."
Lass mal sehen, das würde mich interessieren ;-)
Zu deiner Frage,... "wie bekomme ich einen Datenbereich hin..."...
Starte den Makrorekorder und zeichne dir das erstellen des Diagramms mit dem Makrorekorder auf.
Danach kannst du dir alles ansehen was du brauchst und deine Frage ist beantwortet.
Gruss Rainer
AW: Markierte zellen in Diagramm übertragen
09.12.2006 16:32:13
Stefan
Hallo Rainer,
VBA nur mit Makrorekorder ist vielleicht ein wenig untertrieben, aber GUT ist bei mir was anderes.
Hier mein Diagramm:

Function Chart_aufrufen(a As String, db As String) ' a = Worksheet, db sollte der Datenbereich sein
Dim b As Double
Dim c As Double
Charts.Add
ActiveChart.ApplyCustomType ChartType:=xlBuiltIn, TypeName:= _
"Farbige Linien"
ActiveChart.SetSourceData Source:=Sheets(a).Range(db), PlotBy:=xlRows
ActiveChart.Location Where:=xlLocationAsObject, Name:=a
'Muss mann das so machen wenn mann einen anderen Faktor haben will?
b = ActiveSheet.ChartObjects(1).Height
c = ActiveSheet.ChartObjects(1).Width
ActiveSheet.ChartObjects(1).Height = b * 1.5
ActiveSheet.ChartObjects(1).Width = c * 1.5
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Liniendiagramm"
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = False
End With
End Function

Wie schon gesagt, ist das leider nicht mein Hauptproblem. Das liegt darin diesen Datenbereich zu benennen.
Ich hab das mal so versucht, ist aber glaub ich totaler nonsens.

Sub Datenbereich_Chart()
Dim a As Single
Dim LoLetzte As Integer
Dim rng As Range
'alle markierten Zellen durchlaufen
For Each rng In Selection
a = Selection.Find(What:=rng, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Row
'letzte verwendete Spalte benennen, dafür habe ich schon den halben Tag vergeudet
LoLetzte = 256
LoLetzte = IIf(IsEmpty(Cells(a, 256)), Cells(a, 256).End(xlToLeft).Column, 256)
MsgBox LoLetzte 'zum testen
Next rng
End Sub

Gruß
Stefan
Anzeige
AW: Markierte zellen in Diagramm übertragen
09.12.2006 17:01:38
ramses
Hallo
Wenn ich dein Makro "Datenbereich_Chart" ansehe, fällt es mir schwer zu glauben, dass du die Funktion "Chart_aufrufen" selbst geschrieben hast ;-)
"...'Muss mann das so machen wenn mann einen anderen Faktor haben will?..."
b = ActiveSheet.ChartObjects(1).Height
c = ActiveSheet.ChartObjects(1).Width
ActiveSheet.ChartObjects(1).Height = b * 1.5
ActiveSheet.ChartObjects(1).Width = c * 1.5
Ja, ... aber man kann es auch so schreiben ;-)
With ActiveSheet.ChartObjects(1)
.Height = .Height * 1.5
.Width = .Width * 1.5
End With
Das zweite Makro ergibt eigentlich überhaupt keinen Sinn weil es keine Werte generiert, die von der Funktion verwendet werden können.
Probier mal das aus

Sub test()
MsgBox FindDatabaseRange(Range("C2"))
End Sub


Function FindDatabaseRange(startCell As Range) As String
Dim lastRow As Long, lastCol As Integer
lastRow = Cells(Rows.Count, startCell.Column).End(xlUp).Row
lastCol = Cells(startCell.Row, 256).End(xlToLeft).Column
FindDatabaseRange = Range(Cells(startCell.Row, startCell.Column), Cells(lastRow, lastCol)).Address
End Function

Wobei dein Datenbereich in C2 beginnt.
Denn Adressbereich-String kannst du dann als Datenbereich für dein Diagramm verwenden.
Gruss Rainer
Anzeige
AW: Markierte zellen in Diagramm übertragen
09.12.2006 17:53:42
Stefan
Na, Na wer wird mir den hier Codeklau unterstellen ;-), nein Spaß bei Seite, den Code hab ich per Makrorekorder aufgezeichnet und dann den funktionsbedürfnissen angepasst.
Die untengenannten Zeilen hab ich nach langem rumprobieren dann auch rausbekommen. Allerdings bleiben mir dann immer Zweifel ob dies der effizienteste Weg ist.
ActiveSheet.ChartObjects(1).Height = b * 1.5
ActiveSheet.ChartObjects(1).Width = c * 1.5
Ich glaub mein größtes Problem liegt darin den Aufbau der Syntax zu verstehen, von wegen "Objektorientierte Programmierung". Das ist wie mit meinem englisch, ich verstehe es besser als das ich es reden kann.
Deine funktion ist auf jeden Fall näher dran als meine. ABER:
1. Fehler: sollten alle Spalten belegt sein, deshalb mein zugegeben ergoogelter Code
LoLetzte = 256
LoLetzte = IIf(IsEmpty(Cells(a, 256)), Cells(a, 256).End(xlToLeft).Column, 256)
Im Orginal war er mit Range anstatt Cells
2. markiert er das Datenfeld von C2:"letzte_Reihe,letzte_Spalte_C2"
Ich müsste aber einzelne Zellen in B:B(Linienbeschriftungen) markieren und diese zum Chart hinzufügen.
Bsp.
Markiert: B5, B8, B9, B13
Ergebnis: Range("B5:K5, B8:IT8, B9:G9,B13:IT13")
Wenn Du mir dabei weiterhelfen könntest wäre das Klasse!
Gruß
Stefan
Anzeige
AW: Markierte zellen in Diagramm übertragen
09.12.2006 18:28:17
ramses
Hallo
Kannst du mir den tieferen Sinn verraten ?
"...sollten alle Spalten belegt sein..."
Das ist doch nun eher etwas utopisch anzusehen :-)
"...Ich müsste aber einzelne Zellen in B:B(Linienbeschriftungen) markieren ..."
"...Range("B5:K5, B8:IT8, B9:G9,B13:IT13") ..."
Sag mir bitte wie du da was darstellen willst ?
256 Datenreihen sind schon unübersichtlich.
Aber wenn ich eine Datenreihe mit 253 Reihen habe und eine Datenreihe mit 3 Reihen,... was soll denn da noch dargestellt werden, ausser das Diagramm wird auf DIN A0 ausgedruckt ;-)
Probier mal das aus

Sub test2()
MsgBox GetDataBaseDescription
End Sub


Function GetDataBaseDescription() As String
Dim i As Long, endCol As Integer
Dim myC As Range, tmp1Range As Range, tmp2Range As Range
Set tmp2Range = selection.Cells(1, 1)
For Each myC In selection
endCol = IIf(Not (IsEmpty(Cells(myC.Row, 256))), 256, Cells(myC.Row, 256).End(xlToLeft).Column)
Set tmp1Range = Range(Cells(myC.Row, myC.Column), Cells(myC.Row, endCol))
Set tmp2Range = Application.Union(tmp2Range, tmp1Range)
Next
GetDataBaseDescription = tmp2Range.Address
End Function

Die Ausgangs-/Startzellen müssen VORHER markiert sein
Gruss Rainer
Anzeige
AW: Markierte zellen in Diagramm übertragen
09.12.2006 20:26:03
Stefan
Hallo Rainer,
das war genau die Lösung die ich gerne selbst programmiert hätte.
Da hätte ich wohl noch ein Jahr dran rumprobiert;-)
Vielen Dank noch mal.
Ich hab mal zum besseren Verständnis ein Bsp. hochgeladen.
https://www.herber.de/bbs/user/38859.zip
Also Zellen markieren, Toggle drücken -- Chart erscheint --
Toggle noch mal drücken -- Chart wird wieder gelöscht
Damit will ich in erster Linie immer nur eine Linie öffnen um evtl. Ausreißer zu analysieren.
Ab und an muß ich aber mehrere Zeilen zusammenfassen.
Was hältst Du von dieser Lösung?
Hab ich die Funktionen richtig aufgerufen, es funktioniert auf jeden Fall mal.
Gruß
Stefan
Anzeige
AW: Markierte zellen in Diagramm übertragen
09.12.2006 23:29:30
ramses
Hallo
"...Hab ich die Funktionen richtig aufgerufen, es funktioniert auf jeden Fall mal...."
Wenn es funktioniert ist es richtig. Ganz einfach.
In VBA es ist es wie in der Realität: Alle Wege führen nach Rom :-)
Trotzdem noch zwei kleinere Korrekturen :-)
Das Modul 1 sollte so aussehen
Option Explicit

Function Delete_Chart()
    ActiveSheet.ChartObjects.Delete
End Function

Function GetDataBaseDescription() As String
    Dim i As Long, endCol As Integer
    Dim myC As Range, tmp1Range As Range, tmp2Range As Range
    Set tmp2Range = Selection.Cells(1, 1)
    For Each myC In Selection
        endCol = IIf(Not (IsEmpty(Cells(myC.Row, 256))), 256, Cells(myC.Row, 256).End(xlToLeft).Column)
        Set tmp1Range = Range(Cells(myC.Row, myC.Column), Cells(myC.Row, endCol))
        Set tmp2Range = Application.Union(tmp2Range, tmp1Range)
    Next
    GetDataBaseDescription = tmp2Range.Address
End Function

Function Create_Chart(wksName As String, dbArea As String)
    Charts.Add
    With ActiveChart
        .ApplyCustomType ChartType:=xlBuiltIn, TypeName:="Farbige Linien"
        .SetSourceData Source:=Sheets(wksName).Range(dbArea), PlotBy:=xlRows
        .Location Where:=xlLocationAsObject, Name:=wksName
    End With
    With ActiveChart
        .HasTitle = True
        .ChartTitle.Characters.Text = "Liniendiagramm"
        .Axes(xlCategory, xlPrimary).HasTitle = False
        .Axes(xlValue, xlPrimary).HasTitle = False
    End With
    With ActiveSheet.ChartObjects(1)
        .Height = .Height * 1.5
        'oder Fix
        '.Height = 450
        .Width = .Width * 1.5
        'oder fix
        '.Width = 750
    End With
End Function



Mit den fixen Angaben, ist das Chart einfach immer gleich gross
Der Code im Klassenmodul Tabelle1 dagegen so
Private Sub ToggleButton1_Change()
    If Me.ToggleButton1.Value = True Then
        Create_Chart ActiveSheet.Name, GetDataBaseDescription
    Else
        Delete_Chart ActiveSheet.Name
    End If
End Sub

Du siehst, ich habe die Codes umbenannt (Klare Aussage der Funktion :-) ) und etwas umgestellt.
Kannst du übernehmen oder auch nicht. ;-)
In der Funktion als solches ändert sich nichts.
Lediglich der Code ist, in meinen Augen, etwas klarer nachvollziehbar.
Gruss Rainer
Anzeige
AW: Markierte zellen in Diagramm übertragen
11.12.2006 20:31:34
Stefan
Hallo Rainer,
habe Deinen Code natürlich so übernommen, funktioniert einwandfrei. Habe noch in Sub ToggleButton1_Change()
Me.ToggleButton1.Activate hinter End If eingefügt da ich zum löschen den Toggle sonst immer doppelt klicken muss.
Ich konnte deinen Code bei GetDataBaseDescription bis auf den Befehl application.union gut lesen und verstehen, aber den Code selber zu schreiben hätte ich nicht hinbekommen.
Hast Du vielleicht ein BuchTipp o.ä. wie ich mir das systematisch und autodidaktisch aneignen kann. Ideen für Projekte hätte ich genug.
Gruß
Stefan
AW: Markierte zellen in Diagramm übertragen
13.12.2006 22:42:56
Bernd
Hi,
Bücher von Bernd Held sind Spitze, sehr unterhaltsam.
mfg Bernd
Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige