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

Array speichern

Array speichern
11.12.2019 08:42:56
Tim
Hallo Liebe Excelgemeinde,
auch ich habe ein (hoffentlich kleines) Excelproblem, bei dem Ihr mir vllt helfen könnt. Erst einmal ein kurzer Hintergrund: Ich möchte Daten aus meiner Tabelle ziehen, diese dann nach ihrer Größe sortieren und die nebenstehenden Daten passend in einen Array schreiben und diese in einem Diagramm wiedergeben (funzt). Nun das Problem: ich muss das mit relativ vielen Zeilen machen. Ich würde also gerne, dass er yArr immer speichert Bsp: yArr(1),yArr(2). Leide funktioniert das nicht. Vllt habt ihr außerdem eine bessere Methode, wie ich den Rangebereich auf ziemlich viele Spalten erweitern kann, sodass ich nicht alles händisch eingeben muss?
Sub Diagrammblatt()
' Formatierung der Daten für das Diagramm
Dim D1 As String
Dim D2 As String
Dim D3 As String
Dim sDatum As String
Dim PD1 As Range
Dim PD2 As Range
Dim PD3 As Range
Dim K1 As Double
Dim K2 As Double
Dim K3 As Double
Dim K4 As Double
Dim Auslastung1 As Double
Dim Auslastung2 As Double
Dim Auslastung3 As Double
Dim Auslastung4 As Double
Dim xArr As Variant
Dim yArr As Variant
Dim rng As Variant
Dim n As Long
Dim i As Long
Dim DatumFormat()
For n = 1 To 2
For Each rng In Array("I4, L4, O4", "I5, L5, O5")
'Sortierung der Werte nach aufsteigendem Datum
D1 = CDate(WorksheetFunction.Small(Range(rng), 1))
Set PD1 = Range(rng).Find(what:=CDate(WorksheetFunction.Small(Range(rng), 1)), lookat:= _
xlWhole)
D2 = CDate(WorksheetFunction.Small(Range(rng), 2))
Set PD2 = Range(rng).Find(what:=CDate(WorksheetFunction.Small(Range(rng), 2)), lookat:= _
xlWhole)
D3 = CDate(WorksheetFunction.Small(Range("I4, L4, O4"), 3))
Set PD3 = Range(rng).Find(what:=CDate(WorksheetFunction.Small(Range(rng), 3)), lookat:= _
xlWhole)
' Zugehörige Auslastung
K1 = PD1.Offset(0, -2)
K2 = PD2.Offset(0, -2)
K3 = PD3.Offset(0, -2)
K4 = Worksheets("PPE").Range("E4")
Auslastung1 = K1 + K2 + K3 + K4
Auslastung2 = K2 + K3 + K4
Auslastung3 = K3 + K4
Auslastung4 = K4
' ändert Arrays für die Nutzung im Diagramm
For i = 1 To 365
ReDim Preserve Abzisse(0, i)
ReDim Preserve Ordinate(0, i)
Abzisse(0, i) = DateAdd("d", i, Date)
Ordinate(0, i) = Auslastung1
Next i
' Anpassung des Arrays für das Diagramm
i = WorksheetFunction.Match(D1, Abzisse, 0)
sDatum = Abzisse(0, i - 1)
For i = i To 365
Ordinate(0, i) = Auslastung2
Next i
'Bis 2. Datum
i = WorksheetFunction.Match(D2, Abzisse, 0)
sDatum = Abzisse(0, i - 1)
For i = i To 365
Ordinate(0, i) = Auslastung3
Next i
'Bis 2. Datum
i = WorksheetFunction.Match(D3, Abzisse, 0)
sDatum = Abzisse(0, i - 1)
For i = i To 365
Ordinate(0, i) = Auslastung4
Next i
' Anpassung des Formates des Datums an das gewünscht "Short Date"
For i = 1 To 365
ReDim Preserve DatumFormat(0, i)
DatumFormat(0, i) = Format(Abzisse(0, i), "Short Date")
Next i
'Genutzte Arrays für das Diagramm
xArr = DatumFormat()
yArr(n) = Ordinate()
Next rng
If xArr = DatumFormat() Then Exit For
Next n
' Auswahl der Tabelle und des Diagrammtypes
With Worksheets("PPE")
.Shapes.AddChart2(276, xlAreaStacked).Select
.Application.CutCopyMode = False
End With
With ActiveChart
.SeriesCollection.NewSeries
.SeriesCollection(1).Name = "='PPE'!$B$4"
.SeriesCollection(1).Values = yArr(1)
.SeriesCollection(1).XValues = xArr
.SeriesCollection(1).Values = yArr(2)
.SeriesCollection(1).XValues = xArr
End With
End Sub
Vielen lieben Dank schonmal!!!

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array speichern
11.12.2019 09:54:36
Matthias
Moin!
Erstmal als Frage, wo soll den yarr gespeichert werden? Im Tabellenblatt oder andere Datei?
Für das Speichern im Tabellenblatt würde ich es anders machen. Dein yarr(1) enstpricht ja demArray Ordinate - wird ja zugewiesen. DAs heißt du kannst an Stelle des yarr auch die Ordinate speichern. Da es sich da eh um ein 2dimensionales Array handelt, bietet es sich an, das in die Tabelle zu schreiben. Könnte bspw. so aussehen:
Cells(1, 1).Resize(1, 365) = Ordinate

Damit steht es in einer Zeile. Soll es als Spalte dienen, dann ggf. vorher noch transponieren:
Cells(1, 1).Resize(365, 1) = Application.Transpose(Ordinate)

Sind jetzt nur Ideen.
Ein Hinweis noch. Ich würde mir das Redim Preserve sparen. Da du eh bis 365 gehst und im Code nicht vorgesehen ist, dass du abbrichst oder verlängerst, kannst du das Array schon am Anfang richtig dimensionieren. Also dim Ordinate(0, 0 to 364). Wobei du die Arrays bei der Deklarierung vergessen hast.
VG
Anzeige
AW: Array speichern
11.12.2019 11:13:39
Tim

Sub Diagrammblatt()
'Dimensionierung der Parameter
Dim D1 As String
Dim D2 As String
Dim D3 As String
Dim sDatum As String
Dim PD1 As Range
Dim PD2 As Range
Dim PD3 As Range
Dim K1 As Double
Dim K2 As Double
Dim K3 As Double
Dim K4 As Double
Dim Auslastung1 As Double
Dim Auslastung2 As Double
Dim Auslastung3 As Double
Dim Auslastung4 As Double
Dim xArr As Variant
Dim yArr()
Dim Abzisse(0, 0 To 365)
Dim Ordinate(0, 0 To 365)
Dim DatumFormat(0, 0 To 365)
Dim rng As Variant
Dim n As Long
Dim iRows As Long
' Bestimmung der Zeile bis zur gefüllten Reihe
For z = 4 To 100
For s = 2 To 2
If IsEmpty(Range(Worksheets("RTPS-Matrix").Cells(z, s), Worksheets("RTPS-Matrix").Cells( _
z, s)).Value) = True Then
iRows = Cells(z, 2).End(xlUp).Row
Exit For
End If
Next s
Next z
'Schleife für alle Mitarbeitenden in der Liste der Tabelle
For n = 4 To iRows
For Each rng In Array("I4, L4, O4", "I5, L5, O5")
'Sortierung der Werte nach aufsteigendem Datum
D1 = CDate(WorksheetFunction.Small(Range(rng), 1))
Set PD1 = Range(rng).Find(what:=CDate(WorksheetFunction.Small(Range(rng), 1)), lookat:= _
xlWhole)
D2 = CDate(WorksheetFunction.Small(Range(rng), 2))
Set PD2 = Range(rng).Find(what:=CDate(WorksheetFunction.Small(Range(rng), 2)), lookat:= _
xlWhole)
D3 = CDate(WorksheetFunction.Small(Range("I4, L4, O4"), 3))
Set PD3 = Range(rng).Find(what:=CDate(WorksheetFunction.Small(Range(rng), 3)), lookat:= _
xlWhole)
' Zugehörige Auslastung
K1 = PD1.Offset(0, -2)
K2 = PD2.Offset(0, -2)
K3 = PD3.Offset(0, -2)
K4 = Worksheets("PPE").Range("E4")
Auslastung1 = K1 + K2 + K3 + K4
Auslastung2 = K2 + K3 + K4
Auslastung3 = K3 + K4
Auslastung4 = K4
' ändert Arrays für die Nutzung im Diagramm
For i = 1 To 365
Abzisse(0, i) = DateAdd("d", i, Date)
Ordinate(0, i) = Auslastung1
Next i
' Anpassung des Arrays für das Diagramm
i = WorksheetFunction.Match(D1, Abzisse, 0)
sDatum = Abzisse(0, i - 1)
For i = i To 365
Ordinate(0, i) = Auslastung2
Next i
'Bis 2. Datum
i = WorksheetFunction.Match(D2, Abzisse, 0)
sDatum = Abzisse(0, i - 1)
For i = i To 365
Ordinate(0, i) = Auslastung3
Next i
'Bis 3. Datum
i = WorksheetFunction.Match(D3, Abzisse, 0)
sDatum = Abzisse(0, i - 1)
For i = i To 365
Ordinate(0, i) = Auslastung4
Next i
' Anpassung des Formates des Datums an das Gewünschte, hier: "Short Date"
For i = 1 To 365
DatumFormat(0, i) = Format(Abzisse(0, i), "Short Date")
Next i
xArr = DatumFormat()
ReDim Preserve yArr(0, n)
yArr(0, n) = Ordinate()
Next rng
'        Exit For
'Genutzte Arrays für das Diagramm
Next n
' Auswahl der Tabelle und des Diagrammtypes
With Worksheets("PPE")
.Shapes.AddChart2(276, xlAreaStacked).Select
.Application.CutCopyMode = False
' Positionierung des Diagramms
.ChartObjects(1).Top = Range("Q2").Top
.ChartObjects(1).Left = Range("Q2").Left
End With
With ActiveChart
' Festlegung der Daten für das Diagramm
.SeriesCollection.NewSeries
.SeriesCollection(1).Name = "='PPE'!$B$4"
.SeriesCollection(1).Values = yArr(0, 4)
.SeriesCollection(1).XValues = xArr
.SeriesCollection.NewSeries
.SeriesCollection(2).Name = "='PPE'!$B$5"
.FullSeriesCollection(2).Values = yArr(0, 5)
.FullSeriesCollection(2).XValues = xArr
End With
End Sub
Hey, also er soll mit yArr das Diagramm befüllen. Es funktioniert so jetzt zumindest erst einmal der Aufruf, allerdings überschreibt er mir immer yArr(0,5). Ideen, wie er die Werte vom 1. n beibehält?
Anzeige
AW: Array speichern
11.12.2019 11:23:30
Tim
Also theoretisch ist das Problem, dass er nach n(1), rng(1) direkt zu n(2), rng(2) gehen soll. Der Befehl ist Exit for. Ich bekomme ihn bloß nicht richtig gesetzt.
AW: Array speichern
11.12.2019 11:39:14
Tim
Oder vllt soetwas wie:
For Each rng In Array("Cells(n,9), Cells(n,12), Cells(n,15)")
Funktioniert nur leider nicht, da er das n nicht erkennt.
AW: Array speichern
11.12.2019 15:15:13
Matthias
Moin!
Du ich blicke da noch nicht ganz durch. Dein Schleifenrumpf sieh wie folgt aus:
For n = 4 To iRows
For Each rng In Array("I4, L4, O4", "I5, L5, O5")
ReDim Preserve yArr(0, n)
yArr(0, n) = Ordinate()
Next rng
'        Exit For
'Genutzte Arrays für das Diagramm
Next n

Das heißt, dass für n = 4 die Ordinate aus dem linken Teil der Range an yarr(0,4) zugewiesen wird und dann mit dem rechten Teil überschrieben. Es sind ja zwei Teile in der Range also auch zwei Durchläufe. Ist das so richtig und gewollt? Wenn nicht, an welcher Stelle sollte den der exit for eintreten bzw. sollen die zwei Rangeteile gesondert behandelte werden (so wie ich das sehe, beeinflußen die ja das selbe Element also Ordinate)
VG
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige