ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-2-14 17:55 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-2-14 17:46 | 显示全部楼层
tplk 发表于 2013-2-14 16:03
搞定了,谢谢老师的帮忙,真心感谢
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     If Target.Address(0, 0) <> "B3" And Target.Address(0, 0) <> "G1" Then Exit Sub
  3.     If dicValidation Is Nothing Then Call Macro1
  4.     If Target.Address(0, 0) = "G1" Then
  5.         With [b3].Validation
  6.             .Delete
  7.             If dicValidation.Exists(Target.Value) Then .Add 3, 1, 1, Join(dicValidation(Target.Value).keys, ",")
  8.         End With
  9.         [b3] = ""
  10.         Exit Sub
  11.     End If
  12.     Range("A5:O38").ClearContents
  13.     If [b3] = "" Then Exit Sub
  14.     Dim c As Range, c2 As Range, arr, i&, 校$, 班$, brr(100, 1 To 2), n&, rng As Range
  15.     Dim crr(1 To 34, 1 To 15), hj As Double, j&, m&, mc&
  16.     校 = Range("g1").Value
  17.     班 = Range("b3").Value
  18.     With Sheets("学生成绩源")
  19.         Set c = .[a:a].Find(校, , , xlWhole)
  20.         If c Is Nothing Then
  21.             MsgBox 校 & "没有查到"
  22.             Exit Sub
  23.         End If
  24.         Set rng = c.Offset(, 2).Resize(.[a:a].Find(校, , , xlWhole, , xlPrevious).Row - c.Row + 1)
  25.         Set c2 = rng.Find(班, rng.Cells(rng.Rows.Count), , xlWhole)
  26.         If c2 Is Nothing Then
  27.             MsgBox 班 & "没有查到"
  28.             Exit Sub
  29.         End If
  30.         arr = c2.Resize(rng.Find(班, , , xlWhole, , xlPrevious).Row - c2.Row + 1, 5)
  31.     End With
  32.     n = 1
  33.     brr(1, 2) = 0
  34.     For i = 1 To UBound(arr)
  35.         hj = arr(i, 3) + arr(i, 4) + arr(i, 5)
  36.         For j = 1 To n
  37.             If hj >= brr(j, 2) Then
  38.                 For m = n To j Step -1
  39.                     brr(m + 1, 1) = brr(m, 1)
  40.                     brr(m + 1, 2) = brr(m, 2)
  41.                 Next
  42.                 brr(j, 1) = i
  43.                 brr(j, 2) = hj
  44.                 Exit For
  45.             End If
  46.         Next
  47.         n = n + 1
  48.     Next
  49.     For i = 1 To n - 1
  50.         If i > 34 Then
  51.             x = i - 34
  52.             y = 8
  53.         Else
  54.             x = i
  55.             y = 0
  56.         End If
  57.         If brr(i, 2) <> brr(i - 1, 2) Then mc = i
  58.         crr(x, 1 + y) = mc
  59.         For j = 2 To 5
  60.             crr(x, j + y) = arr(brr(i, 1), j)
  61.         Next
  62.         crr(x, 6 + y) = brr(i, 2)
  63.     Next
  64.     Range("a5:o38") = crr
  65. End Sub

复制代码

TA的精华主题

TA的得分主题

发表于 2013-2-14 16:03 | 显示全部楼层
本帖最后由 tplk 于 2013-2-14 17:40 编辑
zhaogang1960 发表于 2013-2-14 14:32
请看附件
搞定了,谢谢老师的帮忙,真心感谢

TA的精华主题

TA的得分主题

发表于 2013-2-17 22:43 | 显示全部楼层
tplk 发表于 2013-2-17 22:29
是下载52楼的附件直接运行的,是不是我安装Excel的兼容包影响呢?

本身就是2003工作簿,不用兼容包,再加一段代码试试看:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address(0, 0) <> "G1" Then Exit Sub
    If dicValidation Is Nothing Then
        Call Macro1
    Else
        With Target.Validation
            .Delete
            .Add 3, 1, 1, Join(dicValidation.keys, ",")
        End With
    End If
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-2-17 22:44 | 显示全部楼层
请看附件
查询6.rar (44.1 KB, 下载次数: 14)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-2-17 22:29 | 显示全部楼层
本帖最后由 tplk 于 2013-2-17 22:30 编辑
zhaogang1960 发表于 2013-2-17 22:20
请上传出错附件分析一下


是下载52楼的附件直接运行的,是不是我安装Excel的兼容包影响呢?

TA的精华主题

TA的得分主题

发表于 2013-2-17 22:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
tplk 发表于 2013-2-17 22:13
是下载您上面的附件运行有时行有时不行。就是停在.Add 3, 1, 1, Join(dicValidation.keys, ",")'是这里出 ...

请上传出错附件分析一下

TA的精华主题

TA的得分主题

发表于 2013-2-17 22:05 | 显示全部楼层
tplk 发表于 2013-2-17 21:58
老师,下载您写好的附件,代码运行有一个小问题有时正常,有时不行):运行不行而停在这句代码.Add 3, 1, ...

是这段代码出错了?按理不应该,先请核对代码是否一致,如果一致,请上传出错附件
Sub Macro1()
    Dim arr, i&, s$
    Set dicValidation = CreateObject("scripting.dictionary")
    Set dicTeacher = CreateObject("scripting.dictionary")
    With Sheets("学生成绩源")
        arr = .Range("A2:C" & .Range("A65536").End(xlUp).Row)
    End With
    For i = 1 To UBound(arr)
        If Not dicValidation.Exists(arr(i, 1)) Then Set dicValidation(arr(i, 1)) = CreateObject("scripting.dictionary")
        dicValidation(arr(i, 1))(arr(i, 3)) = ""
    Next
    With [g1].Validation
        .Delete
        .Add 3, 1, 1, Join(dicValidation.keys, ",")'是这里出问题了?
    End With
    arrTeacher = Sheets("老师课表").[a1].CurrentRegion
    For i = 2 To UBound(arrTeacher)
        dicTeacher(arrTeacher(i, 1) & arrTeacher(i, 2)) = i
    Next
End Sub

TA的精华主题

TA的得分主题

发表于 2013-2-17 22:13 | 显示全部楼层
zhaogang1960 发表于 2013-2-17 22:05
是这段代码出错了?按理不应该,先请核对代码是否一致,如果一致,请上传出错附件
Sub Macro1()
    Di ...

是下载您上面的附件运行有时行有时不行。就是停在.Add 3, 1, 1, Join(dicValidation.keys, ",")'是这里出问题了

TA的精华主题

TA的得分主题

发表于 2013-2-17 21:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zhaogang1960 发表于 2013-2-14 22:43
请看附件

老师,下载您写好的附件,代码运行有一个小问题有时正常,有时不行):运行不行而停在这句代码.Add 3, 1, 1, Join(dicValidation.keys, ",")
不知道是什么原因
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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