none
Excel-VBA - Tabellen - Daten auswählen RRS feed

  • Frage

  • Hallo,

    wer kann mir bitte zu Excel-VBA helfen?

    möchte in einem Ringdiagramm die Angabe zur Datenreihe

    wie z.B:  |  =Tabelle1!$B$6:$B$27  |  durch die tatsächlichen Werte des Bereichs ersetzen,

    mit dem Ziel auf die Darstellung des Tabellenbreich verzichten zu können.

    viele Grüße

    Carl-Heinz

    Sonntag, 21. April 2013 09:08

Antworten

  • Doch, die stimmt, wenn Du auf die gepostete eMail-Adresse in Deinem Beitrag hier klickst, dann musst Du aber das ' am Ende entfernen.

    Wenn es dann immer noch nicht geht mach mal ein ZIP von der Datei... war bisher noch kein Problem.

    Andreas.

    Donnerstag, 25. April 2013 15:12
  • Hallo Andreas,

    alles super!!

    Gruß Carl-Heinz

    Donnerstag, 25. April 2013 17:50

Alle Antworten

  • Zuerst musst Du an den Chart kommen, das ist je nachdem wo er ist unterschiedlich. Ist er in einer Tabelle, dann hat diese eine ChartObjects-Collection, je ChartObject gibt es einen Chart. Ist der Chart selber eine Tabelle, dann bekommst Du ihn über die Sheets-Collection und er ist das Sheet-Object direkt. ActiveChart geht natürlich... würde ich nicht machen.

    Jeder Chart hat eine SeriesCollection, in dieser befinden sich einzelne Series-Objecte, welche wiederum ein Values, bzw. XValues Eigenschaft haben um die Werte anzusprechen.

    Diese kannst Du mit einem Array befüllen, dann sind die Werte direkt im Chart. Netterweise ist es dem Chart egal ob es ein ein- oder zweidimensionales Array ist und da ein Range-Object über die Value Eigenschaft ein Array zurückgibt ist es ganz simpel.

    Andreas.

    Sub Test()
      Dim C As Chart
      Dim S As Series
      Set C = ActiveSheet.ChartObjects(1).Chart
      Set S = C.SeriesCollection(1)
      S.Values = Range("B6:B27").Value
    End Sub

    Montag, 22. April 2013 17:13
  • Hallo Andreas,

    ganz herzlichen Dank für Deine Hilfe.

    Das funktioniert sehr gut für eindimensionale Arrays.

    Da ich ein Tacho-Diagramm realisieren will, habe ich bei der Bewegung des Zeigers ein Problem

    mit den X und Y Werten.

    Wie sieht in dem Fall die SeriesCollection aus.

    viele Grüße

    Carl-Heinz

    Ps.  habe zwar etwas Erfahrung in C# und VB aber Bei VBA bin ich ein völliger Neuling.

          Ich bitte deshalb um Gedult mit mir.

    Dienstag, 23. April 2013 08:51
  • Ps.  habe zwar etwas Erfahrung in C# und VB aber Bei VBA bin ich ein völliger Neuling.

          Ich bitte deshalb um Gedult mit mir.

    Keine Bange, alles gut. Die Grundlagen kennst Du, das merkt man, Du weißt nur nicht so Recht wo die Dinge zu finden sind, das ist normal.

    Ich werde demnächst mit "Visual Studio Express 2012 für Windows Desktop" meine ersten Gehversuche machen, da steh ich dann wahrscheinlich auch erstmal da und kuck dumm aus der Wäsche. :-)

    Andreas.

    Dienstag, 23. April 2013 13:58
  • Hallo Andreas,

    Du wirst begeistert sein, was sich da mit "Visual Studio Express 2012 für Windows Desktop" und .Net 4.0 für Möglichkeiten ergeben.

    zu meiner Frage von Vorhin:

              .... Da ich ein Tacho-Diagramm realisieren will, habe ich bei der Bewegung des Zeigers ein Problem

                   mit den X und Y Werten.  Ich kann immer nur einen einfügen.

                   Wie sieht in dem Fall die SeriesCollection(s) aus ?

         

    kannst Du mir da nochmal helfen?

     Ich habe zwar ein dickes Buch Excel-VBA mit 1000 Makros von Bernd Held

    finde darin aber keine Lösung für mein Problem.

    Auch fehlen mir die Grundlagen, kannst Du mir hierfür eine Buchempfehlung geben?

    viele Grüße

    Carl-Heinz

    Dienstag, 23. April 2013 16:18
  • Ich hab noch nie ein Buch zum Erlernen von irgendwas in die Hand genommen, ein Buch zeigt Dir immer nur Lösungen für ein Problem was Du nicht hast.

    Nur für grundlegende Konzepte kann ein Buch gut sein, aber ganz ehrlich seit es das Internet und Google gibt... ich finde die Informationen so viel einfacher und es kostet nix.

    Tacho-Diagramm:

    Das geht nicht (so einfach), ein Ringdiagramm hat keine XY-Koordinaten.

    Der Ring hat immer 360° was 100% der Datenreihe entspricht, d.h. es zeigt die prozentuale Verteilung an.

    Man kann aber trotzdem damit einfach einen Tacho simulieren, man macht einfach 2 Datenreihen, eine für die Skala und eine für den Zeiger.

    Die Skala enthält je Auflösung X Elemente der gleichen Größe, der Zeiger immer 3, wobei das 2te Element die Breite des Zeigers ist.

    Mach mal eine neue Datei und kopier den Code unten in ein reguläres Modul, dann lass sub ErzeugeTacho laufen, anschließend BewegeZeiger. Drück STRG-PAUSE um die Zeigerbewegung abzubrechen.

    Nun zu dem Problem der Darstellung des Zeigers in XY-Koordinaten:

    Klick mal mit der rechten Maustaste auf den Zeiger und wähle "Datenreihen-Diagrammtyp ändern", dann wähle ein Diagramm "Punkt(XY) mit geraden Linien" und klick OK, jetzt sollte das Diagramm Achsen und ein Gitternetz anzeigen.

    Bevor wir nun den Zeiger richtig darstellen können musst Du zuerst die automatische Skalierung der Achsen deaktivieren. Klick mit rechts auf eine Achse, wähle "Achse formatieren" und setze das Minimum in den Achsenoptionen auf -1 und das Maximum auf 1. Das gleiche für die andere Achse.

    Nun klickst Du mit rechts auf das Diagramm und wählst "Daten auswählen", bearbeite die Daten des Zeigers und gibt als Werte die Formel ={0;0,707} für X und Y ein. Klick Ok und Ok und nun solltest Du eine Linie unter 45° von der Mitte nach rechts oben sehen.

    D.h. der Endpunkt der Linie ist immer der Co-/Sinus des darzustellenden Winkels (Dran denken: Winkelfunktionen brauchen den Winkel in Radiant, nicht in Grad!).
    Y: Series.Values = Array(0, Cos(Winkel))
    X: Series.XValues = Array(0, Sin(Winkel))

    Alles klar?

    Andreas.


    Option Explicit

    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

    Const SkalaMin = 0
    Const SkalaMax = 200
    Const SkalaRes = 5
    Const Zeigerbreite = 0.5

    Sub ErzeugeTacho()
      Dim Sh As Shape
      Dim C As Chart
      Dim S As Series
      Dim P As Point

      Dim Skala() As Double, Zeiger(1 To 3) As Double
      Dim i As Integer

      'Ringdiagramm erzeugen
      Set Sh = ActiveSheet.Shapes.AddChart(xlDoughnut)
      Set C = Sh.Chart
      'Falls zufällig eine Zelle mit einem Wert ausgewählt war, dann wird das Diagramm automatisch gefüllt.
      'Daher müssen wir diese ggf. löschen, wir wollen ein leeres Diagramm
      Do While C.SeriesCollection.Count > 0
        C.SeriesCollection(1).Delete
      Loop

      'Ein Array erzeugen was je Segment die Auflösung der Skala enthält
      ReDim Skala(SkalaMin / SkalaRes To (SkalaMax - SkalaRes) / SkalaRes)
      For i = LBound(Skala) To UBound(Skala)
        Skala(i) = SkalaRes
      Next

      'Im Diagramm erzeugen
      Set S = C.SeriesCollection.NewSeries
      S.Name = "Skala"
      S.Values = Skala

      'Die Skala mit einem Farbverlauf von weiß nach rot füllen
      i = 0
      For Each P In S.Points
        i = i + 1
        P.Format.Fill.ForeColor.RGB = ColorMorph(vbWhite, vbRed, S.Points.Count, i)
      Next

      'Das erste Segment beginnt bei der anzuzeigenden Geschwindigkeit
      Zeiger(1) = SkalaMin
      'Dann kommt der Zeiger
      Zeiger(2) = Zeigerbreite
      'Dann der Rest
      Zeiger(3) = SkalaMax - Zeiger(1) - Zeiger(2)

      'Im Diagramm erzeugen
      Set S = C.SeriesCollection.NewSeries
      S.Name = "Zeiger"
      S.Values = Zeiger

      'Wir wollen nur den Zeiger sehen
      S.Points(1).Format.Fill.Visible = False
      S.Points(2).Format.Fill.ForeColor.RGB = vbBlack
      S.Points(3).Format.Fill.Visible = False

      'Die Legende ist auch über
      C.HasLegend = False
    End Sub

    Sub BewegeZeiger()
      Dim C As Chart
      Dim S As Series
      Dim Zeiger(1 To 3) As Double
      Dim i As Integer

      'Abbruch durch STRG-PAUSE ermöglichen
      Application.EnableCancelKey = xlErrorHandler
      On Error GoTo ExitPoint

      'Zeiger holen
      Set C = ActiveSheet.ChartObjects(1).Chart
      Set S = C.SeriesCollection(2)

      Application.Cursor = xlWait
      Do
        For i = SkalaMin To SkalaMax
          Zeiger(1) = i
          Zeiger(2) = Zeigerbreite
          Zeiger(3) = SkalaMax - Zeiger(1) - Zeiger(2)
          If Zeiger(3) < 0 Then Zeiger(3) = 0
          S.Values = Zeiger
          'Diagramm updaten lassen
          Application.ScreenUpdating = True
          DoEvents
          'Etwas warten
          Sleep 10
        Next
      Loop
    ExitPoint:
      Application.Cursor = xlDefault
    End Sub

    Function ColorMorph(ByVal StartColor As Long, ByVal EndColor As Long, _
        ByVal MaxSteps As Long, ByVal Step As Long) As Long
      'Calculate color from Start- to EndColor for each Step from 1 to MaxSteps
      Dim NewRGB(1 To 3) As Integer
      Dim Start As Long, Ende As Long, i As Integer
      If MaxSteps < 2 Then
        ColorMorph = EndColor
        Exit Function
      End If
      For i = 1 To 3
        'Calculate RGB
        Start = (StartColor \ 256 ^ (i - 1)) And 255
        Ende = (EndColor \ 256 ^ (i - 1)) And 255
        'Calculate percentaged step
        NewRGB(i) = Ende + (Start - Ende) / (MaxSteps - 1) * (MaxSteps - Step)
      Next
      ColorMorph = RGB(NewRGB(1), NewRGB(2), NewRGB(3))
    End Function

                             
    Mittwoch, 24. April 2013 10:06
  • Hallo Andreas,

    herzlichen Dank für Deine umfangreichen Ausführungen.

    Ich habe bereits ein fertiges Tacho-Diagramm trotzdem werde ich vieles aus deinem Beispiel

    dringend brauchen, insbesondere die flexible Skalagengestaltung.

    Nun zu meinem Problem mit dem Zeiger.

    In der Tabelle befinden sich folgende Werte

      Zellen: O2 = 0;   O3 ein Wert aus der Formel   =COS((1-O1/100)*PI())*0,95

      Zellen: O4 = 0;   O5 ein Wert aus der Formel   =SIN((1-O1/100)*PI())*0,95

                Der Wert in Zelle O1 bestimmt den Zeigerausschlag,  *0,95 die Zeigerlänge usw.

      In dem Fenster 'Datenreihe bearbeiten' befinden sich die Verweise auf diese Zellen:

                 zu Werte der Reihe X:    =Tabelle1!$O$2:$O$3  

                 zu Werte der Reihe Y:    =Tabelle1!$O$4:$O$5  

      Die Werte für die Skala konnte ich mit deiner Sub:

                    Sub Test()
                        Dim C As Chart
                        Dim S As Series
                        Set C = ActiveSheet.ChartObjects(1).Chart
                        Set S = C.SeriesCollection(1)
                        S.Values = Range("B6:B27").Value
                     End Sub

        in das Diagramm übernehmen und die zugehörigen Werte aus der Tabelle löschen.

        Wie bitte muß eine Sub ausehen, um die Zeigerwerte auch noch in die Tabelle übernehmen zu können?

         folgender Versuch und viele weitere waren erfolglos:

                         Dim C2 As Chart
                         Dim S2 As Series
                         Set C2 = ActiveSheet.ChartObjects(1).Chart
                         Set S2 = C2.SeriesCollection(2)

                         S2.XValues = Range("O2:O3").Value
                         S2.Values = Range("O5:O6").Value

         Ich finde einfach nicht die richtige Sytax dafür.

     viele Grüße

     Carl-Heinz

      P.S.: Deine Meinung über Lehrbüchen teile ich in vollem Umfang, trotzdem braucht man für den Start

              etwas derartiges, damit man wenigstens  im Internet nicht so laienhaft fragen muß.


    Mittwoch, 24. April 2013 17:28
  • Kannst Du bitte mal eine Beispieldatei machen und mir schicken (oder bei einem Online File Hoster wie www.dropbox.com hochladen und zum download anbieten)?

    In meinem Profil findest Du meine eMail-Adresse.

    Eigentlich würde ich erwarten das es so geht wie Du es machst...

    Andreas.

    Donnerstag, 25. April 2013 07:06
  • Hallo Andreas,

    Deine e-mail Adresse  ' andreas.killer@gmx.net' scheint nicht mehr zu stimmem,

    leider kann ich Dir nichts schicken.

    Gruß

    Carl-Heinz 

    Donnerstag, 25. April 2013 10:21
  • Doch, die stimmt, wenn Du auf die gepostete eMail-Adresse in Deinem Beitrag hier klickst, dann musst Du aber das ' am Ende entfernen.

    Wenn es dann immer noch nicht geht mach mal ein ZIP von der Datei... war bisher noch kein Problem.

    Andreas.

    Donnerstag, 25. April 2013 15:12
  • Hallo Andreas,

    alles super!!

    Gruß Carl-Heinz

    Donnerstag, 25. April 2013 17:50