Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Einige Fragen zu Makro mit Arrays

Forumthread: Einige Fragen zu Makro mit Arrays

Einige Fragen zu Makro mit Arrays
14.10.2022 12:14:12
Günther
Hallo
bitte um Hilfe bei der Erstellung einer Function.
Als Argument soll ein Range und eine Zahl n übergeben werden.
Rückgabe soll ein 1-dim. Array sein, das selbst n Stück 1-dim. Arrays enthält. Diese sollen die Zellenwerte der ersten n Spalten, beginnend von der ersten Zelle des Range-Bereichs beinhalten.
Egal, wie groß der übergebene Range ist, Ausgangszelle ist die erste Zelle dieses Ranges.
Hier nun mein Versuch:
Das Makro Test bereitet alles vor, ruft dann die gesuchte Funktion auf und zeigt dann das Ergebnis.

Sub Test()
Dim Ergebnis
Range("B2") = 25
Range("B3") = 11
Range("C2") = 7
Range("D2") = 10
Range("D3") = 15
Range("D4") = 88
Ergebnis = SpaltenArrays(Range("B2"), 3)
Debug.Print Join(Ergebnis(2), ", ")
Debug.Print Join(Ergebnis(3), ", ")
End Sub

Function SpaltenArrays(Ecke As Range, Abschnitte As Long)
Dim ZelleA As Range
Dim ZelleB As Range
Dim Sammlung
Dim SpaltenNr As Long
ReDim Sammlung(1 To Abschnitte)
For SpaltenNr = 1 To Abschnitte
Set ZelleA = Ecke(1, SpaltenNr)
Set ZelleB = ZelleA.End(xlDown)
If ZelleB.Row = Rows.Count Then
Sammlung(SpaltenNr) = Array(ZelleA.Value)
Else
Sammlung(SpaltenNr) = WorksheetFunction.Transpose(Range(ZelleA, ZelleB).Value)
End If
Next SpaltenNr
SpaltenArrays = Sammlung
End Function
Meine Frage nun: Geht das nicht auch einfacher?
Insbesondere der Fall, dass eine Spalte nur aus einem Wert besteht (in diesem Beispiel die zweite), verlangt nach einer If-Abfrage. Aber vielleicht geht das anders besser.
Und ein zweites Problem: Das Array, das aus einem Range gebildet wird, beginnt nicht mit 0 als Index, sondern mit 1. Kann man das ändern? Es soll mit Null beginnen.
Leider konnte ich keine Seiten mit guten Makros finden, damit ich mir was zusammenstellen kann.
LG, Günther
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Einige Fragen zu Makro mit Arrays
14.10.2022 12:23:18
snb
Ganz einfach:

Sub M_snb()
Range("B2") = 25
Range("B3") = 11
Range("C2") = 7
Range("D2") = 10
Range("D3") = 15
Range("D4") = 88
sn = Cells(2, 2).CurrentRegion
MsgBox Join(Application.Transpose(Application.Index(sn, 0, 1)), ",")
MsgBox Join(Application.Transpose(Application.Index(sn, 0, 2)), ",")
MsgBox Join(Application.Transpose(Application.Index(sn, 0, 3)), ",")
End Sub
Schau mal:
https://www.snb-vba.eu/VBA_Arrays_en.html
Anzeige
AW: Einige Fragen zu Makro mit Arrays
14.10.2022 13:35:12
Günther
Hi snb,
Die Spaltenarrays sollen aber nur so groß sein, wie nichtleere Zellen darin sind. Das ist bei der zweiten Spalte nicht der Fall. Daher habe ich es mit End(xldown) probiert. Da das aber erst ab zwei Zellen funktioniert, musste ich für eine Zelle extra was vorsehen. Dennoch vielen Dank.
LG, Günther.
Anzeige
AW: Einige Fragen zu Makro mit Arrays
14.10.2022 13:40:23
snb
Verwende:

Sub M_snb()
Range("B2") = 25
Range("B3") = 11
Range("C2") = 7
Range("D2") = 10
Range("D3") = 15
Range("D4") = 88
sn = Cells(2, 2).CurrentRegion
MsgBox Replace(Trim(Join(Application.Transpose(Application.Index(sn, 0, 1)))), " ", ",")
MsgBox Replace(Trim(Join(Application.Transpose(Application.Index(sn, 0, 2)))), " ", ",")
MsgBox Replace(Trim(Join(Application.Transpose(Application.Index(sn, 0, 3)))), " ", ",")
End Sub

Anzeige
AW: Einige Fragen zu Makro mit Arrays
14.10.2022 16:17:06
snb
Man kann ein Array sehr einfach umwandeln mit Lbound=0

Sub M_snb()
Range("B2") = 25
Range("B3") = 11
Range("C2") = 7
Range("D2") = 10
Range("D3") = 15
Range("D4") = 88
sn = Cells(2, 2).CurrentRegion
With CreateObject("New:{8BD21D20-EC42-11CE-9E0D-00AA006002F3}") '  - Microsoft Forms 2.0 ListBox
.List = sn
sn = .List
End With
MsgBox LBound(sn) & "_" & UBound(sn) & vbTab & LBound(sn, 2) & "_" & UBound(sn, 2)
MsgBox Replace(Trim(Join(Application.Transpose(Application.Index(sn, 0, 1)))), " ", ",")
MsgBox Replace(Trim(Join(Application.Transpose(Application.Index(sn, 0, 2)))), " ", ",")
MsgBox Replace(Trim(Join(Application.Transpose(Application.Index(sn, 0, 3)))), " ", ",")
End Sub

Anzeige
AW: Einige Fragen zu Makro mit Arrays
14.10.2022 16:49:43
Günther
OK, geht tatsächlich genial einfach.
Geht das auch mit einem Befehl ohne geheimnisvolle Ziffern und Buchstaben? Denn ich habe keine Ahnung, was das bedeutet und was damit gemacht wird (außer dass offensichtlich eine Listbox im Spiel ist und die sich bei eintreffenden Arrays offensichtlich nichts um die Nummerierung kümmert und eine eigene vornimmt, vermute ich mal).
Außerdem habe ich diesen Weg, den unteren Index auf Null zu setzen, hier von Dir das erste Mal gesehen, obwohl ich das als Standardaufgabe einschätze.
Wieder was gelernt, danke.
LG, Günther
Anzeige
AW: Einige Fragen zu Makro mit Arrays
14.10.2022 17:48:12
snb
Geht das auch mit einem Befehl ohne geheimnisvolle Ziffern und Buchstaben?
- diese Methode läuff nur im Arbeitsspeicher, ohne Arbeitsblatt Interaktion: schnell und invisible; Also zu bevorzügen.
- etwas weniger klug:

Sub M_snb()
Range("B2") = 25
Range("B3") = 11
Range("C2") = 7
Range("D2") = 10
Range("D3") = 15
Range("D4") = 88
sn = Cells(2, 2).CurrentRegion
With Sheet1.OLEObjects.Add("Forms.ListBox.1", , , , , , , 200, 100, 240, 160)
With .Object
.List = sn
sn = .List
End With
.Delete
End With
End sub
obwohl ich das als Standardaufgabe einschätze
- ist es jedoch keinenfalls; ich vermute keine der Helfer weiss das.
Anzeige
AW: Einige Fragen zu Makro mit Arrays
16.10.2022 17:28:56
August
Danke, der Zeitunterschied ist tatsächlich minimal.
Danke für das Testmakro.
Es ist schon richtig: Sicher muss ich aufpassen, dass ich keine Fehler mache. Nur, bei der Suche nach der fehlerhaften Zeile irgendwo im Code kann man im ByVal-Array schon mal a priori eine mögliche Änderung nach Rückkehr ins aufrufende Makro ausschließen. daher versuche ich alles, was möglich ist, mit ByVal und alles, was notwendig ist, mit ByRef zu übergeben. Auch in Hinblick auf spätere Änderungen, Anpassungen und Erweiterungen.
Vielen Dank nochmal und einen schönen Tag wünscht
August
Anzeige
AW: Einige Fragen zu Makro mit Arrays
14.10.2022 14:18:11
Rudi
Hallo,

Sub aaa()
Dim vntIN, vntOUT(), i As Integer, tmp
Range("B2") = 25
Range("B3") = 11
Range("C2") = 7
Range("D2") = 10
Range("D3") = 15
Range("D4") = 88
vntIN = Cells(2, 2).CurrentRegion
ReDim vntOUT(UBound(vntIN, 2) - 1)
For i = 1 To UBound(vntIN, 2)
tmp = Application.Index(vntIN, 0, i)
tmp = Application.Transpose(tmp)
tmp = Join(tmp)
tmp = Trim(tmp)
tmp = Split(tmp)
vntOUT(i - 1) = tmp
Next
For i = 0 To 2
MsgBox UBound(vntOUT(i))
Next
End Sub
'
'

Das Array, das aus einem Range gebildet wird, beginnt nicht mit 0 als Index, sondern mit 1. Kann man das ändern?
Das kann man nicht ändern.
Gruß
Rudi
Anzeige
AW: Einige Fragen zu Makro mit Arrays
14.10.2022 16:18:23
snb
Das kann man nicht ändern.
Das kann man sehr einfach ändern.
dann sag mal wie. owT
16.10.2022 20:13:38
Rudi
.
AW: Einige Fragen zu Makro mit Arrays
14.10.2022 14:34:36
Günther
Hi Rudi,
für die richtige Indexverwendung eines Arrays aus einem Range muss also händisch die Daten umschaufeln, schließe ich daraus.
Danke für Dein Beispiel. Funktioniert
snb, funktioniert nicht so richtig. An der Rückverwandlung in ein Array scheitert es.
Aber ein Split statt einem Replace liefert das gewünschte array. Dennoch vielen Dank und ein schönes WE.
LG, Günther,
Anzeige
;

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige