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