Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1900to1904
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 Index einstellen

Array Index einstellen
29.09.2022 10:43:15
August
Hallo
in folgendem Makro werden zwei Arrays mit unterschiedlichem Erstindex erstellt.

Sub aaa()
Dim a, b
a = Array(10, 20, 30, 40, 50, 60)
b = Range("c11:c16").Value
Debug.Print LBound(a), LBound(b)
End Sub
doch sollen beide mit dem selben Index beginnen, denn sie werden an ein anderes Makro übergeben. Und da sollen die Arrays mit dem selben Index beginnen.
Kann man irgendwas machen, dass a und b mit 1 oder mit 0 beginnen?
OK, a = Array(0, 10, 20, 30, 40, 50, 60)
wäre eine Möglichkeit für a, ist eber nicht besonders schön.
Ich suche nach einer Lösung außer Base ändern oder mit einer Schleife in ein neues Array schaufeln. Es soll schon bei Erstellen des arrays der richtige Index kommen
LG.
August

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array Index einstellen
29.09.2022 11:06:37
GerdL
Moin August!

Sub Unit()
Dim a
a = Array(10, 20, 30, 40, 50, 60)
Cells(1, 1).Resize(1, UBound(a) + 1) = a
a = Application.Transpose(Application.Transpose(Cells(1, 1).Resize(1, UBound(a) + 1)))
Cells(1, 1).Resize(1, UBound(a)).Clear
MsgBox LBound(a)
MsgBox UBound(a)
End Sub
Gruß Gerd
AW: Array Index einstellen
29.09.2022 11:11:25
Yal
Hallo August,
es ist ein Standard bei Programmiersprachen, dass Arrays mit dem Index 0 starten, weil numerische Variablen, darunter Index, uninitialisiert immer 0 und nicht 1 sind.
Bei der Übernahme eines Bereiches geht es wiederum um eine Auflistung, die üblicherweise mit 1 anfangen: Worksheets(1) für die erste Tabelle. Daraus wird in VBA einem Array zugerodnet, das den Index zwischen 1 und <Auflistung>.Count übernimmt.
TL;DR: Setzte am Anfang deiner VBA-Codepane (in jede verwendete Codepane)
Option Base 1
So werden deine Arrays mit Index 1 anfangen.
VG
Yal
Anzeige
AW: Array Index einstellen
29.09.2022 11:50:46
Daniel
Hi
Ein Array aus Range().Value (b) wird immer 1-Basiert sein, das kann man nicht ändern.
Verwendest du die Funktion Array oder Split um ein Array zu erzeugen, dann kannst du das über Option Base 1 einstellen, dass es mit 1 beginnt. Das gilt aber fürs ganze Modul.
Willst du das nicht, kannst du, wie von Gerd gezeigt transponieren, dabei wird auch immer der Startindex 1 angewendet.
Du kannst natürlich auch den Startindex frei wählen: Dim x(1 to 6)
Ggf musst du dann aber das Array über Einzelwerte befüllen
x(1) = 10
x(2) = 20
...
Gruß Daniel
AW: Array Index einstellen
29.09.2022 13:52:01
snb

Sub M_snb()
M_snb_001 Array(Array(10, 20, 30, 40, 50, 60), Range("c11:c16").Value)
End Sub

Sub M_snb_001(sn)
On Error Resume Next
For Each it In sn
For j = 0 - (LBound(it) = 1) To UBound(it)
If UBound(it, 2) = 1 Then MsgBox it(j, 1)
If Err.Number  0 Then MsgBox it(j)
Err.Clear
Next
Next
End Sub

Anzeige
Option Base 1 -- Hinweis
29.09.2022 15:46:47
Rudi
... hilft nicht, wenn das Array durch die Split-Funktion erzeugt wird. Das ist immer 0-basiert.
Gruß
Rudi
AW: Option Base 1 -- Hinweis
29.09.2022 16:16:18
Yal
Hallo Rudi,
scho wieda was g'lernt.
Folgendes funtkioniert. Ich verstehe aber nicht warum:

Sub test()
Dim Arr
Arr = Split("a b")
Debug.Print LBound(Arr); UBound(Arr)
ReDim Preserve Arr(LBound(Arr) + 1 To UBound(Arr) + 1)
Debug.Print LBound(Arr); UBound(Arr)
End Sub
Aber nur für durch "Split" erzeugten Array. Selbst-dimensionierten dann nicht mehr:

Sub test()
Dim Arr()
ReDim Arr(0 To 1)
Arr(0) = "a": Arr(1) = "b"
Debug.Print LBound(Arr); UBound(Arr)
ReDim Preserve Arr(LBound(Arr) + 1 To UBound(Arr) + 1)
Debug.Print LBound(Arr); UBound(Arr)
End Sub
VG
Yal
Anzeige
AW: Option Base 1 -- Hinweis
29.09.2022 18:15:27
Daniel
HI
das () macht den Unterschied
Dim Arr erzeugt ein völlig freie Variable, die alles sein kann und in alles wechseln kann
Dim Arr() erzeugt eine Variable die ein Array sein muss.
bei dim Arr ist des dann zulässig, obere und untere Grenze des Arrays zu verändern
bei dim Arr() darfst du dann nur noch die obere Grenze verschieben., die untere muss fest bleiben.
dh
mit Dim Arr geht ReDim Preserve Arr(LBound(Arr) + 1 To UBound(Arr) + 1)
mit dim Arr() nur: ReDim Preserve Arr(LBound(Arr) To UBound(Arr) + 1)
Gruß Daniel
AW: Option Base 1 -- Hinweis
03.10.2022 18:59:38
Thomas
Hallo
habe alles ausprobiert.
OK, Option Base 1 am Anfang schreiben, und das gilt für alle im Modul erstellten Arrays.
Will ich Base 1 nicht, muss ich in ein anderes Modul.
Will ich es auch in einem anderen Modul, dann dort nicht vergessen, Option Base 1 am Anfang zu schreiben, sonst kommt es zu unerwarteten Ergebnissen und langen Fehler suchen.
Split erzeugte Arrays fangen leider immer mit Index 0 an. Danke für den Hinweis.
Und danke für Eure Antworten.
August.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige