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"?
21.01.2025, 16:01 (Dieser Beitrag wurde zuletzt bearbeitet: 21.01.2025, 16:01 von snb.)
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
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.
21.01.2025, 17:52 (Dieser Beitrag wurde zuletzt bearbeitet: 21.01.2025, 17:53 von snb.)
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
22.01.2025, 00:15 (Dieser Beitrag wurde zuletzt bearbeitet: 22.01.2025, 00:17 von derHoepp.)
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 😔
@snb, für mich ist "If Target.Address = Range("Output_StartPoint").Address" geeigneter als "If InStr("$C$2$G$2", Target.Address) Then". Es sind im Original mehr als diese beiden Adressen und mit dem Zugriff über die benannten Bereiche bin ich flexibler, was das Layout meines Originals angeht (ich kann die Zellen verschieben ohne das Makro anfassen zu müssen). Die beiden Lösungen zum kopieren der Werte funktionieren leider nicht, da (auch wenn hier nur Zahlen stehen) im Original auch Texte stehen können und die Sortierung aufsteigend nicht unbedingt gegeben ist.
Auch wenn meine Lösung etwas umfangreicher als Deine ist, ist sie für mich ok.
Nochmals vielen Dank für Eure Hilfe. Thema ist gelöst.
AdvancedFilter gehören jetzt nicht zu meinem Standard. Sicherlich könnte ich da mehr mit machen, aber die Zeit ist halt begrenzt...
Ich habe jetzt das Beispiel angepasst an die möglichen Inhalte der Spalte A (hier können Chargenbezeichnungen oder Auftragsnummern stehen (Texte oder Zahlen)). Aufgabe ist, die Zellen zwischen der Werten aus C2 und G2 in die Spalte J zu kopieren, egal was da steht oder ob die Spalte A sortiert ist.
Gruß, Lutz
P.S.: die verbundenen Zellen sind blöd, das weiß ich. Ich habe den Dateiaufbau so übernommen und passe ihn jetzt Stück für Stück an. Dabei fliegen die vielleicht auch raus.