PDA

Vollständige Version anzeigen : Ubound + Laufzeitfehler 9


Hauptnewb
22.07.2014, 09:39
Hallo Zusammen,

ich möchte 2 Spalten vergleichen und wenn in einem Feld der Spalte A der gleiche Wert steht wie in Spalte B, die zugehörige Zeile in ein Array schreiben. Dazu habe ich mir folgenden Code ausgedacht:



For i = 1 To lngRowsA 'zum Durchlaufen der Spalte A

For j = 1 To lngRowsB 'zum Durchlaufen der Spalte B

If ws.Range("A" & i + 1).Value = ws.Range("B" & j + 1).Value Then 'Vergleich Spalte A u. B

Length = UBound(Array()) 'Ermittlung Array Länge
Array(Length) = j 'Schreiben der Zeilen-# in das letzte freie Feld des Arrays

End If

Next

Next



Ich erhalte jedoch den "Laufzeitfehler 9: Index außerhalb des gültigen Bereichs" für diese Zeile:


Length = UBound(Array()) 'Ermittlung Array Länge


Ich kann mir nicht erklären, warum es an dieser Stelle zu diesem Fehler kommen kann. Hat von euch jemand eine Idee?

Vielen Dank und Gruß

Mc Santa
22.07.2014, 09:49
Hallo,

lass mal die Klammern weg und teste dann.

Hilft das schon?

VG

RPP63neu
22.07.2014, 09:55
Hallo!

*Gelöscht, zu langsam ...*

Gruß, Ralf

EarlFred
22.07.2014, 09:59
Hallo,

wie hast Du die Variable "Array" deklariert?

Kannst Du mal allen relevanten Code posten und nicht nur diesen Fetzen?

Grüße
EarlFred

Hauptnewb
22.07.2014, 10:07
Ich denke ihr meint so:


Length = UBound(Array) 'Ermittlung Array Länge


Ändert leider auch nichts. Ich erhalte weiterhin den gleichen Fehler.

Falls es hilft: Wenn der Fehler Auftritt und ich über die Gelb markierte Zeile gehe, ist Length = 3 und für Ubound = Index außerhalb....

EarlFred
22.07.2014, 10:14
Hallo,

wenn das Array (den Namen "Array" erachte ich übrigens als ungeeignet) leer ist, läuft Ubound() in den von Dir genannten Fehler.

Daher fragte ich nach einem aussagekräftigen Codeauszug.

Option Explicit

Sub sogehtesnicht()
Dim a() As Variant
Dim l As Long

l = UBound(a)
End Sub

Grüße
EarlFred

RPP63neu
22.07.2014, 10:14
Hi!
Siehe EarlFred!
Wie deklarierst und füllst Du das Array?

Gruß, Ralf

Mc Santa
22.07.2014, 10:15
Hallo,

gut dann ist es jetzt wirklich relevant zu wissen, wie dein Array deklariert und initialisiert wurde.

VG

Hauptnewb
22.07.2014, 10:17
Hallo,

wie hast Du die Variable "Array" deklariert?

Kannst Du mal allen relevanten Code posten und nicht nur diesen Fetzen?

Grüße
EarlFred



Dim Array() As Long
Dim Length As Long
Dim lngRowsA As Long
Dim lngRowsB As Long
Dim i As Long
Dim j As Long

For i = 1 To lngRowsA 'zum Durchlaufen der Spalte A

For j = 1 To lngRowsB 'zum Durchlaufen der Spalte B

If ws.Range("A" & i + 1).Value = ws.Range("B" & j + 1).Value Then 'Vergleich Spalte A u. B

Length = UBound(Array()) 'Ermittlung Array Länge
Array(Length) = j 'Schreiben der Zeilen-# in das letzte freie Feld des Arrays

End If

Next

Next



Ich hoffe, damit habe ich alles drinne, was relevant sein könnte.

RPP63neu
22.07.2014, 10:18
Dein Array ist leer
(oder ich hab die falsche Brille auf)

Gruß, Ralf

Mc Santa
22.07.2014, 10:20
Hallo,

dann trifft EarlFreds Aussage zu: Dein Array ist noch komplett leer, wenn du die Länge abfragen willst.
Übrigens funktioniert dein Vorhaben so nicht. Ein Array hat eine feste Länge, die du festlegen musst. Außerdem kannst du den letzten Eintrag nicht so einfach abfragen. Selbst wenn du einen Array mit Länge 10 hast und darin 5 Einträge speicherst, liefert die UBound den Wert 10 zurück.

VG

Hauptnewb
22.07.2014, 10:22
Hallo,

wie meinst du das?

In dieser Zeile beschreibe ich das Array:


Array(Length) = j


Ich möchte ja die Zeilennummer mit dem gefundenen Wert in das Array schreiben. Dazu ermittle ich die Aktuelle Arraylänge, welches zusätzlich dem letzten freien Feld entspricht, da von 0 gezählt wird.

EarlFred
22.07.2014, 10:31
Hallo,

...und welchen Wert besitzt und wie große ist Array() VOR dieser Zeile?

Übrigens: Array als Variablenname wird von VBA 6.5 nicht unterstützt, sicherlich wegen des nicht auflösbaren Namenskonflikts mit der Funktion ARRAY(). Daher mein Hinweis, dass der Variablenname mindestens mal ungünstig ist.

Grüße
EarlFred

Hauptnewb
22.07.2014, 10:54
Den Namen Array() verwende ich im tatsächlichen Code nicht, ich habe das Array nur zur Übersicht hier umbenannt.

Vielleicht hat einer von euch eine sinnvollere Umsetzung für mein Problem. Ich beschreibe es noch einmal ausführlicher:

Ich habe zwei Spalten (A und B), welche Artikelnummern enthalten. Mein Ziel ist es, die Artikelnummern aus Spalte A mit den Artikelnummern aus Spalte B zu vergleichen und wenn diese übereinstimmen die entsprechende Zeilennummer aus Spalte B in ein Array schreiben. Ich weiß jedoch nicht wie groß das Array sein muss, da die Länge der Listen stark variieren können. Zusätzlich möchte ich das Array immer "von vorne nach hinten" beschreiben und keine leeren felder dazwischen haben. Ich möchte also ein Array erhalten, welches ca. so aussieht [2, 10, 105, 111, 5000, 5023, 100234 -> leere Felder]

Könnt ihr mir für solch eine Anwendung einen vernünftigen Ansatz nennen?

Vielen Dank und Gruß

xlph
22.07.2014, 10:58
Hallo,

also ich weiß nicht wie du das starten möchtest.

Das Array wird als Syntaxfehler markiert.

Die Prozedur lässt sich gar nicht starten, das fällt doch auf!

Array() ist eine eigene VBA-Funktion. Du musst eine andere Bezeichnung wählen.

Hauptnewb
22.07.2014, 11:02
Hallo xlph,

wie gesagt: ich habe das Array hier für die Übersicht umbennant. Dabei war mir nicht klar, dass dieser Name unzulässig ist. Sorry wenn ich euch verwirrt habe :(

Gruß

EarlFred
22.07.2014, 11:07
Hallo,

war schon klar, was der Inhalt des Arrays sein würde. Aber auch dieses Array mit den Zeilennummern ist vermutlich nur ein Zwischenschritt.
Was wäre dann also der nächste? Vielleicht kann man das gleich mit optimieren.

Grüße
EarlFred

Hauptnewb
22.07.2014, 11:15
Ein weiterer Schritt wäre, dass ich die gefundenen Artikelnummern durchnummerieren muss. D.h. Artikel 123 wurde 5 mal gefunden und ich möchte dann in Spalte B 123-1, 123-2, 123-3 ... stehen haben und nicht einfach nur das 123.

xlph
22.07.2014, 11:50
Hallo,

das Ergebnis wird in Spalte C ausgegeben.

Public Sub ArtieklNummerVergleichenUndIndizieren_xlph()

Dim ArtikelNrn As Variant
Dim IndexAN As Long

Dim oMatch As Object
Dim KeyM As Variant

Set oMatch = CreateObject("scripting.dictionary")

With Tabelle1

ArtikelNrn = .Range("A1").CurrentRegion.Columns(1).Value

For IndexAN = LBound(ArtikelNrn) To UBound(ArtikelNrn)
If Not IsEmpty(ArtikelNrn(IndexAN, 1)) Then
oMatch(CStr(ArtikelNrn(IndexAN, 1))) = 0
End If
Next


ArtikelNrn = .Range("A1").CurrentRegion.Columns(2).Value

For IndexAN = LBound(ArtikelNrn) To UBound(ArtikelNrn)
If Not IsEmpty(ArtikelNrn(IndexAN, 1)) Then
If oMatch.Exists(CStr(ArtikelNrn(IndexAN, 1))) Then
oMatch(CStr(ArtikelNrn(IndexAN, 1))) = oMatch(CStr(ArtikelNrn(IndexAN, 1))) + 1
ArtikelNrn(IndexAN, 1) = ArtikelNrn(IndexAN, 1) & "-" & oMatch(CStr(ArtikelNrn(IndexAN, 1)))
End If
End If
Next

With .Range("C1").Resize(UBound(ArtikelNrn))
'.NumberFormat = "@" ' TextFormat, sonst mögliche Umwandlung in ein Datum (Bsp. 12-1)
.Value = ArtikelNrn
End With

End With

Set oMatch = Nothing

End Sub