Array befüllen aus benanntem Bereich
#1
Hallo wertes Forum,

wahrscheinlich sehe ich mal wieder den Wald vor lauter Bäumen nicht.

Ich habe einen Code, der Werte aus einem benannten Bereich einliest und anschließend einzeln abarbeiten soll.
Bereits bei ersten Wert bekomme ich einen Laufzeitfehler 9: "Index außerhaln des gültigen Bereichs".

Das ist mein Code bis zum Fehler:
Code:
Sub A_SelectionChange()
Dim intLastRow As Integer
Dim blnBatchCopy As Boolean
Dim intBatchCount As Integer, intRowIn As Integer, intRowOut As Integer
Dim arrBatchesIn(), arrBatchesOut()
blnBatchCopy = False
With wksOutput
    intBatchCount = .Range("Output_BatchList").Count
    ReDim arrBatchesIn(intBatchCount)
    ReDim arrBatchesOut(intBatchCount)
    arrBatchesIn = .Range("Output_BatchList").Value
   
    For intRowIn = 1 To UBound(arrBatchesIn)
        If arrBatchesIn(intRowIn) = .Range("Output_StartPoint") Then           'Hier kommt der Fehler
            blnBatchCopy = True
        End If
    Next intRowIn
End with
In der Zeile " If arrBatchesIn(intRowIn) = .Range("Output_StartPoint") Then" hängt der Code.

Ubound(arrBatchesIn) ist 82 entsprechend der Anzahl an Zellen im benannten Bereich und über "wksoutput.Cells(62, 19).Resize(UBound(arrBatchesIn), 1) = arrBatchesIn" erhalte ich alle 82 Werte auch wieder schön in meine Datei zurück.
Wo ist mein Fehler???

Hab's jetzt auch mit "If arrBatchesIn(intRowIn, 1) = .Range("Output_StartPoint") Then" probiert und es funktioniert...
Warum???

Das Araay wird doch als eindimensional dimensioniert, warum brauche ich dann noch das ",1"?

Vielen Dank für Eure Hilfe,
Lutz
Antworten Top
#2
Hallo Lutz,

mir scheint, du vergleichst einen einzelnen Wert mit einer Range. Zeige doch mal deine Datei, dann kann man konkrete Vorschläge unterbreiten.
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antworten Top
#3
Hallo,
 
welcher Fehler:
 
arrBatchesIn(intRowIn) außerhalb des gültigen Bereiches --> falsch dimensioniertes Array
 
.Range("Output_StartPoint")  versuchst du mit Elementinhalt des Arrays in einer Schleife zu vergleichen. Da macht man mit Application.Match oder .Find
 
Das sollte dein Problem ausreichend erhellen. Falls nicht, lade eine Demodatei hoch.

ein Weg via Application.Match:

.xlsm   Range via Arrayvorgabe suchen.xlsm (Größe: 14,52 KB / Downloads: 2)

 
Gruß Uwe
Antworten Top
#4
und was bedeutet ??? Ist doch gar nicht definiiert .


With wksOutput

Code:
Dim intLastRow As Integer
Dim blnBatchCopy As Boolean
Dim intBatchCount As Integer, intRowIn As Integer, intRowOut As Integer
Dim arrBatchesIn(), arrBatchesOut()
blnBatchCopy = False
With wksOutput
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#5
Hallo zusammen,

erstmal vielen Dank für die schnelle Hilfe.
Ich glaube, mein Fehler war einfach, dass ich davon ausgegangen bin, dass das Array natürlich eindimensional ist. Das weiß aber Excel nicht, da es ja ein benannter Bereich ist (der auch zweidimensional sein kann).

Trotzdem habe ich mal eine Beispieldatei angehängt.
Wenn man einen der beiden Werte in C2 oder G2 ändert, wird der Bereich dazwischen in Spalte J ausgegeben.

Funktioniert mit dem Code.

Vielen Dank,
Lutz

.xlsm   Beispiel Array Benannter Bereich.xlsm (Größe: 18,88 KB / Downloads: 4)
Antworten Top
#6
Ein Range und deswegen auch ein benannter Bereich  ist  immer 2-dimensional

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
   If InStr("$C$2$G$2", Target.Address) Then
     sp = Array(Cells(2, 3), Cells(2, 7))
     sn = Cells(1).CurrentRegion
     For j = 1 To UBound(sn)
       If sn(j, 1) < sp(0) Or sn(j, 1) > sp(1) Then sn(j, 1) = ""
     Next
     Cells(1, 10).Resize(UBound(sn), 2) = sn
     Cells(1, 10).CurrentRegion.Sort Cells(1, 10)
   End If
End Sub

Verzichte immer auf Verbundene Zellen !

Advancedfilter wäre hier angemessen. sehe Macro M_snb


Angehängte Dateien
.xlsb   __Adv_Filter.xlsb (Größe: 13,72 KB / Downloads: 0)
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#7
Moin,

Arrays aus Zellbereichen sind immer zweidimensional, auch wenn sie nur eine Spalte oder Zeile enthalten. Vorheriges Dimensionieren ist da unnötig. Wenn du das Array eindimensional haben möchtest, musst du es ein- oder Zweifach transponieren. Zum Beispiel mit WorksheetFunction.Transpose(). Ein-, oder Zweifach hängt davon ab, ob du eine Zeile oder eine Spalte ausliest. Gegebenenfalls ausprobieren, hab ich nicht im Kopf.

Viele Grüße 
derHöpp

Edith: Oh, snb war deutlich schneller. Ich hatte wohl lange nicht aktualisiert 😔
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste