网站首页 > 基础教程 正文
一、问题的提出
学校教务处在编排课程表时,第一步要根据学校对教师工作任务的分配,制作班级任课表(如下图),班级任课表可清晰地呈现各班级、各学科的教师任课情况。
第二步要制作教师任课表,要在《班级任课表》基础上,对全校每位教师担任哪一个班级的哪一门学科进行汇总,既方便教师查询自己的任课情况,也是我们后续编排教师课程表的前提。
当学校教师数量较多时,手动输入制作教师任课表真的是一件费时费力的苦差,我真的不想这么过了,这苦这累成了倒逼我寻找简捷方法的动力。我们研究上述《班级任课表》和《教师任课表》,会发现二者之间是有内在联系的,只不过是信息的呈现方式不一样,完全可以利用《班级任课表》直接转化为《教师任课表》,经过一段时间的探索,我用VBA完成了这个转化,今天,我来分享自己的探索成果,希望能给被同样问题困扰的教务同行有所帮助与启发。
二、问题解决
1、右击《班级任课表》工作表标签,在弹出的快捷菜单中选择"查看代码"命令,在打开的VBA窗口中输入以下代码:
Sub 获取教师唯一姓名()
On Error Resume Next
Application.ScreenUpdating = False
Dim R As Integer, C As Integer, sht As Worksheet
Dim s As String, JsName, JsOnly, h, firstAddress
Dim k As Integer, i As Integer, j As Integer, n As String
Dim strRenKe As String, Rng As Range, bj As String, rk As String
Set mydic = CreateObject("Scripting.Dictionary")
Set sht = Worksheets("班级任课表")
C = sht.Range("A2").End(xlToRight).Column '获取最右一列列号
R = sht.Range("A2").End(xlDown).Row '获取最后一行行号
s = "B4:" & GCB(Val(C)) & R
'获取教师任课数据区域,GCB为自定义函数,用于从列号获取列标
JsName = sht.Range(s).Value '将教师姓名存储在二维数组JsName(k,i)中
s = "B3:" & GCB(Val(C)) & R '查找时向左扩展一行,以便能从B4开始查找
Set Rng = sht.Range(s)
For k = 1 To R - 3 '从B4开始,故数组第一维从1至R-3,减去前3行
For i = 1 To C - 1 '从B4开始,故数组第二维从1至C-1,减去A列
n = Trim(JsName(k, i)) '获取教师姓名,用于查找任课情况
strRenKe = "" '清空教师任课情况,用于循环查找下一位教师任课
If Not mydic.Exists(n) And n <> "" Then '当教师姓名不为空,关键字不存在时
With Rng '对教师区域进行查找
bj = "": rk = ""
Set h = .Find(n)
If Not h Is Nothing Then
firstAddress = h.Address
Do
If Left(bj, 1) = Left(sht.Cells(3, h.Column), 1) And rk = sht.Cells(h.Row, "A") Then
bj = sht.Cells(3, h.Column) '获取班级名称
rk = sht.Cells(h.Row, "A") '获取学科名称
strRenKe = Left(strRenKe, Len(strRenKe) - Len(rk)) & Right(bj, 1) & rk
ElseIf rk = sht.Cells(h.Row, "A") Then
bj = sht.Cells(3, h.Column) '获取班级名称
rk = sht.Cells(h.Row, "A") '获取学科名称
strRenKe = Left(strRenKe, Len(strRenKe) - Len(rk)) & bj & rk
Else
bj = sht.Cells(3, h.Column) '获取班级名称
rk = sht.Cells(h.Row, "A") '获取学科名称
strRenKe = strRenKe & bj & rk
End If
Set h = .FindNext(h)
Loop Until h Is Nothing Or h.Address = firstAddress
End If
End With
mydic.Add n, strRenKe
End If
Next i
Next k
Set sht = Worksheets("教师任课表")
JsOnly = mydic.Keys '获取教师姓名,转置在A列
sht.Range("A2:A" & mydic.Count + 1) = WorksheetFunction.Transpose(JsOnly)
JsOnly = mydic.Items '获取教师任课,转置在B列
sht.Range("B2:B" & mydic.Count + 1) = WorksheetFunction.Transpose(JsOnly)
Set Rng = Nothing: Set sht = Nothing
Application.ScreenUpdating = True
End Sub
2、代码注释
⑴s = "B4:" & GCB(Val(C)) & R
C是获取最右一列列号,这与学校班级数量多少有关,这个C获取的是字符型数字,所以用Val函数才能将字符型数字C,转换成数值型数字。然后利用自定义函数GCB从列号获取列标字母,如37就转换为AK,从而获取教师任课数据区域。
⑵自定义函数GCB代码(这段代码最好放在模块中)
Public Function GCB(Num As Integer) As String
'快速将列标数字转化为列标(如2转化为B,16384转化为XFD等)
Application.ScreenUpdating = False
On Error Resume Next
If Num > 16384 Or Num < 1 Then Exit Function
Dim y As Integer, s As String
s = ""
Do
y = Num Mod 26
If y = 0 Then
s = Chr(64 + 26) & s
Num = Num \ 26 - 1
Else
s = Chr(64 + y) & s
Num = Num \ 26
End If
Loop Until Num = 0
GCB = Trim(s)
Application.ScreenUpdating = True
End Function
⑶Set mydic = CreateObject("Scripting.Dictionary")
用于创建一个字典mydic,利用字典关键字的唯一性,从班级任课表中有重复的教师姓名中获取每位教师姓名的唯一值。
⑷Set h = .Find(n)与Set h = .FindNext(h)
n储存的是一位教师的姓名,根据教师的姓名获取他的所有任课,Find是查找,FindNext是查找下一个直到查找完毕。
⑸Do……Loop循环中的多个If语句,用于处理教师任课中的冗余字符,譬如同一年级名称、同一学科名称只显示一个,这样数据更简洁直观。
⑹WorksheetFunction.Transpose(JsOnly)
JsOnly是储存教师姓名或教师任课的一维数组,对应于工作表中一行数据,要把一行数据转置为一列数据,使用工作表函数之转置函数WorksheetFunction.Transpose。
猜你喜欢
- 2024-11-21 JS函数式编程中compose的实现
- 2024-11-21 前端面试:JavaScript字符串的常用的操作方法有哪些?
- 2024-11-21 前端面试:JavaScript 字符串的常用方法?
- 2024-11-21 JavaScript 版本
- 2024-11-21 javascript自学记录:String类型
- 2024-11-21 每天提升一点Javascript功力
- 2024-11-21 9 个JavaScript 技巧
- 2024-11-21 总结:js中4类修改样式的方法
- 2024-11-21 Node+浏览器,JavaScript中字符串校验工具库——validator.js
- 2024-11-21 第14天|16天搞定前端,Javascript,要你何用?
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)