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:
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:
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