arrays - VBA Excel 计算特定值

标签 arrays excel vba dictionary

我正在尝试编写一个程序,该程序将循环遍历特定列的单元格(由用户分配),在这些单元格中查找新值并计算找到特定值的次数。我现在遇到的主要问题是这是硬编码的,如下所示:

Function findValues() As Long
For iRow = 2 To g_totalRow
    If (ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text = "") Then
        nullInt = nullInt + 1
    ElseIf (someValue1 = "" Or someValue1 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text) Then
        someValue1 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text
        someInt1 = someInt1 + 1
    ElseIf (someValue2 = "" Or someValue2 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text) Then
        someValue2 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text
        someInt2 = someInt2 + 1
    ElseIf (someValue3 = "" Or someValue3 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text) Then
        someValue3 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text
        someInt3 = someInt3 + 1
    ElseIf (someValue4 = "" Or someValue4 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text) Then
        someValue4 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text
        someInt4 = someInt4 + 1
    ElseIf (someValue5 = "" Or someValue5 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text) Then
        someValue5 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text
        someInt5 = someInt5 + 1
    ElseIf (someValue6 = "" Or someValue6 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text) Then
        someValue6 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text
        someInt6 = someInt6 + 1
    ElseIf (someValue7 = "" Or someValue7 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text) Then
        someValue7 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text
        someInt7 = someInt7 + 1
    ElseIf (someValue8 = "" Or someValue8 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text) Then
        someValue8 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text
        someInt8 = someInt8 + 1
    ElseIf (someValue9 = "" Or someValue9 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text) Then
        someValue9 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text
        someInt9 = someInt9 + 1
    ElseIf (someValue10 = "" Or someValue10 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text) Then
        someValue10 = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text
        someInt10 = someInt10 + 1
    End If
Next iRow
End Function

这里,如果 ActiveCell 为空,则 nullInt 将递增,如果 ActiveCell 有某个值,则它将查找哪个变量具有相同的值,或者 ActiveCell 值将分配给其中一个变量。我严格出于测试目的创建了十个变量,但我需要最多增加一百个。我想知道是否有一种方法可以快速完成这个任务。我能想到的唯一方法是创建一个 String 数组和一个 Int 数组并以这种方式存储值。但是我不确定这是否是完成此任务的最佳方法。

编辑 这部分专门针对字典。假设有一个标题为“State”的特定列。其中包含北美 50 个州。其中一些状态是重复的,该列中总共有 800 个值。我如何跟踪德克萨斯州被袭击的次数(例如)?

谢谢,

杰西·斯莫瑟蒙

最佳答案

您应该能够使用字典来完成此操作(请参阅 Does VBA have Dictionary Structure? )

此代码尚未经过测试,但应该可以让您开始。

Function findValues() As Scripting.Dictionary
Dim cellValue
Dim dict As New Scripting.Dictionary

For iRow = 2 To g_totalRow

    cellValue = ActiveWorkbook.Sheets(sheetName).Cells(iRow, iCol).Text
    If dict.Exists(cellValue) Then
        dict.Item(cellValue) = dict.Item(cellValue) + 1
    Else
        dict.Item(cellValue) = 1
    End If
Next iRow

Set findValues = dict

End Function


Sub displayValues(dict As Scripting.Dictionary)
    Dim i
    Dim value
    Dim valueCount

    For i = 1 To dict.count
        valueCount = dict.Items(i)
        value = dict.Keys(i)

        ActiveWorkbook.Sheets(sheetName).Cells(i, 3).Text = value
        ActiveWorkbook.Sheets(sheetName).Cells(i, 4).Text = valueCount
    Next i

End Sub

Sub RunAndDisplay()
    Dim dict

    Set dict = findValues

    displayValues dict

End Sub

关于arrays - VBA Excel 计算特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5545203/

相关文章:

php - 将元素添加到数组的最后一个元素

java - 带有数组的实例变量

arrays - 为什么会出现 "Not an ARRAY reference"错误?

vba - 从 Excel 电子表格中提取 VBA

excel - 使用 Power Query 按特定顺序排序

vba - 如何绕过 VBA 批量替换功能的 255 个字符限制?

c - 不会终止的程序

excel - ForEach 循环对象需要错误

excel - 如果是错误函数

excel - 在 VBA 中使用 XLDOWN