TOP

VBA-Lektion 13.3. Verwenden von Arrays (Arrays) (Übungen)

YouLibreCalc for Excel logo

Um die Verwendung von Arrays zu üben, erstellen wir Schritt für Schritt eine eigene Version des Makros, mit dem wir den Geschwindigkeitsvorteil von Arrays demonstriert haben ...


Hier ist der Ausgangspunkt für diese Übung (Sie werden sehen, dass der Datensatz auf 1000 Zeilen reduziert wurde):

Hier können Sie die Beispieldatei Excel herunterladen: arrays_exercise.xls

Übungsziel: Das Verfahren sollte die Daten im Datensatz durchlaufen und die Anzahl der JA- oder NEIN-Antworten für jedes Jahr und für jede Kundennummer zählen (entweder JA oder NEIN, je nach Wahl des Benutzers) und diese Menge in die angegebene Zelle von eingeben das Arbeitsblatt.

Führen Sie das folgende Makro aus, um Daten aus dem Arbeitsblatt „DS“ in einem Array zu speichern:

Sub actualize()
     Dim last_row As Integer
     
     'Die letzte Zeile des Datensatzes
     '...
        
     'Speichern eines Datensatzes in einem dynamischen Array
     Dim array_db()
     '...
        
End Sub

Hier ist eine Beispiellösung:

Sub actualize()
     Dim last_row As Integer
     
     'Die letzte Zeile der Datenbank
     last_row = Sheets("DS").Range("A1").End(xlDown).Row

     'Speichern eines Datensatzes in einem dynamischen Array
     Dim array_db()
     ReDim array_db(last_row - 2, 2)
     
     For row_number = 2 To last_row
         array_db(row_number - 2, 0) = Sheets("DS").Range("A" & row_number)
         array_db(row_number - 2, 1) = Sheets("DS").Range("B" & row_number)
         array_db(row_number - 2, 2) = Sheets("DS").Range("C" & row_number)
     Next
End Sub

Dies wiederholt im Grunde das, was wir in der vorherigen Lektion getan haben ...

Aber jetzt müssen wir unser Makro ändern, indem wir die folgenden Aktionen hinzufügen:

  • Bestimmen Sie die Wahl des Benutzers („JA“ oder „NEIN“);
  • Zählen Sie die Anzahl der „JA“- oder „NEIN“-Antworten im Datensatz, um die Größe des Arrays zu bestimmen (Redim);
  • Wir speichern nur die Zeilen aus dem Datensatz, die im Array die Antworten „JA“ oder „NEIN“ enthalten (das bedeutet, dass keine Daten aus der dritten Spalte gespeichert werden müssen).
  • Hier ist eine Beispiellösung:

    Sub actualize()
         Dim last_row As Integer, search_value As String, insert_row As Integer, value_yes_no As String, rows_number As Integer
         
         'Die letzte Zeile der Datenbank
         last_row = Sheets("DS").Range("A1").End(xlDown).Row
    
         'Suchwert (YES oder NO)
         If Sheets("RES").OptionButton_yes.Value = True Then
             search_value = "YES"
         Else
             search_value = "NO"
         End If
         
         'Anzahl der Antworten YES oder NO
         rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value)
         
         'Speichern eines Datensatzes in einem Array
         Dim array_db()
         ReDim array_db(rows_number - 1, 1)
    
         insert_row = 0
         
         For row_number = 2 To last_row
             value_yes_no = Sheets("DS").Range("C" & row_number)
             
             If value_yes_no = search_value Then
                 array_db(insert_row, 0) = Sheets("DS").Range("A" & row_number)
                 array_db(insert_row, 1) = Sheets("DS").Range("B" & row_number)
                 insert_row = insert_row + 1
             End If
         Next
    End Sub
    

    Die Suche nach Wahl des Benutzers wird zu Beginn des Vorgangs durch den folgenden Code bestimmt:

     'Suchwert (YES oder NO)
     If Sheets("RES").OptionButton_yes.Value = True Then
         search_value = "YES"
     Else
         search_value = "NO"
     End If
    

    Wir werden die CountIF-Funktion verwenden, um die Anzahl der „JA“- oder „NEIN“-Antworten zu ermitteln:

     'Anzahl der Antworten YES oder NO
     rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value)
    

    Die Größe des Arrays wurde an die Anzahl der JA- oder NEIN-Antworten angepasst und auf zwei Spalten reduziert:

    ReDim array_db(rows_number - 1, 1)
    

    Diese Daten werden nun im Array gespeichert, wenn die dritte Spalte mit der Auswahl des Benutzers übereinstimmt:

     'Einfügen einer Zahl in ein Array
     insert_row = 0
    
     'Datensatzverarbeitung
     For row_number = 2 To last_row
         'Spalten-C-Wert (YES oder NO)
         value_yes_no = Sheets("DS").Range("C" & row_number)
         
         'Wenn der Wert mit der Auswahl des Benutzers übereinstimmt, wird die Zeichenfolge im Array gespeichert
         If value_yes_no = search_value Then
             'Speichern des Werts in Spalte A
             array_db(insert_row, 0) = Sheets("DS").Range("A" & row_number)
             'Speichern des Werts in Spalte B
             array_db(insert_row, 1) = Sheets("DS").Range("B" & row_number)
             'Eine Zeile wurde gespeichert => die Einfügungsnummer im Array wird um 1 erhöht
             insert_row = insert_row + 1
         End If
     Next
    

    Unser Array enthält nur die Daten, die uns interessieren.

    Jetzt müssen Sie nur noch Folgendes tun:

  • Verarbeiten Sie jedes Element der Tabelle auf dem Arbeitsblatt „RES“ mit 2 Schleifen (gleiche Idee wie bei der Schachbrettübung);
  • Geben Sie die Gesamtzahl der Vorkommen auf diesem Blatt für jedes Jahr für jede Kundennummer für jede Zelle ein.
  • Hier ist eine Beispiellösung:

     'Anzahl der Antworten „YES“/“NO“
     For no_years = 2011 To 2026
         For no_client = 1 To 30
             counter = 0
             
             For i = 0 To UBound(array_db)
                 If Year(array_db(i, 0)) = no_years And array_db(i, 1) = no_client Then
                     counter = counter + 1
                 End If
             Next
             
             Cells(no_years - 2009, no_client + 1) = counter
         Next
     Next
    

    Problem mit Kommentaren gelöst, die es im Detail erklären:

     'Schleife für jede Zeile
     For no_years = 2011 To 2026
     
         'Schleife für jede Spalte
         For no_client = 1 To 30
             'Zähler zurückgesetzt
             counter = 0
             
             'Array-Verarbeitung
             For i = 0 To UBound(array_db)
                 'Überprüfen Sie, ob die Zeile in der Tabelle dem Jahr und der Kundennummer entspricht
                 If Year(array_db(i, 0)) = no_years And array_db(i, 1) = no_client Then
                     'Stimmen Jahr und Kundennummer überein, erhöht sich der Zähler um 1
                     counter = counter + 1
                 End If
             Next
             
             'Nach der Verarbeitung des Arrays wird das Ergebnis in die entsprechende Zelle eingetragen
             Cells(no_years - 2009, no_client + 1) = counter
         Next
     Next
    

    Und zum Schluss der Code für unser gesamtes Makro:

    Sub actualize()
         Dim last_row As Integer, search_value As String, insert_row As Integer, value_yes_no As String, rows_number As Integer, counter As Integer
         
         'Inhalt löschen
         Range("B2:AE17").ClearContents
         
         'Die letzte Zeile im Datensatz
         last_row = Sheets("DS").Range("A1").End(xlDown).Row
    
         'Suchwert (YES oder NO)
         If Sheets("RES").OptionButton_yes.Value = True Then
             search_value = "YES"
         Else
             search_value = "NO"
         End If
         
         'Anzahl der Antworten YES oder NO
         rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value)
         
         'Werte in einem Array speichern
         Dim array_db()
         ReDim array_db(rows_number - 1, 1)
    
         insert_row = 0
         
         For row_number = 2 To last_row
             value_yes_no = Sheets("DS").Range("C" & row_number)
             
             If value_yes_no = search_value Then
                 array_db(insert_row, 0) = Sheets("DS").Range("A" & row_number)
                 array_db(insert_row, 1) = Sheets("DS").Range("B" & row_number)
                 insert_row = insert_row + 1
             End If
         Next
         
         'Zählen der Antworten YES oder NO
         For no_years = 2011 To 2026
             For no_client = 1 To 30
                 counter = 0
                 
                 For i = 0 To UBound(array_db)
                     If Year(array_db(i, 0)) = no_years And array_db(i, 1) = no_client Then
                         counter = counter + 1
                     End If
                 Next
                 Cells(no_years - 2009, no_client + 1) = counter
             Next
         Next
    End Sub
    

    Hier können Sie die Beispieldatei Excel herunterladen: arrays_exercise_completed.xls