ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 请字典+数组的高手请进

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-4-9 08:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zhaogang1960 发表于 2012-4-8 23:59
7楼数组法效果不错,由于成绩总表中班别是有序排列的,可以分别查找第一个和最后一个“四(1)”,这样就可以 ...

赵大哥,如果能做到A2选择后自动完成,那就更好了

TA的精华主题

TA的得分主题

发表于 2012-4-9 08:44 | 显示全部楼层
cxh2010 发表于 2012-4-9 08:32
赵大哥,如果能做到A2选择后自动完成,那就更好了
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     If Target.Address(0, 0) <> "A2" Then Exit Sub
  3.     Range("A4:O37").ClearContents
  4.     If Target = "" Then Exit Sub
  5.     Dim c As Range, arr, i&, ban$, brr(100, 1 To 2), n&
  6.     Dim crr(1 To 34, 1 To 15), hj As Double, j&, m&, mc&
  7.     ban = Sheets("班档").Range("a2").Value
  8.     With Sheets("成绩总表")
  9.         Set c = .[a:a].Find(ban, , , xlWhole)
  10.         If c Is Nothing Then
  11.             MsgBox "没有查到"
  12.             Exit Sub
  13.         End If
  14.         arr = c.Resize(.[a:a].Find(ban, , , xlWhole, , xlPrevious).Row - c.Row + 1, 5)
  15.     End With
  16.     n = 1
  17.     brr(1, 2) = 0
  18.     For i = 1 To UBound(arr)
  19.         hj = arr(i, 3) + arr(i, 4) + arr(i, 5)
  20.         For j = 1 To n
  21.             If hj > brr(j, 2) Then
  22.                 For m = n To j Step -1
  23.                     brr(m + 1, 1) = brr(m, 1)
  24.                     brr(m + 1, 2) = brr(m, 2)
  25.                 Next
  26.                 brr(j, 1) = i
  27.                 brr(j, 2) = hj
  28.                 Exit For
  29.             End If
  30.         Next
  31.         n = n + 1
  32.     Next
  33.     For i = 1 To n - 1
  34.         If i > 34 Then
  35.             x = i - 34
  36.             y = 8
  37.         Else
  38.             x = i
  39.             y = 0
  40.         End If
  41.         If brr(i, 2) <> brr(i - 1, 2) Then mc = i
  42.         crr(x, 1 + y) = mc
  43.         For j = 2 To 5
  44.             crr(x, j + y) = arr(brr(i, 1), j)
  45.         Next
  46.         crr(x, 6 + y) = brr(i, 2)
  47.     Next
  48.     Sheets("班档").Range("a4:o37") = crr
  49. End Sub
复制代码
2012.4.8.rar (24.91 KB, 下载次数: 75)

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-4-9 09:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zhaogang1960 发表于 2012-4-9 08:44

非常好,谢谢!再次麻烦:关于“班档”表A2自动设置数据有效性(根据”成绩总分“表的A2:A列最后单元格的不重复内容)

TA的精华主题

TA的得分主题

发表于 2012-4-9 09:14 | 显示全部楼层
cxh2010 发表于 2012-4-9 09:00
非常好,谢谢!再次麻烦:关于“班档”表A2自动设置数据有效性(根据”成绩总分“表的A2:A列最后单元格的 ...
  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2.     If Target.Address(0, 0) <> "A2:B2" Then Exit Sub
  3.     Dim arr, i&, d As Object
  4.     With Sheets("成绩总表")
  5.         arr = .Range("A2:A" & .Range("A65536").End(xlUp).Row)
  6.     End With
  7.     Set d = CreateObject("scripting.dictionary")
  8.     For i = 1 To UBound(arr)
  9.         d(arr(i, 1)) = ""
  10.     Next
  11.     With Target.Validation
  12.         .Delete
  13.         .Add 3, 1, 1, Join(d.keys, ",")
  14.     End With
  15. End Sub
复制代码

2012.4.8.rar (25.28 KB, 下载次数: 92)

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-4-9 09:21 | 显示全部楼层
zhaogang1960 发表于 2012-4-9 09:14

非常了不起,{:soso_e179:}{:soso_e160:}{:soso_e163:}

TA的精华主题

TA的得分主题

发表于 2012-4-9 10:09 | 显示全部楼层
zhaogang1960 发表于 2012-4-8 22:49
短信收到,没有使用字典+数组,因为数组排序麻烦,写到工作表上排序也挺麻烦
下面代码使用ADO筛选和排序, ...

学习赵版了!!

TA的精华主题

TA的得分主题

发表于 2012-4-9 10:13 | 显示全部楼层
cxh2010 发表于 2012-4-9 08:31
大师,能做到A2选择后自动完成吗

用一CHANGE事件不就完了吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-4-9 14:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
dragonthree 发表于 2012-4-9 10:13
用一CHANGE事件不就完了吗?

谢谢您的指导

TA的精华主题

TA的得分主题

发表于 2012-4-10 09:08 | 显示全部楼层
发现没有人使用字典+数组,自己用字典+数组做了一个:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(0, 0) <> "A2" Then Exit Sub
Dim arr, brr(1 To 34, 1 To 15), crr(), aa, d, h, i, j, k, a()
s = Sheet1.Range("a65536").End(xlUp).Row
  arr = Sheet1.Range("a2:E" & s)
   ReDim crr(1 To UBound(arr), 1 To 5)
    ReDim a(1 To UBound(arr))
     r = 0
     For i = 1 To UBound(arr)
      If arr(i, 1) = Range("a2") Then
      m = m + 1
       crr(m, 1) = arr(i, 2): crr(m, 2) = arr(i, 3): crr(m, 3) = arr(i, 4): crr(m, 4) = arr(i, 5)
        crr(m, 5) = arr(i, 5) + arr(i, 3) + arr(i, 4)
         a(m) = arr(i, 5) + arr(i, 3) + arr(i, 4)
          End If
           Next
          Set d = CreateObject("Scripting.Dictionary")
           For i = m To 1 Step -1
           u = u + 1
            b = Application.Small(a, i)
             If Not d.exists(b) Then
              d(b) = u
              End If
               Next
               w = d.keys
                For j = 0 To UBound(w)
                 For h = 1 To m
                  If crr(h, 5) = w(j) Then
                    ss = ss + 1
                   If ss < 35 Then
                    brr(ss, 1) = d(crr(h, 5))
                     brr(ss, 2) = crr(h, 1): brr(ss, 3) = crr(h, 2): brr(ss, 4) = crr(h, 3): brr(ss, 5) = crr(h, 4): brr(ss, 6) = crr(h, 5)
                     Else
                      aa = aa + 1
                     brr(aa, 9) = d(crr(h, 5))
                     brr(aa, 10) = crr(h, 1): brr(aa, 11) = crr(h, 2): brr(aa, 12) = crr(h, 3): brr(aa, 13) = crr(h, 4): brr(aa, 14) = crr(h, 5)
                     End If
                     End If
                     Next
                     Next
                     
               Range("a35").Resize(34, 15) = brr
     
End Sub


TA的精华主题

TA的得分主题

 楼主| 发表于 2012-4-10 17:05 | 显示全部楼层
风云际会6 发表于 2012-4-10 09:08
发现没有人使用字典+数组,自己用字典+数组做了一个:
Private Sub Worksheet_Change(ByVal Target As Ran ...

厉害 ,谢谢!不过A2选择后代码不执行,请测试。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-29 10:16 , Processed in 0.040809 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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