Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1332to1336
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
Arrays in Range
05.10.2013 10:53:41
hype
Hallo zamm,
Hallo was vorher mit String und ganzahligen Werten geklaptp hat klappt iwie nicht mehr mit Daten (Pl. von Datum mein ich).
Folgender Fall: Ich möchte alle Arbeitstage ab dem 24.09.2013 bis genau ein Jahr zurück mir in einem sheet ab dem 24.09.2013 abwärts, auflisten lassen. Also bis 24.09.2012
Code:
Sub InputDatumWL()
Application.ScreenUpdating = False
Dim a(250) As Date, x As Integer, y As Byte
Dim wk As Worksheet, LoadEingabe As Worksheet
Set wk = ThisWorkbook.Worksheets("Werk_Kalender")
Set LoadEingabe = ThisWorkbook.Worksheets("Eingabe")
With ThisWorkbook.Worksheets("WL")
a(x) = CDate("24.09.2013")   'CDate(LoadEingabe.[D11])
.Cells(x + 4, 1) = CDate("24.09.2013")   'LoadEingabe.[D11]
y = WorksheetFunction.NetworkDays(a(x) - CDate(364), a(x), wk.Range("A2:S27"))
Debug.Print a(0)
For x = 1 To y - 1
a(x) = WorksheetFunction.WorkDay(a(x - 1), -1#, wk.Range("A2:S27"))
.Cells(x + 4, 1) = WorksheetFunction.WorkDay(a(x - 1), -1#, wk.Range("A2:S27"))
'Debug.Print a(x)
Next x
'Debug.Print a(x - 1)
.Range(.Cells(4, 1), .Cells(x + 14, 1)) = a()
End With
End Sub
normaler weise müsste ohne
'.Cells(x + 4, 1) = WorksheetFunction.WorkDay(a(x - 1), -1#, wk.Range("A2:S27"))
in der letzten Zeile
'.Range(.Cells(4, 1), .Cells(x + 14, 1)) = a()
das komplette Array in die Range übertragen werden. Tuts aber iwie nicht!

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Arrays in Range
05.10.2013 14:06:57
fcs
Hallo hype,
das Eintragen der Array-Daten funktionier, wenn Arra a mit 2 Dimensionen deklariert wird.
y sollte nicht als Byte deklariert werden, sondern als Integer oder Long.
Die NettoArbeitstage-Funktion könnte ja doch mal mehr als 255 als Ergebnis liefern.
CDate(364) liefert als Ergebenis 29.09.1900
um 1 Jahr in die Vergangenheit zu kommern solltest die Funktion Dateserial benutzen.
mfg
Franz
Sub InputDatumWL()
Application.ScreenUpdating = False
Dim a() As Date, x As Integer, y As Long
Dim StartDate As Date
Dim wk As Worksheet, LoadEingabe As Worksheet
Set wk = ThisWorkbook.Worksheets("Werk_Kalender")
Set LoadEingabe = ThisWorkbook.Worksheets("Eingabe")
With ThisWorkbook.Worksheets("WL")
StartDate = CDate("24.09.2013")   'CDate(LoadEingabe.[D11])
.Cells(x + 4, 1) = StartDate   'LoadEingabe.[D11]
y = WorksheetFunction.NetworkDays(DateSerial(Year(StartDate) - 1, Month(StartDate), _
Day(StartDate)), StartDate, wk.Range("A2:S27"))
ReDim Preserve a(0 To y - 1, 1 To 1)
a(0, 1) = StartDate
Debug.Print a(0, 1)
For x = 1 To y - 1
a(x, 1) = WorksheetFunction.WorkDay(a(x - 1, 1), -1#, wk.Range("A2:S27"))
.Cells(x + 4, 1) = WorksheetFunction.WorkDay(a(x - 1, 1), -1#, wk.Range("A2:S27"))
'Debug.Print a(x, 1)
Next x
'Debug.Print a(x - 1, 1)
.Cells(4, 1).Resize(UBound(a) + 1, 1).Value = a
End With
End Sub

Anzeige
AW: Arrays in Range
05.10.2013 18:12:48
hype
Hallo Franz,
hervoragende Lösung. funktioniert.
warum 2 Dimensional wenn nur eine Spalte, sprich 1D, gefüllt wird?
y reicht als Byte zu deklarieren da in einem Arbeitsjahr immer weniger als 255 Arbeitstage sind. Der Betrachtungszeitraum ist jährlich für diese Prozedur.
Cdate(364) war gewollt ist aber nicht exakt richtig, wie jedoch die dateserial-Lösung von dir.
Danke wieder was gelernt!
Freundlichen Gruß
Sven

Zu deiner Frage, ...
05.10.2013 20:08:25
Luc:-?
…Sven…
Zitat: Warum 2dimensional, wenn nur eine Spalte, sprich D, gefüllt wird?
ZellBereiche sind in Xl immer 2dimensional, das ist dann auch als VBA-RangeArray so.
DatenFelder (zB aus der Berechnung von Fmln (→Ausdrücke⇔Expressions) können als horizontaler (Zeilen-)Vektor auch 1dimensional sein. Als vertikaler (Spalten-)Vektor sind sie idR ebenfalls 2dimensional (erforderl Kennzeichnung der Ausrichtung). Allerdings gibt es hiervon folgende Ausnahme: Ein vertikaler Vektor ist in VBA 1dimensional, wenn seine Elemente ebenfalls aus (gleichlangen horizontalen) Vektoren bestehen. Dieses Konstrukt ist nur in dieser Form auf ZellBereiche abbildbar, weshalb seine Ausrichtung(en – für nachfolgende Berechnungen) hinreichend eindeutig definiert ist.
Wenn man das ausnutzt, kann man mitunter auch auf andere (bequemere) Lösungsmöglichkeiten kommen. Das wären in VBA Variants mit Array, was weitgehend dem Aufbau von Arrays/-Objekten in anderen PgmierSprachen entspricht. Das (Xl geschuldete) n-dimensionale VBA-Array wäre dort ein Sonderfall!
Gruß Luc :-?
Anzeige

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige