Excel精英培训网

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

[已解决]请教论坛老师,vba查找指定区域内,数值类型的个数

[复制链接]
发表于 2014-12-28 17:53 | 显示全部楼层 |阅读模式
本帖最后由 yslvictor 于 2014-12-29 20:32 编辑

解释:
在AA12:AJ111区域内的数字都是3个字符的文本数字,这些数字包括如下3种类型:
1、三个字符都相同,称作为AAA类型,如:000、  111、  222 ……;
2、只有两个字符相同,称作为AAB类型,如:001、  010、  100 ……;
3、三个字符都不相同,称作为ABC类型,如:012、  102、  210 ……。

1.jpg

查找区域内数值类型的个数.rar (11.97 KB, 下载次数: 9)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-12-28 19:05 | 显示全部楼层
  1. Sub demo()
  2.     Dim arr(1 To 2), i%, j%, Ar(1 To 3), brr
  3.     For i = 1 To 2
  4.         Set arr(i) = CreateObject("scripting.dictionary")
  5.     Next
  6.     For i = 0 To 9
  7.         For j = 0 To 9
  8.             If i = j Then
  9.                 arr(1)(i & i & i) = ""
  10.             Else
  11.                 arr(2)(i & i & j) = ""
  12.                 arr(2)(i & j & i) = ""
  13.                 arr(2)(j & i & i) = ""
  14.             End If
  15.         Next
  16.     Next
  17.     brr = Sheet1.Range("aa12").CurrentRegion.Value
  18.     For i = 1 To UBound(brr)
  19.         For j = 1 To UBound(brr, 2)
  20.             If Len(brr(i, j)) Then
  21.                 If arr(1).exists(brr(i, j)) Then
  22.                     Ar(1) = Ar(1) + 1
  23.                 ElseIf arr(2).exists(brr(i, j)) Then
  24.                     Ar(2) = Ar(2) + 1
  25.                 Else
  26.                     Ar(3) = Ar(3) + 1
  27.                 End If
  28.             End If
  29.         Next
  30.     Next
  31.     Sheet1.Range("B7").Resize(3, 1) = Application.Transpose(Ar)
  32. End Sub
复制代码
回复

使用道具 举报

发表于 2014-12-29 10:38 | 显示全部楼层
  1. Sub test()
  2.    arr = Range("aa12").CurrentRegion
  3.    Set d = CreateObject("scripting.dictionary")
  4.    Dim s(1 To 3)
  5.    For Each x In arr
  6.       If Len(x) = 3 Then
  7.         For k = 1 To Len(x)
  8.           d(Mid(x, k, 1)) = ""
  9.         Next
  10.         s(d.Count) = s(d.Count) + 1
  11.         d.RemoveAll
  12.       End If
  13.   Next
  14.   [b7].Resize(3, 1) = Application.Transpose(s)
  15. End Sub
复制代码
回复

使用道具 举报

发表于 2014-12-29 10:40 | 显示全部楼层
2楼搞得太复杂了。。。。。请看附件。

查找区域内数值类型的个数.rar

15.25 KB, 下载次数: 6

回复

使用道具 举报

发表于 2014-12-29 10:59 | 显示全部楼层
或者不用字典也可以
  1. Sub test()
  2.    arr = Range("aa12").CurrentRegion
  3.    Dim s(1 To 3, 1 To 1)
  4.    For Each x In arr
  5.       If Len(x) = 3 Then
  6.         a = Mid(x, 1, 1): b = Mid(x, 2, 1): c = Mid(x, 3, 1)
  7.         If a = b And a = c Then
  8.             k = 1
  9.         ElseIf a <> b And a <> c And b <> c Then
  10.             k = 3
  11.         Else
  12.             k = 2
  13.         End If
  14.         s(k, 1) = s(k, 1) + 1
  15.     End If
  16.   Next
  17.   [b7].Resize(3, 1) = s
  18. End Sub
复制代码
回复

使用道具 举报

发表于 2014-12-29 11:02 | 显示全部楼层
本帖最后由 ghostjiao 于 2014-12-29 11:08 编辑

。。。。。。
回复

使用道具 举报

发表于 2014-12-29 11:30 | 显示全部楼层
  1. Sub Macro1()
  2. Dim arr, w(9), n(1 To 3), i&, j%, k%
  3. arr = Range("aa12").CurrentRegion
  4. For i = 1 To UBound(arr)
  5.     For j = 1 To UBound(arr, 2)
  6.         z = arr(i, j)
  7.         If z = "" Then Exit For
  8.         For k = 1 To 3
  9.             s = Val(Mid(z, k, 1))
  10.             w(s) = s
  11.         Next
  12.         For k = 1 To 3
  13.             If Len(Join(w, "")) = k Then n(k) = n(k) + 1
  14.         Next
  15.         Erase w
  16.     Next
  17. Next
  18. [c7:c9] = Application.Transpose(n)
  19. End Sub
复制代码
回复

使用道具 举报

发表于 2014-12-29 12:04 | 显示全部楼层
学习了几位的代码,
回复

使用道具 举报

发表于 2014-12-29 12:31 | 显示全部楼层
3楼字典用的很经典,小鬼头做的略显繁复。不用字典也可用层层扒皮办法,类似5楼代码:
  1. Sub t()
  2.     Dim arr, ar, r, brr(1 To 3)
  3.     arr = [aa12].CurrentRegion
  4.     For Each r In arr
  5.         If Len(r) Then
  6.             ar = Array(Mid(r, 1, 1), Mid(r, 2, 1), Mid(r, 3, 1))
  7.             If ar(0) = ar(1) Then
  8.                 If ar(1) = ar(2) Then
  9.                     brr(1) = brr(1) + 1
  10.                 Else
  11.                     brr(2) = brr(2) + 1
  12.                 End If
  13.             Else
  14.                 If ar(0) = ar(2) Or ar(1) = ar(2) Then
  15.                     brr(2) = brr(2) + 1
  16.                 Else
  17.                     brr(3) = brr(3) + 1
  18.                 End If
  19.             End If
  20.         End If
  21.     Next
  22.     [c7].Resize(3) = Application.Transpose(brr)
  23. End Sub
复制代码
回复

使用道具 举报

发表于 2014-12-29 13:17 | 显示全部楼层    本楼为最佳答案   
  1. Sub test()
  2.    arr = Range("aa12").CurrentRegion
  3.    Dim s(1 To 3, 1 To 1)
  4.    For Each x In arr
  5.       If Len(x) = 3 Then
  6.         k = 3
  7.         a = Mid(x, 1, 1): b = Mid(x, 2, 1): c = Mid(x, 3, 1)
  8.         If a = b Then k = k - 1
  9.         If a = c Then k = k - 1
  10.         If c = b Then k = k - 1
  11.         If k = 0 Then k = 1
  12.         s(k, 1) = s(k, 1) + 1
  13.     End If
  14.   Next
  15.   [b7].Resize(3, 1) = s
  16. End Sub
复制代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 00:59 , Processed in 0.294312 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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