ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 在总课表中如何通过点击生成可以代课老师的名单?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-3-16 16:24 | 显示全部楼层 |阅读模式
本帖最后由 yijijie 于 2024-3-16 16:26 编辑

在总课表中如何通过点击生成可以代课老师的名单?
先发附件 2024年春课程表原.rar (66.79 KB, 下载次数: 13)
(在这里先感谢大师:EH侠圣  ,他提供了一个可以行的VBA代码,但是有一点点小不足,希望哪位大师接力一下)
需求:每个数字编号代表一位老师,对应关系在3031行,现在的问题是希望通过点击课程下方的编号,显示可以用于代课的教师编号列表(同一天的相同节次不能跟选中的老师课程冲突)
例如:选中AD8单元格,可以用于本班代课的教师编号有:30、3、37、28、25(他也是本班任课老师)、33

说明:可以代课的老师要任本班的课,也就是在当天或者其他天也有这个班的课,而所在的这一天的这个节次又没有课。

捕获.JPG
附上EH侠圣大师的代码和我写的粗浅的说明:
  1. Private Sub Worksheet_SelectionChange(ByVal T As Range)
  2. '这是一个事件处理程序,它会在工作表中选择发生更改时触发。它接受一个参数T,表示选定的范围

  3. ActiveWindow.Zoom = 100                                      '这行代码将活动窗口的缩放设置为100%
  4. If T.Row > 4 Then                                            '检查选定的单元格是否在第5行之后,前5行是标题
  5.     If T.Count > 1 Then End                                  '如果选定的范围包含多个单元格,则终止执行代码
  6.     r = Cells(Rows.Count, 3).End(xlUp).Row - 14               '确定列C中最后一个非空单元格所在的行,然后减去14。是在计算数据区域的最后一行
  7.     y = Cells(3, Columns.Count).End(xlToLeft).Column         '这行代码确定行3中最后一个非空单元格所在的列,然后存储该列的列号
  8.     x = T.Row: w = T.Column                                  '将选定范围的行号和列号分别存储在变量x和w中
  9.     If x > r Or w > y Then ListBox1.Visible = False: End     '如果选定的范围在数据区域之外,则隐藏名为ListBox1的控件并终止执行代码
  10.     'MsgBox r                                                 '这行代码会显示一个消息框,其中包含变量r的值。r似乎是计算的数据区域的最后一行
  11.    
  12.    '嵌套的循环,用于创建一个字典对象d,其中存储了与选定单元格值不同的相邻单元格的数值数据。它在列中搜索与选定单元格相同的单元格值,并收集相邻单元格中的数值数据。
  13.    
  14.     If Not IsNumeric(T.Value) Then End                      '这行代码检查选定单元格的值是否为数值类型。如果不是,则立即结束代码的执行。
  15.     Dim d As Object, dc As Object
  16.     Set d = CreateObject("scripting.dictionary")
  17.     Set dc = CreateObject("scripting.dictionary")           '这两行代码创建了两个字典对象,分别用于存储不同的数据
  18.     bj = Cells(3, w)                                        '这行代码获取行3和列w处的单元格的值,并将其存储在变量bj中
  19.     For j = 3 To y                                          '这是一个循环,从列3开始,直到列y。y是列的最后一个列号
  20.         If Cells(x, j) <> "" Then dc(Cells(x, j).Value) = ""   '这行代码检查当前列中第x行是否为空。如果不为空,它将当前单元格的值作为键存储在字典对象dc中。这一步旨在收集选定行中所有非空单元格的值
  21.     Next j
  22.     For j = 3 To y                                          '遍历所有列
  23.         If Cells(3, j) = bj Then                            '检查第3行的当前列是否与之前存储在bj变量中的值相同
  24.             For i = 6 To r                                  '从第6行到r行。r是之前计算出来的数据区域的最后一行
  25.                 If i <> x Then
  26.                     If Cells(i, j) <> "" Then               '在内部循环中,首先检查i行和当前列的单元格是否为空。如果不为空,它将检查这个单元格的值是否与选定单元格的值不同,并且这个值是否为数值类型
  27.                         If Cells(i, j) <> T.Value Then
  28.                             If IsNumeric(Cells(i, j)) Then
  29.                                 If Not dc.exists(Cells(i, j).Value) Then
  30.                                     d(Cells(i, j).Value) = ""
  31.                                 End If
  32.                             End If
  33.                         End If
  34.                     End If
  35.                 End If
  36.             Next i
  37.         End If
  38.     Next j
  39.     If d.Count = 0 Then End
  40.     [ar1].Resize(1, d.Count) = d.keys
  41.     With ListBox1
  42.         .Visible = True
  43.         .Width = 30
  44.         .Top = T.Top + 15
  45.         .Left = T.Left + 20
  46.         .List = d.keys
  47.     End With
  48.     End If
  49. End Sub
复制代码
不足之处求完善:候选框里面的老师编号是星期一至星期五该节课均不出现的才显示出来,而我们实际情况是只要被点击的这一天这个节次没有课就可以安排。
如图所示,25号老师请假,其实1、22、33号老师也是可以安排的,不会受到星期四的课时的影响。
捕获1.JPG

TA的精华主题

TA的得分主题

发表于 2024-3-16 21:30 | 显示全部楼层
让原代码老师改比较容易。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 05:46 , Processed in 0.043394 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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