ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 7965|回复: 37

[求助] 用VBA数组或字典计算A列数字数字连续次数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-6-21 08:07 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
用VBA数组或字典计算A列数字数字连续次数
用VBA数组或字典计算A列数字数字连续次数.png

用VBA数组或字典计算A列数字数字连续次数.rar

6.58 KB, 下载次数: 32

TA的精华主题

TA的得分主题

发表于 2017-6-21 08:15 | 显示全部楼层
Sub cfz()
    Dim i&, Myr&, Arr
    Dim d, k, t
    Set d = CreateObject("Scripting.Dictionary")
    Myr = Sheet1.[a65536].End(xlUp).Row
    Arr = Sheet1.Range("a1:b" & Myr)
    For i = 1 To UBound(Arr)
        d(Arr(i, 1)) = d(Arr(i, 1)) + 1
    Next
    k = d.keys
    t = d.items
    [c1].Resize(d.Count, 1) = Application.Transpose(k)
    [d1].Resize(d.Count, 1) = Application.Transpose(t)
    Set d = Nothing
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-6-21 08:46 | 显示全部楼层
linyh1742595842 发表于 2017-6-21 08:15
Sub cfz()
    Dim i&, Myr&, Arr
    Dim d, k, t


果然高手了,这2条如何做


http://club.excelhome.net/thread-1353146-1-1.html

用VBA数组或字典把F列一万行填充颜色



http://club.excelhome.net/thread-1353152-1-1.html

用VBA数组或字典挑选相同

TA的精华主题

TA的得分主题

发表于 2017-6-21 08:52 | 显示全部楼层
二楼的算法有问题,这不是算连续的,是计算某个数字出现的次数,与是否连续无关

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-6-21 08:55 | 显示全部楼层
本帖最后由 laoau128 于 2017-6-21 08:58 编辑
lsdongjh 发表于 2017-6-21 08:52
二楼的算法有问题,这不是算连续的,是计算某个数字出现的次数,与是否连续无关

你说的对,他的方法确实有问题,你有何计算方法

TA的精华主题

TA的得分主题

发表于 2017-6-21 09:06 | 显示全部楼层
lsdongjh 发表于 2017-6-21 08:52
二楼的算法有问题,这不是算连续的,是计算某个数字出现的次数,与是否连续无关

请高手出招吧,没有看清楚要求,以为是计数出现的次数。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-6-21 09:31 | 显示全部楼层
linyh1742595842 发表于 2017-6-21 09:06
请高手出招吧,没有看清楚要求,以为是计数出现的次数。

你这个确实错了,

Sub 看这个()
    arr = [a1].CurrentRegion
    Set d = CreateObject("scripting.dictionary")
    k = 1
    For i = 2 To UBound(arr)
        If arr(i, 1) = arr(i - 1, 1) Then
            k = k + 1
        Else
            If d(arr(i - 1, 1)) < k Then d(arr(i - 1, 1)) = k
            k = 1
        End If
    Next
    If d(arr(i - 1, 1)) < k Then d(arr(i - 1, 1)) = k
    [c1].Resize(d.Count) = Application.Transpose(d.keys)
    [d1].Resize(d.Count) = Application.Transpose(d.items)
End Sub

TA的精华主题

TA的得分主题

发表于 2017-6-21 09:45 | 显示全部楼层
本帖最后由 awsa888 于 2017-6-21 09:51 编辑

仅供参考~~~~~~~~~~~~~~~~~~~~~
chongfu.png

TA的精华主题

TA的得分主题

发表于 2017-6-21 11:24 | 显示全部楼层

  1. Sub Test()
  2.     Dim lngI As Long
  3.     Dim lngRows As Long
  4.     Dim arr As Variant
  5.     Dim objDic As Object
  6.     Dim strKeys As Variant, strItems As Variant
  7.     Dim arrResult As Variant
  8.    
  9.     Set objDic = CreateObject("Scripting.Dictionary")
  10.    
  11.     lngRows = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
  12.     arr = Sheet1.Range("A1:A" & lngRows)
  13.    
  14.     For lngI = 1 To UBound(arr)
  15.         '记录行号
  16.         objDic(arr(lngI, 1)) = objDic(arr(lngI, 1)) & "," & lngI
  17.     Next
  18.    
  19.     strKeys = objDic.keys
  20.     strItems = objDic.items
  21.     lngRows = objDic.Count
  22.    
  23.     ReDim arrResult(1 To lngRows, 1 To 2)
  24.    
  25.     For lngI = 0 To lngRows - 1
  26.         arrResult(lngI + 1, 1) = strKeys(lngI)
  27.         arrResult(lngI + 1, 2) = CountContinuity(CStr(strItems(lngI)))
  28.     Next
  29.    
  30.    
  31.     Sheet1.Range("C1").Resize(lngRows, 2) = arrResult
  32. End Sub


  33. Function CountContinuity(strVal As String) As Long
  34.     Dim strT() As String
  35.     Dim lngMaxID As Long, lngI As Long
  36.     Dim strContinuity As String, strFind As String
  37.     Dim lngContinuity As Long
  38.    
  39.     strT = Split(strVal, ",")
  40.     lngMaxID = UBound(strT)
  41.    
  42.     If lngMaxID = 1 Then
  43.         CountContinuity = 1
  44.         Exit Function
  45.     End If
  46.    
  47.     For lngI = 2 To lngMaxID
  48.         strContinuity = strContinuity & Val(strT(lngI)) - Val(strT(lngI - 1))
  49.     Next
  50.    
  51.     lngContinuity = 1
  52.     For lngI = lngMaxID - 1 To 1 Step -1
  53.         strFind = String(lngI, "1")
  54.         If InStr(strContinuity, strFind) > 0 Then
  55.             lngContinuity = lngI + 1
  56.             Exit For
  57.         End If
  58.     Next
  59.    
  60.     CountContinuity = lngContinuity
  61.    
  62. End Function
复制代码


运行效果如下:
temp.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-6-21 12:30 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-26 14:35 , Processed in 0.037780 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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