Excel精英培训网

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

[已解决]求代码

[复制链接]
发表于 2015-3-1 20:01 | 显示全部楼层 |阅读模式
本帖最后由 mmc998 于 2015-3-2 20:05 编辑

Book三码.rar (21.61 KB, 下载次数: 26)
发表于 2015-3-1 20:16 | 显示全部楼层
建议楼主带个简单的说明,具体要个什么效果
回复

使用道具 举报

 楼主| 发表于 2015-3-1 20:19 | 显示全部楼层
gdpgdp317 发表于 2015-3-1 20:16
建议楼主带个简单的说明,具体要个什么效果

把里面的 公式处理的结果,用vba来处理

点评

vba版很少有精通公式的,特别是数组公式  发表于 2015-3-2 06:34
回复

使用道具 举报

 楼主| 发表于 2015-3-2 07:51 | 显示全部楼层
当a列数据与行2数据相同时,就添0,
回复

使用道具 举报

发表于 2015-3-2 10:02 | 显示全部楼层
  1. Function Paixu(xstr)       '把任意数据型字符按各位数从小到大排序
  2.     Dim w(9)
  3.     For i = 1 To Len(xstr)
  4.         a = Val(Mid(xstr, i, 1))
  5.         w(a) = a
  6.     Next
  7.     Paixu = "'" & Join(w, "")
  8. End Function

  9. Sub tt()
  10.     r = Cells(Rows.Count, 1).End(xlUp).Row
  11.     c = Cells(2, Columns.Count).End(xlToLeft).Column
  12.     arr = [a1].Resize(r, c)
  13.     Set d = CreateObject("scripting.dictionary")
  14.     For i = 3 To c     '各列
  15.         x = Paixu(arr(2, i))        '各数内排序
  16.         d(x) = d(x) & "," & i      '得出列号,入字典
  17.         arr(2, i) = "'" & arr(2, i)
  18.     Next
  19.     For i = 4 To r       '各行
  20.         n = 0
  21.         x = Paixu(arr(i, 1))         '首数内排序
  22.         arr(i, 1) = "'" & arr(i, 1)
  23.         If Not d.exists(x) Then         '如果列中没有
  24.             For j = 3 To c: arr(i, j) = j - 1: Next         '从1开始到末列顺序填
  25.         Else          '如果第2行某列数与首数相同(排序过后)
  26.             xrr = Split(d(x), ",")          '找出各列
  27.             For j = 1 To UBound(xrr)
  28.                 xc = Val(xrr(j))
  29.                 arr(i, xc) = "P"        '找出各列并加以标记
  30.             Next
  31.             For j = 3 To c          '对于各列
  32.                 n = n + 1   '顺序+1
  33.                 If arr(i, j) = "P" Then n = 0          '如果已作标记,则令为0
  34.                 arr(i, j) = n
  35.             Next
  36.         End If
  37.     Next
  38.     [a1].Resize(r, c) = arr       '显示结果
  39. End Sub
复制代码
回复

使用道具 举报

发表于 2015-3-2 10:05 | 显示全部楼层    本楼为最佳答案   
请看附件。

Book三码.rar

613.52 KB, 下载次数: 10

回复

使用道具 举报

发表于 2015-3-2 10:10 | 显示全部楼层
那个Function要小改一下,不然如果一个数值内有相同数字会有问题。
  1. Function Paixu(xstr)       '把任意数据型字符按各位数从小到大排序
  2.     Dim w(9)
  3.     For i = 1 To Len(xstr)
  4.         a = Val(Mid(xstr, i, 1))
  5.         w(a) = w(a) & a
  6.     Next
  7.     Paixu = "'" & Join(w, "")
  8. End Function
复制代码

Book三码.rar

612.64 KB, 下载次数: 4

回复

使用道具 举报

发表于 2015-3-2 10:15 | 显示全部楼层
主程序也可小改一下。刚才有点重复。
  1. Sub tt()
  2.     r = Cells(Rows.Count, 1).End(xlUp).Row
  3.     c = Cells(2, Columns.Count).End(xlToLeft).Column
  4.     arr = [a1].Resize(r, c)
  5.     Set d = CreateObject("scripting.dictionary")
  6.     For i = 3 To c     '各列
  7.         x = Paixu(arr(2, i))        '各数内排序
  8.         d(x) = d(x) & "," & i      '得出列号,入字典
  9.         arr(2, i) = "'" & arr(2, i)
  10.     Next
  11.     For i = 4 To r       '各行
  12.         n = 0
  13.         x = Paixu(arr(i, 1))         '首数内排序
  14.         arr(i, 1) = "'" & arr(i, 1)
  15.         If d.exists(x) Then          '如果第2行某列数与首数相同(排序过后)
  16.             xrr = Split(d(x), ",")          '找出各列
  17.             For j = 1 To UBound(xrr)
  18.                 xc = Val(xrr(j))
  19.                 arr(i, xc) = "P"        '找出各列并加以标记
  20.             Next
  21.         End If
  22.         For j = 3 To c          '对于各列
  23.             n = n + 1   '顺序+1
  24.             If arr(i, j) = "P" Then n = 0          '如果已作标记,则令为0
  25.             arr(i, j) = n
  26.         Next
  27.     Next
  28.     [a1].Resize(r, c) = arr       '显示结果
  29. End Sub
复制代码
回复

使用道具 举报

发表于 2015-3-2 10:49 | 显示全部楼层
楼主测试,
  1. Dim qh As New swsqh
  2. Sub test()
  3.     Dim arr, x%, y%, i%, j%, n%
  4.     [b3:ark999].Clear
  5.     arr = Range("a1:ark" & [a65536].End(3).Row)
  6.     With qh
  7.         For i = 4 To UBound(arr)
  8.             .sws = arr(i, 1): x = .he
  9.             For j = 3 To UBound(arr, 2)
  10.                 .sws = arr(2, j): y = .he
  11.                 For n = 1 To 3
  12.                     If InStr(arr(2, j), Mid(arr(i, 1), n, 1)) = 0 Then Exit For
  13.                 Next
  14.                 If n > 3 And x = y Then
  15.                     arr(i, j) = 0
  16.                 Else
  17.                     arr(i, j) = arr(i, j - 1) + 1
  18.                 End If
  19.             Next
  20.             
  21.         Next
  22.         
  23.     End With
  24.     Union(Columns("A"), Rows(2)).NumberFormatLocal = "@"
  25.     [a1].Resize(UBound(arr), UBound(arr, 2)) = arr
  26. End Sub
复制代码
原表中公式可能有些问题,当数值类似110,101,011时可能排序不正确。
回复

使用道具 举报

发表于 2015-3-2 10:53 | 显示全部楼层
上述代码用到了类模块
  1. Dim xx$
  2. Property Let sws(x$)
  3. xx = x
  4. End Property
  5. Property Get he()
  6. Dim i%
  7. For i = 1 To 3
  8.     he = he + Val(Mid(xx, i, 1))
  9. Next
  10. End Property
复制代码
Book三码.rar (34.78 KB, 下载次数: 19)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 20:15 , Processed in 2.313883 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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