Excel精英培训网

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

[已解决]用VBA把字典改写数组 计算多列最大连续

[复制链接]
发表于 2017-6-4 22:25 | 显示全部楼层 |阅读模式
本帖最后由 laoau138 于 2017-6-7 21:28 编辑

Sub 用VBA数组计算多列最大连续次数2()
    Dim d As Object, arA, arB, i%, x%, s$, s1$
    Set d = CreateObject("Scripting.Dictionary")
    arA = [f25:f29]
    arB = [g1:i22]
    For x = 1 To UBound(arB, 2)
        For i = 1 To UBound(arA)
            d(arA(i, 1)) = arA(i, 1) & 1
        Next
        For i = 2 To UBound(arB)
            s = Left(arB(i - 1, x), 1) & Mid(arB(i - 1, x), 3, 1)
            s1 = Left(arB(i, x), 1) & Mid(arB(i, x), 3, 1)
            If d.Exists(s1) And s = s1 Then d(s1) = s & Val(Mid(d(s1), 3, Len(d(s)))) + 1
        Next
        Cells(25, x + 6).Resize(d.Count, 1) = Application.Transpose(d.Items)
        d.RemoveAll
    Next
End Sub


'用VBA把字典改写数组   计算多列最大连续


最佳答案
2017-6-7 13:46
你原来的代码是错的。
  1. Sub aaa()
  2. Dim arr, brr, i&, j&, k&, l&, n&, s$
  3. arr = [g1].CurrentRegion
  4. brr = [f25:f29]
  5. ReDim Preserve brr(1 To 5, 1 To UBound(arr, 2) + 1)
  6. For j = 1 To UBound(arr, 2)
  7.   For i = 1 To UBound(arr) - 1
  8.     For k = 1 To UBound(brr)
  9.       s = Left(arr(i, j), 1) & Mid(arr(i, j), 3, 1)
  10.       If brr(k, 1) = s Then
  11.         n = 1
  12.         For l = i + 1 To UBound(arr)
  13.           If s = Left(arr(l, j), 1) & Mid(arr(l, j), 3, 1) Then n = n + 1 Else Exit For
  14.         Next l
  15.         If brr(k, j + 1) < n Then brr(k, j + 1) = n
  16.         Exit For
  17.       End If
  18.     Next k
  19.     i = l - 1
  20.   Next i
  21. Next j
  22. For i = 1 To 5
  23.   For j = 2 To UBound(brr, 2)
  24.     brr(i, j) = brr(i, 1) & brr(i, j)
  25.   Next j
  26. Next i
  27. [f25].Resize(5, UBound(brr, 2)) = brr
  28. End Sub
复制代码

用VBA把字典改写数组 计算多列最大连续.rar

8.88 KB, 下载次数: 7

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2017-6-4 22:36 | 显示全部楼层
回复

使用道具 举报

发表于 2017-6-7 13:46 | 显示全部楼层    本楼为最佳答案   
你原来的代码是错的。
  1. Sub aaa()
  2. Dim arr, brr, i&, j&, k&, l&, n&, s$
  3. arr = [g1].CurrentRegion
  4. brr = [f25:f29]
  5. ReDim Preserve brr(1 To 5, 1 To UBound(arr, 2) + 1)
  6. For j = 1 To UBound(arr, 2)
  7.   For i = 1 To UBound(arr) - 1
  8.     For k = 1 To UBound(brr)
  9.       s = Left(arr(i, j), 1) & Mid(arr(i, j), 3, 1)
  10.       If brr(k, 1) = s Then
  11.         n = 1
  12.         For l = i + 1 To UBound(arr)
  13.           If s = Left(arr(l, j), 1) & Mid(arr(l, j), 3, 1) Then n = n + 1 Else Exit For
  14.         Next l
  15.         If brr(k, j + 1) < n Then brr(k, j + 1) = n
  16.         Exit For
  17.       End If
  18.     Next k
  19.     i = l - 1
  20.   Next i
  21. Next j
  22. For i = 1 To 5
  23.   For j = 2 To UBound(brr, 2)
  24.     brr(i, j) = brr(i, 1) & brr(i, j)
  25.   Next j
  26. Next i
  27. [f25].Resize(5, UBound(brr, 2)) = brr
  28. End Sub
复制代码

评分

参与人数 1 +9 收起 理由
laoau138 + 9 来学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2017-6-7 21:27 | 显示全部楼层
大灰狼1976 发表于 2017-6-7 13:46
你原来的代码是错的。

字典和数组2个答案都一样,请问错在哪里了

字典和数组2个答案都一样,请问错在哪里了.rar

11.97 KB, 下载次数: 2

回复

使用道具 举报

发表于 2017-6-8 09:34 | 显示全部楼层
你用我附件的数据做下测试便知

test.zip

8.71 KB, 下载次数: 9

评分

参与人数 1 +9 收起 理由
laoau138 + 9 来学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2017-6-8 11:59 | 显示全部楼层
大灰狼1976 发表于 2017-6-8 09:34
你用我附件的数据做下测试便知

确实有错了,你竟然能发现
回复

使用道具 举报

发表于 2017-6-8 12:31 | 显示全部楼层
laoau138 发表于 2017-6-8 11:59
确实有错了,你竟然能发现

因为我原来的思路竟然跟你的代码惊人的相似,在我意识到错了以后顺便看了一下你的代码,发现存在同样问题,最后进行了验证。
回复

使用道具 举报

 楼主| 发表于 2017-6-8 14:10 | 显示全部楼层
大灰狼1976 发表于 2017-6-8 12:31
因为我原来的思路竟然跟你的代码惊人的相似,在我意识到错了以后顺便看了一下你的代码,发现存在同样问题 ...



VBA比较A列唯一值 掉   改写不用goto语句

http://www.excelpx.com/thread-430934-1-1.html

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 08:49 , Processed in 0.491163 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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