Excel VBA用于计算和打印不同的值

Excel VBA用于计算和打印不同的值,vba,excel,Vba,Excel,我必须从一列中计算不同值的数量,并用不同值打印它,然后在另一张表中计数。我正在处理这段代码,但出于某种原因,它没有返回任何结果。谁能告诉我我在哪里错过了这首曲子 Dim rngData As Range Dim rngCell As Range Dim colWords As Collection Dim vntWord As Variant Dim Sh As Worksheet Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim Sh3 As Work

我必须从一列中计算不同值的数量,并用不同值打印它,然后在另一张表中计数。我正在处理这段代码,但出于某种原因,它没有返回任何结果。谁能告诉我我在哪里错过了这首曲子

Dim rngData As Range
Dim rngCell As Range
Dim colWords As Collection
Dim vntWord As Variant
Dim Sh As Worksheet
Dim Sh1 As Worksheet
Dim Sh2 As Worksheet
Dim Sh3 As Worksheet

On Error Resume Next

Set Sh1 = Worksheets("A")
Set Sh2 = Worksheets("B")
Set Sh3 = Worksheets("C")

Sh1.Range("A2:B650000").Delete

Set Sh = Worksheets("A")
Set r = Sh.AutoFilter.Range
r.AutoFilter Field:=24
r.AutoFilter Field:=24, Criteria1:="My Criteria"

Sh1.Range("A2:B650000").Delete

Set colWords = New Collection

Dim lRow1 As Long
lRow1 = <some number>

Set rngData = <desired range>
For Each rngCell In rngData.Cells
    colWords.Add colWords.Count + 1, rngCell.Value
    With Sh1.Cells(1 + colWords(rngCell.Value), 1)
        .Value = rngCell.Value
        .Offset(0, 1) = .Offset(0, 1) + 1
    End With
Next
Dim rngData作为范围
Dim rngCell As范围
模糊的词作为集合
Dim vntWord作为变体
将Sh设置为工作表
Dim Sh1作为工作表
Dim Sh2 As工作表
Dim Sh3 As工作表
出错时继续下一步
设置Sh1=工作表(“A”)
设置Sh2=工作表(“B”)
设置Sh3=工作表(“C”)
Sh1.范围(“A2:B650000”)。删除
设置Sh=工作表(“A”)
设置r=Sh.AutoFilter.Range
r、 自动筛选字段:=24
r、 自动筛选字段:=24,标准1:=“我的标准”
Sh1.范围(“A2:B650000”)。删除
Set colWords=新集合
变暗lRow1与长
lRow1=
设置rngData=
对于rngData.Cells中的每个rngCell
colWords.Add colWords.Count+1,rngCell.Value
带Sh1.Cells(1+colWords(rngCell.Value),1)
.Value=rngCell.Value
.偏移量(0,1)=.偏移量(0,1)+1
以
下一个
以上是我的全部代码。。我需要的结果很简单,计算一列中每个单元格的出现次数,然后用出现次数打印到另一张表中。谢谢

谢谢!
导航。

不是最漂亮或最理想的路线,但它会完成任务,我相信你能理解:

Option Explicit

Sub TestCount()

Dim rngCell As Range
Dim arrWords() As String, arrCounts() As Integer
Dim bExists As Boolean
Dim i As Integer, j As Integer

ReDim arrWords(0)

For Each rngCell In ThisWorkbook.Sheets("Sheet1").Range("A1:A20")
    bExists = False

    If rngCell <> "" Then
        For i = 0 To UBound(arrWords)
            If arrWords(i) = rngCell.Value Then
                bExists = True
                arrCounts(i) = arrCounts(i) + 1
            End If
        Next i

        If bExists = False Then
            ReDim Preserve arrWords(j)
            ReDim Preserve arrCounts(j)

            arrWords(j) = rngCell.Value
            arrCounts(j) = 1

            j = j + 1
        End If
    End If
Next

For i = LBound(arrWords) To UBound(arrWords)
    Debug.Print arrWords(i) & ", " & arrCounts(i)
Next i

End Sub
选项显式
子测试计数()
Dim rngCell As范围
Dim arrWords()作为字符串,arrCounts()作为整数
作为布尔的Dim bExists
尺寸i为整数,j为整数
重拨字(0)
对于本工作簿中的每个RNG单元格。工作表(“表1”)。范围(“A1:A20”)
bExists=False
如果为rngCell“”,则
对于i=0到UBound(arrWords)
如果arrWords(i)=rngCell.值,则
bExists=True
arrCounts(i)=arrCounts(i)+1
如果结束
接下来我
如果bExists=False,则
雷迪姆(j)
雷迪姆计数(j)
arrWords(j)=rngCell.值
arrCounts(j)=1
j=j+1
如果结束
如果结束
下一个
对于i=LBound(arrWords)到UBound(arrWords)
调试。打印arrWords(i)和“,”和arrCounts(i)
接下来我
端接头
这将循环通过“表1”上的A1:A20。如果单元格不是空的,它将检查数组中是否存在该单词。如果不是,则将其添加到数组中,计数为1。如果确实存在,则只需将计数加1即可。我希望这适合你的需要


另外,在浏览代码之后要记住一点:实际上,您不应该在错误恢复下一步时使用

使用dictionary对象非常简单实用。该逻辑类似于Kittoes answer,但dictionary对象速度更快、效率更高,您可以输出一个包含所有键和项的数组,这是您想要在这里执行的。我已将代码简化为从列a生成列表,但您会明白这一点

Sub UniqueReport()

Dim dict As Object
Set dict = CreateObject("scripting.dictionary")
Dim varray As Variant, element As Variant

varray = Range("A1:A10").Value

'Generate unique list and count
For Each element In varray
    If dict.exists(element) Then
        dict.Item(element) = dict.Item(element) + 1
    Else
        dict.Add element, 1
    End If
Next

'Paste report somewhere
Sheet2.Range("A1").Resize(dict.Count, 1).Value = _
    WorksheetFunction.Transpose(dict.keys)
Sheet2.Range("B1").Resize(dict.Count, 1).Value = _
    WorksheetFunction.Transpose(dict.items)

End Sub

工作原理:您只需将范围转储到一个变量数组中,快速循环,然后将每个变量添加到字典中。如果它存在,您只需获取与它们键(从1开始)相关的项,然后向其中添加一个。然后在最后,只需将唯一列表和计数拍打到您需要的任何位置。请注意,我为字典创建对象的方式允许任何人使用它-无需添加对您代码的引用。

请发布您的完整代码。您的代码有点奇怪。正如brettdj所说,发布您的完整代码并向我们解释您对代码的期望Hi brettdj和JMax-请查看完整代码…代码仍然存在许多问题;未声明的变量,未使用的其他变量。它看起来很像是从一个更大的片段中提取出来的。>>>“它没有返回任何结果。有人能告诉我我丢失了该片段的位置吗!”:当你在错误恢复时删除
,下一步会发生什么情况。我之所以选择阵列路线,是因为我觉得你可能会觉得更舒服。太棒了。我不是一个专业的程序员,但我使用过Python,并且了解字典。但是,我不知道它们存在于VBA中!请注意,脚本字典对象仅对Windows用户可用-您不能在Mac上使用它,很遗憾…:(如何选择整个列?只需更改为varray=Range(“A:A”)。值即可