Excel 对列中的唯一值进行计数并存储

Excel 对列中的唯一值进行计数并存储,excel,vba,Excel,Vba,想象一下,我有以下专栏: 2008 2008 2009 2010 2009 我想在VBA中构建一个代码,首先返回唯一值的总数,在本例中:3(2008、2009和2010),我还想将这些单个值存储在一个数组中(我认为这是最好的) 我尝试构建一个循环来检查最后一个单元格并比较结果,但显然这还不够…如果您的唯一数据位于a列(例如示例中的A1到A5),那么您可以使用带有字典的变体数组来提取唯一性 下面的代码 使用列a中的5个值创建变量数组X 测试每个项目以查看它是否存在于字典对象objDic中,如果

想象一下,我有以下专栏:

2008
2008
2009
2010
2009
我想在VBA中构建一个代码,首先返回唯一值的总数,在本例中:3(2008、2009和2010),我还想将这些单个值存储在一个数组中(我认为这是最好的)


我尝试构建一个循环来检查最后一个单元格并比较结果,但显然这还不够…

如果您的唯一数据位于a列(例如示例中的A1到A5),那么您可以使用带有字典的变体数组来提取唯一性

下面的代码

  • 使用列a中的5个值创建变量数组
    X
  • 测试每个项目以查看它是否存在于字典对象
    objDic
    中,如果不存在,则将其添加到字典中,并添加到第二个变量数组
    Y
  • 最后一个变量数组
    Y
    转储到B1,并尽可能扩展(该数组在末尾包含uniques加空格,以代替重复,必要时可以调整大小)
更新了:添加了忽略空白的测试*)

版本2 根据使用
连接


如果您的唯一数据位于A列(示例中是A1到A5),那么您可以使用带有字典的变量数组来提取唯一性

下面的代码

  • 使用列a中的5个值创建变量数组
    X
  • 测试每个项目以查看它是否存在于字典对象
    objDic
    中,如果不存在,则将其添加到字典中,并添加到第二个变量数组
    Y
  • 最后一个变量数组
    Y
    转储到B1,并尽可能扩展(该数组在末尾包含uniques加空格,以代替重复,必要时可以调整大小)
更新了:添加了忽略空白的测试*)

版本2 根据使用
连接


查看下面的函数

Function UniqueItem(InputRange As Range, count As Long) As Variant
    Dim cl As Range, cUnique As New Collection, cValue As Variant
        Application.Volatile
        On Error Resume Next
        For Each cl In InputRange
            If cl.Formula <> "" Then
            cUnique.Add cl.Value, CStr(cl.Value)
            End If
        Next cl
        UniqueItem = ""
        If count = 1 Then
        UniqueItem = cUnique.count
        ElseIf count = 0 Then
        For i = 1 To cUnique.count
            If UniqueItem = "" Then
            UniqueItem = UniqueItem & cUnique(i)
            ElseIf UniqueItem <> "" Then
            UniqueItem = UniqueItem & ", " & cUnique(i)
            End If
        Next
        End If
        On Error GoTo 0
End Function
单元格中的以下公式将返回选定范围内唯一项的计数

=UniqueItem(A1:A7,1)
如何使用此功能

  • 打开excel文件

  • 按Alt+F11

  • 创建一个新模块并将代码粘贴到其中

  • 返回excel文件并选择想要得到结果的单元格

  • 将公式键入为
    =UniqueItem(A1:A7,0)
    ,以返回所选范围内的唯一项。(您可以选择任何范围)

  • 将公式键入为
    =UniqueItem(A1:A7,1)
    ,以返回所选范围内唯一项目的数量。(您可以选择任何范围)


  • 查看下面的函数

    Function UniqueItem(InputRange As Range, count As Long) As Variant
        Dim cl As Range, cUnique As New Collection, cValue As Variant
            Application.Volatile
            On Error Resume Next
            For Each cl In InputRange
                If cl.Formula <> "" Then
                cUnique.Add cl.Value, CStr(cl.Value)
                End If
            Next cl
            UniqueItem = ""
            If count = 1 Then
            UniqueItem = cUnique.count
            ElseIf count = 0 Then
            For i = 1 To cUnique.count
                If UniqueItem = "" Then
                UniqueItem = UniqueItem & cUnique(i)
                ElseIf UniqueItem <> "" Then
                UniqueItem = UniqueItem & ", " & cUnique(i)
                End If
            Next
            End If
            On Error GoTo 0
    End Function
    
    单元格中的以下公式将返回选定范围内唯一项的计数

    =UniqueItem(A1:A7,1)
    
    如何使用此功能

  • 打开excel文件

  • 按Alt+F11

  • 创建一个新模块并将代码粘贴到其中

  • 返回excel文件并选择想要得到结果的单元格

  • 将公式键入为
    =UniqueItem(A1:A7,0)
    ,以返回所选范围内的唯一项。(您可以选择任何范围)

  • 将公式键入为
    =UniqueItem(A1:A7,1)
    ,以返回所选范围内唯一项目的数量。(您可以选择任何范围)



  • 不确定,但听起来更像是一个家庭作业问题。你想要一个算法,还是想有人为此提供VBA代码?我已经有点过时了,这是一个更大的项目,我有一个非常具体的问题,我尝试构建一个循环来检查lst单元格,如果它不同,它将加成一个计数器并将该值保存在一个新变量中,问题是,按照我自己的例子,当它到达最后一个2009年并检查之前的值(2010年)时,它会继续“递增”我的计数器,尽管之前已经有一个2009年的值。。。我对算法很满意。我们不能说问题出在算法还是编码上。这是我在Excel公式中用来解决计数问题的方法:
    =SUMPRODUCT((F7:F17“”)/COUNTIF(F7:F17;F7:F17&“”)
    这给了我唯一值的总数,问题是,我想把它作为VBA代码。。。我希望代码也能单独记录这些值(这样我以后可以在图表上使用它们)!不确定,但听起来更像是一个家庭作业问题。你想要一个算法,还是想有人为此提供VBA代码?我已经有点过时了,这是一个更大的项目,我有一个非常具体的问题,我尝试构建一个循环来检查lst单元格,如果它不同,它将加成一个计数器并将该值保存在一个新变量中,问题是,按照我自己的例子,当它到达最后一个2009年并检查之前的值(2010年)时,它会继续“递增”我的计数器,尽管之前已经有一个2009年的值。。。我对算法很满意。我们不能说问题出在算法还是编码上。这是我在Excel公式中用来解决计数问题的方法:
    =SUMPRODUCT((F7:F17“”)/COUNTIF(F7:F17;F7:F17&“”)
    这给了我唯一值的总数,问题是,我想把它作为VBA代码。。。我希望代码也能单独记录这些值(这样我以后可以在图表上使用它们)!干杯,伙计,我会测试的。@JoaoFerreira没问题,我添加了一个测试来排除
    上面的空白,如果Len(X(lngRow,1))>0,那么
    干杯DaveI对vba还是新手,对字典一无所知。。。有没有办法将这些值保存到一个数组中,而不是放在另一列中?这些值存储在变量数组
    Y
    中,您可以在代码中使用它们。你想要一个单字符串数组intead吗?我仍在试图理解这背后的所有逻辑,但你帮了我很大的忙。我将使用Y数组,看看它会把我带到哪里。干杯,伙计,我会测试它。@JoaoFerreira没问题,我在exclu中添加了一个测试
    =UniqueItem(A1:A7,1)