为了练习使用数组,我们将创建我们自己的宏版本,用于逐步演示数组的速度优势......
这是本练习的起点(您将看到数据集已减少到 1000 行):
您可以在这里下载Excel示例文件:arrays_exercise.xls
练习目标:该过程应使用循环处理数据集中的数据,并计算每年和每个客户编号的“是”或“否”响应数量(“是”或“否”,取决于用户的选择)并输入该数量在工作表的指定单元格中。
完成以下宏,将“DS”工作表中的数据保存到数组中:
Sub actualize() Dim last_row As Integer '数据集的最后一行 '... '将一组数据保存在动态数组中 Dim array_db() '... End Sub
下面是一个示例解决方案:
Sub actualize() Dim last_row As Integer '数据库最后一行 last_row = Sheets("DS").Range("A1").End(xlDown).Row '将一组数据保存在动态数组中 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
这基本上重复了我们在上一课中所做的事情......
但现在我们需要通过添加以下操作来修改宏:
下面是一个示例解决方案:
Sub actualize() Dim last_row As Integer, search_value As String, insert_row As Integer, value_yes_no As String, rows_number As Integer '数据库最后一行 last_row = Sheets("DS").Range("A1").End(xlDown).Row '搜索值(YES 或 NO) If Sheets("RES").OptionButton_yes.Value = True Then search_value = "YES" Else search_value = "NO" End If '回复数 YES 或 NO rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value) '将数据集保存到数组 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
用户选择的搜索是在程序开始时通过以下代码确定的:
'搜索值(YES 或 NO) If Sheets("RES").OptionButton_yes.Value = True Then search_value = "YES" Else search_value = "NO" End If
我们将使用 CountIF 函数来确定“是”或“否”响应的数量:
'回复数 YES 或 NO rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value)
该数组已调整大小以适合“是”或“否”响应的数量,并减少为两列:
ReDim array_db(rows_number - 1, 1)
当第三列与用户的选择匹配时,该数据现在将存储在数组中:
'将数字插入数组 insert_row = 0 '数据集处理 For row_number = 2 To last_row '列 C 值(YES 或 NO) value_yes_no = Sheets("DS").Range("C" & row_number) '如果该值与用户的选择匹配,则该字符串将存储在数组中 If value_yes_no = search_value Then '将值保存到 A 列 array_db(insert_row, 0) = Sheets("DS").Range("A" & row_number) '将值保存到 B 列 array_db(insert_row, 1) = Sheets("DS").Range("B" & row_number) '已保存一行=>数组中的插入数加1 insert_row = insert_row + 1 End If Next
我们的数组仅包含我们感兴趣的数据。
剩下要做的就是:
下面是一个示例解决方案:
'回复数量“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
解决了问题并详细解释了评论:
'每行循环 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 '如果年份和客户编号匹配,则计数器加 1 counter = counter + 1 End If Next '处理完数组后,将结果输入到对应的单元格中 Cells(no_years - 2009, no_client + 1) = counter Next Next
最后,我们整个宏的代码:
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 '删除内容 Range("B2:AE17").ClearContents '数据集中的最后一行 last_row = Sheets("DS").Range("A1").End(xlDown).Row '搜索值(YES 或 NO) If Sheets("RES").OptionButton_yes.Value = True Then search_value = "YES" Else search_value = "NO" End If '回复数 YES 或 NO rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value) '将值保存在数组中 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 '计算答案 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 End Sub
您可以在这里下载Excel示例文件:arrays_exercise_completed.xls