ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 请教大侠:如何根据总课表的节次自动生成可以代课的老师名单

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-3-14 21:46 | 显示全部楼层 |阅读模式
本帖最后由 yijijie 于 2024-3-17 12:12 编辑

如何根据总课表的节次自动生成可以代课的老师名单,实在是想不出思路~

是不是要用VBA?请教高手,谢谢
捕获.JPG
2024年春课程表.rar (56.52 KB, 下载次数: 13)



最后给代码写了备注,优化了一下框的形状,再次感谢 3190496160
共享最终文件:
2024年春课程表原改.rar (67.08 KB, 下载次数: 2)
捕获.JPG

TA的精华主题

TA的得分主题

发表于 2024-3-15 09:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Private Sub Worksheet_SelectionChange(ByVal T As Range)
ActiveWindow.Zoom = 100
If T.Row > 4 Then
    If T.Count > 1 Then End
    r = Cells(Rows.Count, 3).End(xlUp).Row - 6
    y = Cells(3, Columns.Count).End(xlToLeft).Column
    x = T.Row: w = T.Column
    If x > r Or w > y Then ListBox1.Visible = False: End
    MsgBox r
    If Not IsNumeric(T.Value) Then End
    Dim d As Object, dc As Object
    Set d = CreateObject("scripting.dictionary")
    Set dc = CreateObject("scripting.dictionary")
    bj = Cells(3, w)
    For j = 3 To y
        If Cells(x, j) <> "" Then dc(Cells(x, j).Value) = ""
    Next j
    For j = 3 To y
        If Cells(3, j) = bj Then
            For i = 6 To r
                If i <> x Then
                    If Cells(i, j) <> "" Then
                        If Cells(i, j) <> T.Value Then
                            If IsNumeric(Cells(i, j)) Then
                                If Not dc.exists(Cells(i, j).Value) Then
                                    d(Cells(i, j).Value) = ""
                                End If
                            End If
                        End If
                    End If
                End If
            Next i
        End If
    Next j
    If d.Count = 0 Then End
    [ar1].Resize(1, d.Count) = d.keys
    With ListBox1
        .Visible = True
        .Top = T.Top + 15
        .Left = T.Left + 10
        .List = d.keys
    End With
End If
End Sub

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-3-15 09:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
2024年春课程表.rar (67.13 KB, 下载次数: 7)

TA的精华主题

TA的得分主题

发表于 2024-3-15 09:11 | 显示全部楼层
结果未认真核对,仅供参考

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-15 12:57 来自手机 | 显示全部楼层
谢谢大师,顶礼膜拜!
在我思路都不知道的情况下,你已经写出了代码,我下来好好学习学习

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-15 22:23 | 显示全部楼层
本帖最后由 yijijie 于 2024-3-15 22:25 编辑
3190496160 发表于 2024-3-15 09:11
结果未认真核对,仅供参考

认真看了结果,发现一个小问题,不知道能不能修复?
目前得出的结果是:候选框里面的老师编号是星期一至星期五该节课均不出现的才显示出来,而我们实际情况是只要被点击的这一天这个节次没有课就可以安排。
如图所示,25号老师请假,其实1、22、33号老师也是可以安排的,不会受到星期四的课时的影响。
捕获.JPG

TA的精华主题

TA的得分主题

发表于 2024-3-17 09:53 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-17 11:58 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-17 12:02 | 显示全部楼层
我把框美化一点点,写了点注释重新贴出来,有需要的教务老师方便以后使用:
  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) Or 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.    
  20.     xq = Cells(4, w)                                    '****xq为变量,对应点击单元格上方的星期几
  21.    
  22.     For j = 3 To y                                          '这是一个循环,从列3开始,直到列y。y是列的最后一个列号
  23.         If Cells(4, j) = xq Then                        '****循环中加入判断:星期那行有等于变量xq的就继续下面的代码(此段代码限定了下段代码的范围)
  24.             
  25.              If Cells(x, j) <> "" Then dc(Cells(x, j).Value) = ""   '这行代码检查当前列中第x行是否为空。如果不为空,它将当前单元格的值作为键存储在字典对象dc中。这一步旨在收集选定行中所有非空单元格的值
  26.         
  27.         End If
  28.     Next j
  29.     For j = 3 To y                                          '遍历所有列
  30.         If Cells(3, j) = bj Then                            '检查第3行的当前列是否与之前存储在bj变量中的值相同
  31.             For i = 6 To r                                  '从第6行到r行。r是之前计算出来的数据区域的最后一行
  32.                 If i <> x Then
  33.                     If Cells(i, j) <> "" Then               '在内部循环中,首先检查i行和当前列的单元格是否为空。如果不为空,它将检查这个单元格的值是否与选定单元格的值不同,并且这个值是否为数值类型
  34.                         If Cells(i, j) <> T.Value Then
  35.                             If IsNumeric(Cells(i, j)) Then
  36.                                 If Not dc.exists(Cells(i, j).Value) Then
  37.                                     d(Cells(i, j).Value) = ""
  38.                                 End If
  39.                             End If
  40.                         End If
  41.                     End If
  42.                 End If
  43.             Next i
  44.         End If
  45.     Next j
  46.     If d.Count = 0 Then End
  47.     [ar1:cp1] = ""                                      '****清空上次记录,以便下行代码重新记录
  48.     [ar1].Resize(1, d.Count) = d.keys
  49.     With ListBox1
  50.         .Width = T.Width * 1.2                          '****列表框宽度
  51.         .Height = T.Height * UBound(d.keys) * 0.95         '****列表框高度
  52.         .Top = T.Top + 15
  53.         .Left = T.Left + 20
  54.         .List = d.keys
  55.         .Visible = True
  56.     End With
  57.     End If
  58. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-30 04:23 , Processed in 1.059629 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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