ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-1-13 21:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zhaogang1960 发表于 2013-2-17 22:44
请看附件

版主,请教:如果班别里出现有两种情况如:一(1)和一年级,。。。能不能使代码在这两种混合的情况下都能正常呢

查询6 1.rar

43.58 KB, 下载次数: 4

TA的精华主题

TA的得分主题

发表于 2014-1-13 22:05 | 显示全部楼层
zxc00 发表于 2014-1-13 21:42
版主,请教:如果班别里出现有两种情况如:一(1)和一年级,。。。能不能使代码在这两种混合的情况下都能 ...

我不知道
一年级  和  二(1)的对应关系,请说明

TA的精华主题

TA的得分主题

发表于 2014-1-13 22:12 | 显示全部楼层
zhaogang1960 发表于 2014-1-13 22:05
我不知道
一年级  和  二(1)的对应关系,请说明

就是说一年级有一个班的时候,有的学校写成一年级,有的学校写成一(1)

TA的精华主题

TA的得分主题

发表于 2014-1-13 22:18 | 显示全部楼层
zhaogang1960 发表于 2014-1-13 22:05
我不知道
一年级  和  二(1)的对应关系,请说明

版主,请看光明学校的一年级和其他学校的不一样,

TA的精华主题

TA的得分主题

发表于 2014-1-13 22:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zxc00 发表于 2014-1-13 22:12
就是说一年级有一个班的时候,有的学校写成一年级,有的学校写成一(1)
  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.             班 = Left$(班, 1) & "年级"
  28.             Set c2 = rng.Find(班, rng.Cells(rng.Rows.Count), , xlWhole)
  29.             If c2 Is Nothing Then
  30.                 MsgBox Range("b3").Value & "没有查到"
  31.                 Exit Sub
  32. '            Else
  33. '
  34.             End If
  35.         End If
  36.         arr = c2.Resize(rng.Find(班, , , xlWhole, , xlPrevious).Row - c2.Row + 1, 5)
  37.     End With
  38.     n = 1
  39.     brr(1, 2) = 0
  40.     For i = 1 To UBound(arr)
  41.         If InStr(arr(i, 1), "年级") Then arr(i, 1) = Left$(arr(i, 1), 1) & "(1)"
  42.         hj = arr(i, 3) + arr(i, 4) + arr(i, 5)
  43.         For j = 1 To n
  44.             If hj >= brr(j, 2) Then
  45.                 For m = n To j Step -1
  46.                     brr(m + 1, 1) = brr(m, 1)
  47.                     brr(m + 1, 2) = brr(m, 2)
  48.                 Next
  49.                 brr(j, 1) = i
  50.                 brr(j, 2) = hj
  51.                 Exit For
  52.             End If
  53.         Next
  54.         n = n + 1
  55.     Next
  56.     For i = 1 To n - 1
  57.         If i > 34 Then
  58.             x = i - 34
  59.             y = 8
  60.         Else
  61.             x = i
  62.             y = 0
  63.         End If
  64.         If brr(i, 2) <> brr(i - 1, 2) Then mc = i
  65.         crr(x, 1 + y) = mc
  66.         For j = 2 To 5
  67.             crr(x, j + y) = arr(brr(i, 1), j)
  68.         Next
  69.         crr(x, 6 + y) = brr(i, 2)
  70.     Next
  71.     Range("a5:o38") = crr
  72.     i = dicTeacher([g1] & 班)
  73.     [d3] = "任课老师     " & arrTeacher(1, 3) & ":" & arrTeacher(i, 3) & "     " & arrTeacher(1, 4) & ":" & arrTeacher(i, 4) & "     " & arrTeacher(1, 5) & ":" & arrTeacher(i, 5)
  74. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-1-13 23:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zxc00 发表于 2014-1-13 22:56
谢谢,现在还有一个问题:如果老师任课工作表里的班别和成绩表里的不一样的时候,那能不能做到也能正常运 ...
  1. Sub Macro1()
  2.     Dim arr, i&, s$
  3.     Set dicValidation = CreateObject("scripting.dictionary")
  4.     Set dicTeacher = CreateObject("scripting.dictionary")
  5.     With Sheets("学生成绩源")
  6.         arr = .Range("A2:C" & .Range("A65536").End(xlUp).Row)
  7.     End With
  8.     For i = 1 To UBound(arr)
  9.         If Not dicValidation.Exists(arr(i, 1)) Then Set dicValidation(arr(i, 1)) = CreateObject("scripting.dictionary")
  10.         dicValidation(arr(i, 1))(arr(i, 3)) = ""
  11.     Next
  12.     With [g1].Validation
  13.         .Delete
  14.         .Add 3, 1, 1, Join(dicValidation.keys, ",")
  15.     End With
  16.     arrTeacher = Sheets("老师课表").[a1].CurrentRegion
  17.     For i = 2 To UBound(arrTeacher)
  18.         If InStr(arrTeacher(i, 2), "年级") Then arrTeacher(i, 2) = Left$(arrTeacher(i, 2), 1) & "(1)"
  19.         dicTeacher(arrTeacher(i, 1) & arrTeacher(i, 2)) = i
  20.     Next
  21. End Sub
复制代码
  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.             班 = Left$(班, 1) & "年级"
  28.             Set c2 = rng.Find(班, rng.Cells(rng.Rows.Count), , xlWhole)
  29.             If c2 Is Nothing Then
  30.                 MsgBox Range("b3").Value & "没有查到"
  31.                 Exit Sub
  32.             End If
  33.         End If
  34.         arr = c2.Resize(rng.Find(班, , , xlWhole, , xlPrevious).Row - c2.Row + 1, 5)
  35.     End With
  36.     n = 1
  37.     brr(1, 2) = 0
  38.     For i = 1 To UBound(arr)
  39.         If InStr(arr(i, 1), "年级") Then arr(i, 1) = Left$(arr(i, 1), 1) & "(1)"
  40.         hj = arr(i, 3) + arr(i, 4) + arr(i, 5)
  41.         For j = 1 To n
  42.             If hj >= brr(j, 2) Then
  43.                 For m = n To j Step -1
  44.                     brr(m + 1, 1) = brr(m, 1)
  45.                     brr(m + 1, 2) = brr(m, 2)
  46.                 Next
  47.                 brr(j, 1) = i
  48.                 brr(j, 2) = hj
  49.                 Exit For
  50.             End If
  51.         Next
  52.         n = n + 1
  53.     Next
  54.     For i = 1 To n - 1
  55.         If i > 34 Then
  56.             x = i - 34
  57.             y = 8
  58.         Else
  59.             x = i
  60.             y = 0
  61.         End If
  62.         If brr(i, 2) <> brr(i - 1, 2) Then mc = i
  63.         crr(x, 1 + y) = mc
  64.         For j = 2 To 5
  65.             crr(x, j + y) = arr(brr(i, 1), j)
  66.         Next
  67.         crr(x, 6 + y) = brr(i, 2)
  68.     Next
  69.     Range("a5:o38") = crr
  70.     s = [b3]
  71.     If InStr(s, "年级") Then s = Left$(s, 1) & "(1)"
  72.     i = dicTeacher([g1] & s)
  73.     [d3] = "任课老师     " & arrTeacher(1, 3) & ":" & arrTeacher(i, 3) & "     " & arrTeacher(1, 4) & ":" & arrTeacher(i, 4) & "     " & arrTeacher(1, 5) & ":" & arrTeacher(i, 5)
  74. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-1-13 22:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
请看附件
查询6 1.rar (43.95 KB, 下载次数: 14)

TA的精华主题

TA的得分主题

发表于 2014-1-13 22:56 | 显示全部楼层
zhaogang1960 发表于 2014-1-13 22:33
请看附件

谢谢,现在还有一个问题:如果老师任课工作表里的班别和成绩表里的不一样的时候,那能不能做到也能正常运行?
如:光明学校的一年级:成绩表里显示是一年级,而老师任课表里又是一(1)
                     二年级:成绩表里显示是二(1),而老师任课表里又是二年级

查询6 1 (2).rar

43.79 KB, 下载次数: 2

TA的精华主题

TA的得分主题

发表于 2014-1-13 23:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
请测试附件
查询6 2.rar (43.73 KB, 下载次数: 33)

TA的精华主题

TA的得分主题

发表于 2014-1-13 23:27 | 显示全部楼层
本帖最后由 zxc00 于 2014-1-13 23:31 编辑
zhaogang1960 发表于 2014-1-13 23:19

大侠很了不起,谢谢,辛苦了{:soso_e160:}
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-29 12:20 , Processed in 0.038806 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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