Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1658|回复: 10

[已解决]VBA函数来进行数字归类,为什么运算没有结果。

[复制链接]
发表于 2022-6-1 22:03 | 显示全部楼层 |阅读模式
本帖最后由 yearabc 于 2022-6-1 22:14 编辑

我想把区域内数字按一定规律归类,VBA函数设计好了,也看见在运算,怎么就没有结果呢?


Sub aa()
    Set d = CreateObject("Scripting.Dictionary")
    ar = [N3:S6]: ReDim br(9)
    For j = 1 To UBound(ar, 2)
        For i = 1 To UBound(ar)
            For x = 0 To 9
                If InStr(ar(i, j), x) Then d(x) = d(x) + 1
            Next
        Next
        On Error Resume Next
        For y = 0 To 9
            br(y) = IIf(d(y) > br(y), d(y), br(y))
        Next
        d.RemoveAll
    Next
    For i = 11 To 14
        For x = 0 To 9
            If br(x) = Cells(i, 14) Then s = s & x
        Next
        Cells(i, 15) = s: s = ""
    Next
    Call zz
End Sub


Sub zz()
    Set d = CreateObject("Scripting.Dictionary")
    ar = [N7:S10]: ReDim br(9)
    For j = 1 To UBound(ar, 2)
        For i = 1 To UBound(ar)
            For x = 0 To 9
                If InStr(ar(i, j), x) Then d(x) = d(x) + 1
            Next
        Next
        On Error Resume Next
        For y = 0 To 9
            br(y) = IIf(d(y) > br(y), d(y), br(y))
        Next
        d.RemoveAll
    Next
    For i = 11 To 14
        For x = 0 To 9
            If br(x) = Cells(i, 14) Then s = s & x
        Next
        Cells(i, 18) = s: s = ""
    Next

End Sub

宏aa目的是                N3:S6中的数字在每行出现1次的归类在O11,出现2次的放在O12,出现3次的放在O13,出现4次的放在O14
宏zz目的是                N7:S10中的数字在每行出现1次的归类在R11,出现2次的放在R12,出现3次的放在R13,出现4次的放在R14
最佳答案
2022-6-8 23:14
本帖最后由 hasyh2008 于 2022-6-9 09:20 编辑

Sub 统计()
    Dim Arr(), Brr, Crr(1 To 4, 1 To 1), X%, Y%, K%
    Dim Str$
    Dim D
    Set D = CreateObject("scripting.dictionary")
    With Sheet1
        Arr = .Range("N3:S6")
        For X = 1 To UBound(Arr)
            For Y = 1 To UBound(Arr, 2)
                For K = 0 To 9
                    If InStr(Arr(X, Y), K) Then D(K) = D(K) + 1
                Next K
            Next Y
        Next X
        Arr = Application.Transpose(Array(D.keys, D.items))
        For X = 1 To UBound(Arr)
            Select Case Arr(X, 2)
                Case Is = 1
                    Crr(1, 1) = Crr(1, 1) & Arr(X, 1) & ","
                Case Is = 2
                    Crr(2, 1) = Crr(2, 1) & Arr(X, 1) & ","
                Case Is = 3
                    Crr(3, 1) = Crr(3, 1) & Arr(X, 1) & ","
                Case Is = 4
                    Crr(4, 1) = Crr(4, 1) & Arr(X, 1) & ","
            End Select
        Next X
        .Range("O11").Resize(4, 1) = ""
        .Range("O11").Resize(4, 1) = Crr
    End With
End Sub

宏处理数字.zip

27.45 KB, 下载次数: 14

发表于 2022-6-2 00:56 | 显示全部楼层
本帖最后由 eennoo 于 2022-6-2 01:03 编辑

  1. Sub aa()
  2. ReDim br(9)
  3. For Each Rng In [N3:S6]

  4.     For n = 0 To 9
  5.         If InStr(Rng, n) > 0 Then
  6.         br(n) = br(n) + (Len(Rng) - Len(Replace(Rng, n, "")))
  7.         End If
  8.     Next

  9. Next

  10.     For i = 11 To 14
  11.         For x = 0 To 9
  12.             If Cells(i, "n") = CStr(br(x)) Then
  13.                 s = s & x
  14.             End If
  15.         Next
  16.         Cells(i, 15) = s: s = ""
  17.         s = ""
  18.         
  19.         Next
  20. End Sub

复制代码

回复

使用道具 举报

 楼主| 发表于 2022-6-4 11:04 | 显示全部楼层

谢谢,结果不是我需要的。所有分类都在O14里面了。
回复

使用道具 举报

 楼主| 发表于 2022-6-8 21:42 | 显示全部楼层
我案例表格中的函数和公式复制在另外的电子表格中,是可以运行的,不知道原因。
我的表达有些不清楚,应该是统计每一列中数字的出现次数,取最大次数放在O和R中标注的次数中。
回复

使用道具 举报

发表于 2022-6-8 23:14 | 显示全部楼层    本楼为最佳答案   
本帖最后由 hasyh2008 于 2022-6-9 09:20 编辑

Sub 统计()
    Dim Arr(), Brr, Crr(1 To 4, 1 To 1), X%, Y%, K%
    Dim Str$
    Dim D
    Set D = CreateObject("scripting.dictionary")
    With Sheet1
        Arr = .Range("N3:S6")
        For X = 1 To UBound(Arr)
            For Y = 1 To UBound(Arr, 2)
                For K = 0 To 9
                    If InStr(Arr(X, Y), K) Then D(K) = D(K) + 1
                Next K
            Next Y
        Next X
        Arr = Application.Transpose(Array(D.keys, D.items))
        For X = 1 To UBound(Arr)
            Select Case Arr(X, 2)
                Case Is = 1
                    Crr(1, 1) = Crr(1, 1) & Arr(X, 1) & ","
                Case Is = 2
                    Crr(2, 1) = Crr(2, 1) & Arr(X, 1) & ","
                Case Is = 3
                    Crr(3, 1) = Crr(3, 1) & Arr(X, 1) & ","
                Case Is = 4
                    Crr(4, 1) = Crr(4, 1) & Arr(X, 1) & ","
            End Select
        Next X
        .Range("O11").Resize(4, 1) = ""
        .Range("O11").Resize(4, 1) = Crr
    End With
End Sub

宏处理数字.rar

31.11 KB, 下载次数: 8

回复

使用道具 举报

发表于 2022-6-8 23:41 | 显示全部楼层
本帖最后由 hasyh2008 于 2022-6-9 00:21 编辑

比我的方法好,学习了!
回复

使用道具 举报

发表于 2022-6-9 00:47 | 显示全部楼层
运算没结果的原因是N11:N15要改为数值,不能为文本格式。
好像多了句d.RemoveAll
回复

使用道具 举报

 楼主| 发表于 2022-6-9 23:03 | 显示全部楼层
hasyh2008 发表于 2022-6-8 23:14
Sub 统计()
    Dim Arr(), Brr, Crr(1 To 4, 1 To 1), X%, Y%, K%
    Dim Str$

谢谢,非常不错。我越来越理解了。实践才能提高
回复

使用道具 举报

发表于 2022-6-10 06:25 | 显示全部楼层
原代码写的非常好,水平非常高,思路新颖,正在学习消化。
回复

使用道具 举报

 楼主| 发表于 2022-6-11 09:49 | 显示全部楼层
hasyh2008 发表于 2022-6-9 00:47
运算没结果的原因是N11:N15要改为数值,不能为文本格式。
好像多了句d.RemoveAll

改为数值和常规,均不行,运算结果不显示。换一个电子表格就可以,真的十分不解。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-4 22:30 , Processed in 0.320706 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表