VBA: Array-Werte innerhalb einer Schleife ausschreiben

Moderator: ModerationP

VBA: Array-Werte innerhalb einer Schleife ausschreiben

Beitragvon sccorp » 17. Apr 2019, 12:31

Hallo zusammen,

nach zweistündigem Suchen in Google komme ich nun hier her und bitte euch um Hilfe ... Leider bin ich in VBA noch nicht so sehr fit. Ich stehe vor einem Problem, bei dem ich gerade nicht weiterkomme.

Ich habe ein Makro geschrieben, welches eine variable Projektnummer mit 11 Meilensteinen in einer Excelliste anlegt. Ich befülle also mithilfe einer normalen Schleife einen Bereich, der 11 Zeilen und ca. 20 Spalten betrifft. Die dazugehörigen Variablen definiere ich vorher in einer Userform. Dies kriege ich auch noch hin.

Nun habe ich in Spalte J jedoch Projektmeilensteine, welche mit den folgenden Nummern versehen sind: 0, 1, 2, 3, 4b, 5a, 5b, 6, 7, 8, 9. Diese sind projektunabhängig immer gleich. Innerhalb der genannten Schleife sollen die Zeilen 1-11 immer mit diesen fixen Werten befüllt werden. D.h. die erste Zeile im Bereich soll mit 0 befüllt werden, die zweite mit 1, etc. Wären die Meilensteine rein numerisch wäre das auch mit einer normalen Schleife kein Problem. Das Problem sind nur die Nummern 4b, 5a, 5b, wodurch ich diese wahrscheinlich als String bzw. Array definieren muss. Das bekomme ich allerdings nicht hin, da ich hier einfach keinerlei Kenntnis habe. Muss hier eine For-Each-Schleife angewendet werden? Ich hoffe ihr könnt mir hierbei helfen.

Hier noch ein Code-Beispiel für den Rest:
Code: Alles auswählen
For i = 1 To 12 Step 1    'Schleife, mit der die Zellen variablenabhängig befüllt werden
Cells(i, 2).Value = prn
Cells(i, 3).Value = prname
Cells(i, 7).Value = prkoord
Cells(i, 8).Value = br
Cells(i, 9).Value = modell
Cells(i, 10).Value = Array("0", "1", "2", "3", "4b", "5a", "5b", "6", "7", "8", "9")
Next   i


Ich kann mir vorstellen, dass das für viele von euch eine einfache Übung ist, aber ich komm hier einfach nicht weiter. :(

Viele Grüße
Felix
Zuletzt geändert von sccorp am 17. Apr 2019, 15:52, insgesamt 1-mal geändert.
sccorp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3
Registriert: 17. Apr 2019, 12:12

Re: VBA: Array-Werte innerhalb einer Schleife ausschreiben

Beitragvon Nepumuk » 17. Apr 2019, 12:59

Hallo Felix,

meist du so?

Code: Alles auswählen
Cells(i, 10).Resize(1, 10).Value = Array("0", "1", "2", "3", "4b", "5a", "5b", "6", "7", "8", "9")
De fontibus non est disputandum

Gruß
Nepumuk 8-)
Benutzeravatar
Nepumuk
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 14387
Registriert: 10. Aug 2004, 08:40
Wohnort: Regensburg

Re: VBA: Array-Werte innerhalb einer Schleife ausschreiben

Beitragvon slowboarder » 17. Apr 2019, 13:33

Hi
wenn du ein Array in einen Zellbereich schreiben willst, dann musst du darauf achten, dass du den Zellbereich hierfür an die Elementanzahl des Arrays anpasst.
Eindimensionale Arrays werden immer in eine Zeile in die Spalten geschrieben.

Code: Alles auswählen
Cells(i, 10).Resize(1, 11).Value = Array("0", "1", "2", "3", "4b", "5a", "5b", "6", "7", "8", "9")



wenn du zu faul zum Zählen bist oder das Risiko des Verzählens vermeiden willst, oder sich die Elementanzahl noch ändern kann und du den Code so schreiben willst, dass dann möglichst wenig Änderungen im Code erforderlich sind, kannst du das Array auch erst in eine Variable schreiben und dann das Zählen der Elemente per Code durchführen.


Code: Alles auswählen
 arrX = Array("0", "1", "2", "3", "4b", "5a", "5b", "6", "7", "8", "9")
For i = 1 To 12 Step 1    'Schleife, mit der die Zellen variablenabhängig befüllt werden
Cells(i, 2).Value = prn
Cells(i, 3).Value = prname
Cells(i, 7).Value = prkoord
Cells(i, 8).Value = br
Cells(i, 9).Value = modell
Cells(i, 10).Resize(Ubound(arrX) - Lbound(arrX) + 1, 1).Value = arrX
Next   i


das Ubound-LBound kommt daher, dass der Startindex kein fester Wert sein muss, sondern je nach herkunft und Einstellung auch 0, 1, oder sogar ein beliebier anderer Ganzzahlwert.
auf diese Weise kann man dann die Elementanzahl für jeden Fall korrekt berechnen.

wenn man sich sicher ist, dass das Array die Basis 0 oder 1 hat, reicht auch:
bei 1: .Resize(Ubound(arrX), 1)
bei 0: Resize(Ubound(arrX) + 1, 1)

Gruß Daniel
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 25737
Registriert: 18. Apr 2009, 13:33

Re: VBA: Array-Werte innerhalb einer Schleife ausschreiben

Beitragvon snb » 17. Apr 2019, 13:34

Code: Alles auswählen
Cells(1, 1).resize(,10) = split("0 1 2 3 4b 5a 5b 6 7 8 9")
Cells(1, 1).resize(10) = application.transpose(split("0 1 2 3 4b 5a 5b 6 7 8 9"))
Zuletzt geändert von snb am 17. Apr 2019, 16:10, insgesamt 1-mal geändert.
snb
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 6804
Registriert: 25. Sep 2014, 16:37

Re: VBA: Array-Werte innerhalb einer Schleife ausschreiben

Beitragvon slowboarder » 17. Apr 2019, 14:11

Hi snb
auch verzählt oder einfach nur falsch abgeschrieben? :mrgreen: :mrgreen: :mrgreen:
Gruß Daniel
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 25737
Registriert: 18. Apr 2009, 13:33

Re: VBA: Array-Werte innerhalb einer Schleife ausschreiben

Beitragvon Nepumuk » 17. Apr 2019, 14:44

Hallo Daniel,

hast du das getestet? Ich glaube nicht, den:

Code: Alles auswählen
Public Sub y()
    Dim arrX As Variant
    arrX = Array("0", "1", "2", "3", "4b", "5a", "5b", "6", "7", "8", "9")
    Cells(2, 10).Resize(UBound(arrX) - LBound(arrX) + 1, 1).Value = arrX
End Sub

schreibt mir 11 Nullen in Spalte J.
De fontibus non est disputandum

Gruß
Nepumuk 8-)
Benutzeravatar
Nepumuk
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 14387
Registriert: 10. Aug 2004, 08:40
Wohnort: Regensburg

Re: VBA: Array-Werte innerhalb einer Schleife ausschreiben

Beitragvon slowboarder » 17. Apr 2019, 14:49

stimmt, erwischt, ab mal wieder Zeilen mit Spalten verwechselt.

Code: Alles auswählen
Cells(2, 10).Resize(1, UBound(arrX) - LBound(arrX) + 1).Value = arrX

(wobei der Fehler sicherlich schneller auffällt, als ein fehlender Wert am Ende, nur weil man sich verzählt hat)

Gruß Daniel
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 25737
Registriert: 18. Apr 2009, 13:33

Re: VBA: Array-Werte innerhalb einer Schleife ausschreiben

Beitragvon sccorp » 17. Apr 2019, 15:39

Hallo zusammen,

erstmal vielen Dank für die vielen Antworten! Um das erstmal aufzuklären: In meinem Code habe ich mich tatsächlich verzählt :D Meine Schleife muss heißen:

Code: Alles auswählen
For i = 1 To 11 Step 1

und nicht
Code: Alles auswählen
For i = 1 To 12 Step 1


Das könnte auch der Grund sein warum die Lösungen bei mir leider nicht ganz funktionieren. Am ehesten hat noch die Variante von Nepumuk funktioniert. Leider hat es mir nun die Array in 11 Spalten (Spalte J1-11 sind 11 Nullen, Spalte K sind 11 Einsen, u.s.w) und nicht in die Spalte hineingeschrieben :D

Bei der ersten Variante von Daniel hat es mir - warum auch immer - eine 0 in die Zellen J1-21) hineingeschrieben.

Sorry nochmal für die Umstände!

Gruß
Felix
__________________________________

Kleines Update:

Die Version von Daniel hat den selben Effekt. Hier ist also auch in Spalte J 11 Nullen, in Spalte K 11 Einsen, usw.
sccorp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3
Registriert: 17. Apr 2019, 12:12

Re: VBA: Array-Werte innerhalb einer Schleife ausschreiben

Beitragvon slowboarder » 17. Apr 2019, 16:03

OK verstanden, was du willst.
mit 12 Zeilen für 11 Array-werte gabs keinen Sinn

als Schleife so, da du die Werte des Arrays jetzt einzeln verwendest, musst du den Index des jeweiligen Wertes angeben:

Code: Alles auswählen
For i = 1 To 11 Step 1    'Schleife, mit der die Zellen variablenabhängig befüllt werden
    Cells(i, 2).Value = prn
    Cells(i, 3).Value = prname
    Cells(i, 7).Value = prkoord
    Cells(i, 8).Value = br
    Cells(i, 9).Value = modell
    Cells(i, 10).Value = Array("0", "1", "2", "3", "4b", "5a", "5b", "6", "7", "8", "9")(i - 1)
Next   i


wobei ich hier ohne Schleife arbeiten würde, weil du die Werte auch direkt in alle Zellen gleichzeitig schreiben kannst:
Code: Alles auswählen
with Range("A1:J11")
    .Columns(2).value = prn
    .Columns(3).value = prnName
    .Columns(7).value = prkoord
    .columns(8).Value = br
    .columns(9).Value = modell
    .Columns(10).Value = Worksheetfunction.Transpose(Array("0", "1", "2", "3", "4b", "5a", "5b", "6", "7", "8", "9"))
end with

du musst hier transponieren, weil eindimensionale Arrays normalerweise in eine Zeile geschrieben werden und nicht in eine Spalte.

Gruß Daniel
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 25737
Registriert: 18. Apr 2009, 13:33

Re: VBA: Array-Werte innerhalb einer Schleife ausschreiben

Beitragvon sccorp » 17. Apr 2019, 16:26

Super! Das hat jetzt endlich funktioniert :)

Vielen Dank für die Hilfe :mrgreen:
sccorp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3
Registriert: 17. Apr 2019, 12:12


Zurück zu Excel Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste