Anzeige
Archiv - Navigation
376to380
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
376to380
376to380
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

ReDim Preserve - Laufzeitfehler 9

ReDim Preserve - Laufzeitfehler 9
07.02.2004 15:57:20
Boris
Hi Leute,
bitte löst doch mal eben meinen Knoten im Hirn:
Warum gibt folgende Dummy-Prozedur beim zweiten Schleifendurchlauf nen Laufzeitfehler 9 - Index außerhalb des gültigen Bereiches? Bemeckert wird die ReDim-Zeile.
Es ist bewusst nur ein Dummycode - es geht mir also nur ums richtige Prinzip.

Sub test()
Dim myArray(), i As Integer
For i = 1 To 10
ReDim Preserve myArray(1 To i, 5)
myArray(i, 1) = i
myArray(i, 2) = i * 2
myArray(i, 3) = i * 3
myArray(i, 4) = i * 4
myArray(i, 5) = i * 5
Next i
End Sub

Danke vorab und
Boris

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ReDim Preserve - Laufzeitfehler 9
07.02.2004 16:02:30
K.Rola
Hallo Boris(der{Boris}?),
bei ReDim Preserve kann nur die letzte Dimension geändert werden.
Gruß K.Rola
AW: ReDim Preserve - Laufzeitfehler 9
07.02.2004 16:21:01
Boris
Hi K.Rola,
...alles klar, wusst ich nicht. Merci!
{Boris}
Hast du nochmal auf den Algorithmus geschaut? Franz hat noch ne Lösung gepostet - hab sie aber (noch) nicht nachvollzogen. Ich selbst hab ihn nicht "geknackt".
AW: ReDim Preserve - Laufzeitfehler 9
07.02.2004 16:28:31
K.Rola
Hallo {Boris},
mit viel Aufwand kann man auch die andere(n) Dimensionen ändern, indem
man ein Array in ein anderes schaufelt, aber ich mach das nie, weil ich
dafür keine Notwendigkeit sehe und es immer Alternativen gibt.
Nö, hab ich nicht, werd gleich mal nachsehen.
Gruß K.Rola
Anzeige
ReDim - Problem - Nachfrage
07.02.2004 16:40:17
Boris
Hi K.Rola,
"...weil ich dafür keine Notwendigkeit sehe..."
Dann gib mir doch nochmal bitte einen Gedankenschubser:
Mit folgender Suchroutine lese ich die Treffer in die Array-Variable ein - danke deinem Hinweis hab ich jetzt auch die letzte Dimension variabel gehalten.
Nur:
Ich möchte am Ende die Variable an eine 5-spalteige Listbox übergeben - und durch das Umstellen der Variable sind jetzt Zeilen und Spalten vertauscht.
Was muss ich wie ändern? Gibt es so ne Art "Transpose-Funktion" für die Array-Variable?

Sub Suche(Suchbegriff As Variant, Suchspalte As Byte, Exakt As Boolean)
Dim C As Range, myArray() As Variant, i As Integer
i = 1
ReDim myArray(1 To 5, 1 To i)
For Each C In Worksheets(1).Range(Cells(1, Suchspalte), Cells(2000, Suchspalte))
If Exakt = False Then
If UCase(C) = Suchbegriff Then
ReDim Preserve myArray(1 To 5, 1 To i)
myArray(1, i) = Cells(C.Row, 1).Value
myArray(2, i) = Cells(C.Row, 2).Value
myArray(3, i) = Cells(C.Row, 3).Value
myArray(4, i) = Cells(C.Row, 4).Value
myArray(5, i) = Cells(C.Row, 5).Value
i = i + 1
End If
Else
If UCase(C) Like "*" & Suchbegriff & "*" Then
ReDim Preserve myArray(1 To 5, 1 To i)
myArray(1, i) = Cells(C.Row, 1).Value
myArray(2, i) = Cells(C.Row, 2).Value
myArray(3, i) = Cells(C.Row, 3).Value
myArray(4, i) = Cells(C.Row, 4).Value
myArray(5, i) = Cells(C.Row, 5).Value
i = i + 1
End If
End If
Next C
UserForm1.ListBox1.List() = myArray()
End Sub

Danke und Grüße
{Boris}
Anzeige
AW: ReDim - Problem - Nachfrage
07.02.2004 16:52:35
Nepumuk
Hallo Boris,
dazu gibt es die Column - Eigenschaft.
UserForm1.ListBox1.Column = myArray()
Gruß
Nepumuk
So einfach - wenn man weiss wie...
07.02.2004 16:54:57
Boris
Hi Nepumuk,
...das funktioniert einwandrei. Danke!
Muss mich doch nochmals etwas mehr mit den einzelnen Eigenschaften auseinandersetzen...
Grüße Boris
AW: So einfach - wenn man weiss wie...
07.02.2004 17:46:22
K.Rola
Hallo Boris,
wie ich sehe, hast du inzwischen Hilfe von Nepumuk bekommen. Hast du
jetzt eine fertige Lösung, würde mich mal interessieren.
Hab nur mal kurz deinen bisherigen Code angesehen, da gibts kleine
Ungereimtheiten, aber vielleicht hast du die ja jetzt schon bereinigt.
Von FPs Beitrag ist mir ganz schwindelig geworden, hab gar nicht erst
versucht das nachzuvollziehen, verstehst du das?
Gruß K.Rola
Anzeige
AW: So einfach - wenn man weiss wie...
07.02.2004 18:02:07
Boris
Hi K.Rola,
...du meinst sicher die Variable Exakt - die enthält nämlich genau das Gegenteil - hab sie deshalb im "neuen" Code auch umgetauft in "bolPart" und die If-Bedingungen umgedreht:
So geht´s - aber für fachfräuliche Verbesserungen Deinerseits bin ich natürlich gern und jederzeit zu haben:

Sub Suche(Suchbegriff As Variant, Suchspalte As Byte, bolPart As Boolean)
Dim C As Range, myArray() As Variant, i As Long, lRow As Long
i = 1
ReDim myArray(1 To 5, 1 To i)
lRow = Worksheets(1).Cells(Rows.Count, Suchspalte).End(xlUp).Row
For Each C In Worksheets(1).Range(Cells(1, Suchspalte), Cells(lRow, Suchspalte))
If bolPart Then
If UCase(C) Like "*" & Suchbegriff & "*" Then
ReDim Preserve myArray(1 To 5, 1 To i)
myArray(1, i) = Cells(C.Row, 1).Value
myArray(2, i) = Cells(C.Row, 2).Value
myArray(3, i) = Cells(C.Row, 3).Value
myArray(4, i) = Cells(C.Row, 4).Value
myArray(5, i) = Cells(C.Row, 5).Value
i = i + 1
End If
Else
If UCase(C) = Suchbegriff Then
ReDim Preserve myArray(1 To 5, 1 To i)
myArray(1, i) = Cells(C.Row, 1).Value
myArray(2, i) = Cells(C.Row, 2).Value
myArray(3, i) = Cells(C.Row, 3).Value
myArray(4, i) = Cells(C.Row, 4).Value
myArray(5, i) = Cells(C.Row, 5).Value
i = i + 1
End If
End If
Next C
If i = 1 Then
UserForm1.Label3 = "Kein Treffer"
Else
UserForm1.Label3.Caption = i - 1
End If
UserForm1.ListBox1.Column = myArray()
End Sub

Die Formeln von Franz hab ich im übrigen nocht nicht nachvollzogen - werde das noch nachholen. Aber wie es aussieht, hat der den Code gecheckt...?
Bin jetzt aber mal die nächste Std. weg.
Grüße Boris
Anzeige
AW: So einfach - wenn man weiss wie...
07.02.2004 19:49:12
K.Rola
Hallo Boris,
Ist es absolut sicher, dass Worksheet1 das aktive Blatt ist?
Sind die Suchbegriffe alle in Großschreibweise?
Wenn nicht, kann da eigentlich außer Zahlen nichts gefunden werden!
Gruß K.Rola
AW: So einfach - wenn man weiss wie...
07.02.2004 20:20:23
Boris
Hi K.Rola,
...du hast natürlich vollkommen Recht - aber das UF wird mittels Button aus Worksheet(1) aufgerufen - und dieser Button ist NUR dort vorhanden.
Zudem wurde die Variable "Suchbegriff" in der aufrufenden Prozedur bereits in Großbuchstaben umgewandelt:

Private Sub CommandButton3_Click()
If ComboBox1 = "" Then MsgBox "Fehlende Auswahl..": Exit Sub
ListBox1.Clear
Call Suche(UCase(TextBox1), ComboBox1.ListIndex + 1, CheckBox1.Value)
End Sub

Und empfangen werden die Werte ja mit
Sub Suche(Suchbegriff As Variant, Suchspalte As Byte, bolPart As Boolean)
Ich hoffe zumindest, dass es einigermaßen sicher ist. Ist in diesem Fall nur ein kleiner Gefallen für nen Kumpel - der hat sich ne recht große Datei (eher Datenbank) angelegt (alles zu Fuß...) - und ich bring ihm da nun ein paar Bequemlichkeiten rein.
Charme für mich: Ich kann am lebendigen Objekt VBA üben, ohne nachher im Zweifel gesteinigt zu werden.
Danke und Grüße
Boris
Anzeige
AW: So einfach - wenn man weiss wie...
07.02.2004 20:53:14
K.Rola
Hallo,
leicht überarbeitet:
Option Explicit

Sub Suche(Suchbegriff As Variant, Suchspalte As Integer, bolPart As Boolean)
Dim C As Range, myArray() As Variant, i As Long, x As Byte
Dim bytLookAt As Byte, strAddr As String
i = 1
If bolPart Then bytLookAt = 2 Else bytLookAt = 1
With Columns(Suchspalte)
Set C = .Find(Suchbegriff, LookIn:=xlValues, Lookat:=bytLookAt, _
SearchDirection:=1, after:=Cells(65536, Suchspalte))
If Not C Is Nothing Then
strAddr = C.Address
Do
ReDim Preserve myArray(1 To 5, 1 To i)
For x = 1 To 5
myArray(x, i) = Cells(C.Row, x)
Next
i = i + 1
Set C = .FindNext(C)
Loop While Not C Is Nothing And C.Address <> strAddr
End If
End With
If i = 1 Then
UserForm1.Label1 = "Kein Treffer"
Else
UserForm1.Label1.Caption = i - 1
End If
UserForm1.ListBox1.Column = myArray()
End Sub

Gruß K.Rola
Anzeige
Ich hätt ja nix anderes erwartet...
07.02.2004 21:10:51
Boris
Hi Meisterin der Codezeilen,
...läuft natürlich auf Anhieb einwandfrei. :-)
For x = 1 To 5
myArray(x, i) = Cells(C.Row, x)
Next
hatte ich zwischenzeitlich auch bereits geändert - die Idee mit Find ist aber wahrscheinlich die schnellere.
Jetzt verrate mir zum Abschluss nur noch eines:
So sieht mein Userform_Initialize aus (wichtig für die Frage ist nur die Listbox):

Private Sub UserForm_Initialize()
Dim C As Range
With ComboBox1
For Each C In [a1:e1]
.AddItem C
Next C
.ListIndex = 0
End With
With ListBox1
.ColumnCount = 5
.ColumnHeads = True
.ColumnWidths = "1cm;6cm;8cm;8cm;5cm"
.ListStyle = fmListStylePlain
End With
Label3.Caption = 0
End Sub

Wie bekomme ich die Spaltenbeschriftungen in der Listbox hin (stehen in A1:E1).
Mit "RowSource" ist es mir in sofern bekannt, als dass die Überschriften automatisch erkannt werden - aber hier hab ich kein RowSource. Wie geht´s?
Danke und Grüße
Boris
Anzeige
AW: Ich hätt ja nix anderes erwartet...
07.02.2004 22:09:45
K.Rola
Hallo Schmeichler,
ich hatte die Antwort gerade schonmal geschrieben aber die ist irgenwo
im Nirvana gelandet.
Die header gibts nur bei gebunder Box(RowSource), das ist auch nix zu
löten. Tricksen mit Label oder ListView aus den MSCOMCTL.OCX verwenden,
falls die zur Verfügung stehen(kennst du z.B. aus dem Explorer).
Gruß K.Rola
Shit - das wär´s nämlich gewesen...
07.02.2004 22:22:50
Boris
Hi K.Rola,
...dann wär die Suchroutine abgeschlossen.
Ich seh da nur die wenig schöne Möglichkeit, myArray transponiert in ein leeres Tabellenblatt zurückzuschreiben - Überschirften drüberzusetzen und dann mit RowSource arbeiten.
Das müsste doch eigentlich gehen?! Aber bevor ich da jetzt rumbastle...?
Grüße Boris
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige