Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Daten in Array einlesen und nacheinander abarbeiten

Daten in Array einlesen und nacheinander abarbeiten
07.11.2019 18:58:07
Nils
Hallo Leute ,
diesen Code habe ich mühsam erstellt, vor ca. 2 wochen das erste mal mit VBA zu ttun gehabt und _ so langsam komme ich rein.

Sub Collect_Raw_Data_Test()
Dim Data_object As String
Dim Data_Char As String
Dim ITSys_Planned As String
Dim ITSys_Current As String
Dim Brand As String
Dim Max_Zeilen_Data_Object As Integer
Dim aktuelle_Zeile As Integer
Dim Max_Zeilen_ITSys_Current As Integer
Dim Max_Zeilen_ITSys_Planned As Integer
Dim Brand_counter As Integer
aktuelle_Zeile = 0
Brand_counter = 0
ITSys_Planned_counter = 0
With ActiveWorkbook.Worksheets("PRP_3a")
Max_Zeilen_Data_Object = .Range("No_Data_Objects")
Max_Zeilen_ITSys_Current = .Range("No_IT_Sys_Prev")
For j = 0 To Max_Zeilen_ITSys_Current - 1
For i = 0 To Max_Zeilen_Data_Object - 1
Brand = .Cells(47 + Brand_counter, 3).Value
ITSys_Current = .Cells(47 + j, 4).Value
ITSys_Planned = .Cells(47 + j, 5).Value
Data_object = .Cells(47 + i, 8).Value
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 3).Value = Brand
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 4).Value = ITSys_Current
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 5).Value = ITSys_Planned
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 6).Value = Data_object
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 7).Value = "Previous"
aktuelle_Zeile = aktuelle_Zeile + 1
Next i
Brand_counter = Brand_counter + 1
Next j
Max_Zeilen_ITSys_Current = .Range("No_of_IT_Sys_Plan")
For m = 0 To Max_Zeilen_ITSys_Current - 1
For p = 0 To Max_Zeilen_Data_Object - 1
Brand = .Cells(47 + m, 16).Value
ITSys_Current_succ = .Cells(47 + m, 14).Value
ITSys_Planned_succ = .Cells(47 + m, 15).Value
Data_object = .Cells(47 + i, 8).Value
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 3).Value = Brand
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 4).Value = ITSys_Current_succ
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 5).Value = ITSys_Planned_succ
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 6).Value = Data_object
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 7).Value = "Succeeding"
aktuelle_Zeile = aktuelle_Zeile + 1
Next p
Brand_counter = Brand_counter + 1
Next m
End With
End Sub

Nun möchte ich "With ActiveWorkbook.Worksheets("PRP_3a")" durch einen Array und schleife ersetzten. Leider hänge ich hier grad ziemlich krass.
Aktuell habe ich in meiner Datei das Arbeitsblatt "Raw Data" und PRP_3a, ich muss aber mehrere Arbeitsblätter hinzufügen, die immer mit "PRP_" beginnen. Durch den Array und den Loop möchte ich daher nach der reihe die Arbeitsblätte abarbeiten und mir alles nach "Raw Data" kopieren. Kann mir hier jemand paar Tipps geben bzw. mir Helfen?
LG,
Emil
Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Daten in Array einlesen und nacheinander abarbeiten
07.11.2019 21:32:17
Matthias
Moin!
Mit Schleife könnte es so aussehen. Dabei ist in Schleife zweimal das selbe Blatt. Dort also entweder anpassen oder eins rausschlöschen. Ist jetzt aber ungetestet.
Dim meine_Blaetter()
Dim blattindex As Long
meine_Blaetter = Array("PRP_3a", "PRP_3a")  'hier erweitern
For blattindex = 0 To UBound(meine_Blaetter)
With ActiveWorkbook.Worksheets(meine_Blaetter(blattindex))
Max_Zeilen_Data_Object = .Range("No_Data_Objects")
Max_Zeilen_ITSys_Current = .Range("No_IT_Sys_Prev")
For j = 0 To Max_Zeilen_ITSys_Current - 1
For i = 0 To Max_Zeilen_Data_Object - 1
Brand = .Cells(47 + Brand_counter, 3).Value
ITSys_Current = .Cells(47 + j, 4).Value
ITSys_Planned = .Cells(47 + j, 5).Value
Data_object = .Cells(47 + i, 8).Value
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 3).Value = Brand
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 4).Value = ITSys_Current
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 5).Value = ITSys_Planned
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 6).Value = Data_object
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 7).Value = "Previous"
aktuelle_Zeile = aktuelle_Zeile + 1
Next i
Brand_counter = Brand_counter + 1
Next j
Max_Zeilen_ITSys_Current = .Range("No_of_IT_Sys_Plan")
For m = 0 To Max_Zeilen_ITSys_Current - 1
For p = 0 To Max_Zeilen_Data_Object - 1
Brand = .Cells(47 + m, 16).Value
ITSys_Current_succ = .Cells(47 + m, 14).Value
ITSys_Planned_succ = .Cells(47 + m, 15).Value
Data_object = .Cells(47 + i, 8).Value
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 3).Value = Brand
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 4).Value = ITSys_Current_succ
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 5).Value = ITSys_Planned_succ
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 6).Value = Data_object
Worksheets("RawData").Cells(3 + aktuelle_Zeile, 7).Value = "Succeeding"
aktuelle_Zeile = aktuelle_Zeile + 1
Next p
Brand_counter = Brand_counter + 1
Next m
End With
Next

Ansonsten würde ich deine integer Variablen als Long deklarieren. Bspw. gibt es mehr Zeilen in einem Blatt, als die Integer Variable aufnehmen kann. Nach mehr habe ich jetzt erstmal nicht geschaut.
VG
Anzeige
AW: Daten in Array einlesen und nacheinander abarbeiten
07.11.2019 23:03:28
Daniel
HI
wenn alle Blätter, die mit "PRP_" beginnen, bearbeitet werden sollen, so:
ersetze die With-Klammer
With ActiveWorkbook.Worksheets("PRP_3a")
End with

durch folgendes, der restliche Code vor, nach und in der With-Klammer kann bleiben:
dim wsh as worksheet
for each wsh in activeworkbook.worksheets
with wsh
if .name like "PRP_*" then
hier dann der Code der ursprünglich in der WITH-Klammer stand
end wif
end with
Next
Gruß Daniel
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Daten in Array einlesen und nacheinander abarbeiten


Schritt-für-Schritt-Anleitung

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor in Excel zu öffnen.

  2. Modul hinzufügen: Füge ein neues Modul hinzu, indem du im Projekt-Explorer mit der rechten Maustaste auf "VBAProject" klickst und "Einfügen" > "Modul" wählst.

  3. Code einfügen: Kopiere den folgenden Code in das Modul:

    Sub Collect_Raw_Data_Test()
        Dim Data_object As String
        Dim ITSys_Current As String
        Dim ITSys_Planned As String
        Dim Brand As String
        Dim aktuelle_Zeile As Long
        Dim Brand_counter As Long
        Dim wsh As Worksheet
    
        aktuelle_Zeile = 0
        Brand_counter = 0
    
        For Each wsh In ActiveWorkbook.Worksheets
            If wsh.Name Like "PRP_*" Then
                With wsh
                    Max_Zeilen_Data_Object = .Range("No_Data_Objects")
                    Max_Zeilen_ITSys_Current = .Range("No_IT_Sys_Prev")
    
                    ' Daten abarbeiten
                    For j = 0 To Max_Zeilen_ITSys_Current - 1
                        For i = 0 To Max_Zeilen_Data_Object - 1
                            Brand = .Cells(47 + Brand_counter, 3).Value
                            ITSys_Current = .Cells(47 + j, 4).Value
                            ITSys_Planned = .Cells(47 + j, 5).Value
                            Data_object = .Cells(47 + i, 8).Value
    
                            Worksheets("RawData").Cells(3 + aktuelle_Zeile, 3).Value = Brand
                            Worksheets("RawData").Cells(3 + aktuelle_Zeile, 4).Value = ITSys_Current
                            Worksheets("RawData").Cells(3 + aktuelle_Zeile, 5).Value = ITSys_Planned
                            Worksheets("RawData").Cells(3 + aktuelle_Zeile, 6).Value = Data_object
                            Worksheets("RawData").Cells(3 + aktuelle_Zeile, 7).Value = "Previous"
                            aktuelle_Zeile = aktuelle_Zeile + 1
                        Next i
                        Brand_counter = Brand_counter + 1
                    Next j
                End With
            End If
        Next wsh
    End Sub
  4. Code anpassen: Stelle sicher, dass die Range-Namen (No_Data_Objects, No_IT_Sys_Prev) in deinem Arbeitsblatt existieren.

  5. Makro ausführen: Drücke F5, um das Makro auszuführen und die Daten in das Arbeitsblatt "RawData" zu kopieren.


Häufige Fehler und Lösungen

  • Fehler: "Index außerhalb des zulässigen Bereichs"

    • Lösung: Überprüfe, ob die Namen der Arbeitsblätter in der Array-Deklaration korrekt sind und ob sie tatsächlich existieren.
  • Fehler: "Typenkonflikt"

    • Lösung: Stelle sicher, dass die Variablen auf den richtigen Datentypen basieren. Nutze Long für Zähler und Indizes, um Überläufe zu vermeiden.

Alternative Methoden

Eine alternative Methode wäre die Verwendung von Application.Worksheets anstelle von ActiveWorkbook.Worksheets:

For Each wsh In Application.Worksheets
    ' Der Rest des Codes bleibt gleich
Next wsh

Diese Methode ist nützlich, wenn du mit mehreren geöffneten Arbeitsmappen arbeitest und sicherstellen möchtest, dass du die richtigen Blätter bearbeitest.


Praktische Beispiele

Hier ist ein Beispiel für die Verwendung des Codes mit einer hypothetischen Arbeitsmappe:

  • Angenommen, du hast mehrere Arbeitsblätter mit den Namen "PRP_1", "PRP_2" und "PRP_3".
  • Wenn du das Makro ausführst, werden die Daten von jedem dieser Blätter in das Arbeitsblatt "RawData" kopiert.

Tipps für Profis

  • Verwende Option Explicit: Füge dies am Anfang deines Moduls hinzu, um sicherzustellen, dass alle Variablen deklariert sind, was die Fehlersuche erleichtert.
  • Debugging: Nutze Debug.Print, um den Inhalt von Variablen während der Ausführung zu überprüfen.
  • Leistung optimieren: Schalte Bildschirmaktualisierung und Berechnungen aus, bevor du das Makro ausführst:

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    ' Dein Code hier
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic

FAQ: Häufige Fragen

1. Wie viele Blätter kann ich mit diesem Code bearbeiten? Der Code kann beliebig viele Blätter bearbeiten, solange die Blätter den Namen mit "PRP_" beginnen.

2. Was mache ich, wenn ich eine Fehlermeldung erhalte? Überprüfe zuerst die Range-Namen und stelle sicher, dass alle Variablen korrekt deklariert sind. Wenn das Problem weiterhin besteht, führe den Code schrittweise aus, um den Fehler zu lokalisieren.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige