Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3385|回复: 7

[已解决]如何提速课表中VBA运行的速度

[复制链接]
发表于 2021-3-11 20:18 | 显示全部楼层 |阅读模式
初学VBA,利用VBA做了个课表,但在提取教师课表和班级课表时,运行速度太慢,请教各位大神,帮忙改一下,如何提高一下运行速度,谢谢了!
最佳答案
2021-3-12 10:27
在教师表和班级表里做了个有效性下拉。

vba制作课表.rar

174.07 KB, 下载次数: 12

发表于 2021-3-12 09:44 | 显示全部楼层
用字典和数组代替单元格的比较

  1. Sub 插入教师姓名()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     arr = Worksheets("教师课务安排").[a1].CurrentRegion
  4.     For i = 3 To UBound(arr)
  5.         d(arr(i, 3) & arr(i, 4)) = arr(i, 2) '建立 班级+科目 与 老师 的对应关系
  6.     Next
  7.     With Worksheets("总课表")
  8.         h = .[a65536].End(xlUp).Row + 1
  9.         brr = .Range("A4:BD" & h)
  10.         For i = 1 To UBound(brr) Step 2
  11.             For j = 2 To UBound(brr, 2)
  12.                 brr(i + 1, j) = d(brr(i, 1) & brr(i, j))   '根据《总课表》的班级+科目 找到对应的老师
  13.             Next
  14.         Next
  15.         .Range("A4:BD" & h) = brr
  16.     End With
  17. End Sub
复制代码
回复

使用道具 举报

发表于 2021-3-12 10:13 | 显示全部楼层
  1. Sub 显示教师课表()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     With Worksheets("总课表")
  4.         h = .[a65536].End(xlUp).Row + 1
  5.         brr = .Range("A2:BD" & h)
  6.         For j = 2 To UBound(brr, 2)
  7.             If brr(1, j) = "" Then brr(1, j) = brr(1, j - 1) '把合并单元格的星期也放到数组里
  8.         Next
  9.         For i = 3 To UBound(brr) Step 2
  10.             For j = 2 To UBound(brr, 2)
  11.                 js = brr(i + 1, j)        '教师
  12.                 d(js & brr(1, j) & brr(2, j)) = brr(i, 1) & Chr(10) & brr(i, j)  'd(教师+星期+节次)=班级+回车键+科目
  13.             Next
  14.         Next
  15.     End With
  16.     With Sheets("教师个人课表")
  17.         js = .[c5]
  18.         arr = .[a7:h18]
  19.         For i = 2 To UBound(arr)
  20.             For j = 3 To UBound(arr, 2)
  21.                 arr(i, j) = d(js & arr(1, j) & arr(i, 2))   '班级+回车键+科目=d(教师+星期+节次)
  22.             Next
  23.         Next
  24.         .[a7:h18] = arr
  25.     End With
  26. End Sub
复制代码
回复

使用道具 举报

发表于 2021-3-12 10:18 | 显示全部楼层
班级课表和教师课表基本一致
  1. Sub 显示班级课表()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     With Worksheets("总课表")
  4.         h = .[a65536].End(xlUp).Row + 1
  5.         brr = .Range("A2:BD" & h)
  6.         For j = 2 To UBound(brr, 2)
  7.             If brr(1, j) = "" Then brr(1, j) = brr(1, j - 1) '把合并单元格的星期也放到数组里
  8.         Next
  9.         For i = 3 To UBound(brr) Step 2
  10.             bj = brr(i, 1)
  11.             For j = 2 To UBound(brr, 2)
  12.                 d(bj & brr(1, j) & brr(2, j)) = brr(i, j) & Chr(10) & brr(i + 1, j)  'd(班级+星期+节次)=科目+回车键+教师
  13.             Next
  14.         Next
  15.     End With
  16.     With Sheets("班级课程表")
  17.         bj = .[c5]
  18.         arr = .[a7:h18]
  19.         For i = 2 To UBound(arr)
  20.             For j = 3 To UBound(arr, 2)
  21.                 arr(i, j) = d(bj & arr(1, j) & arr(i, 2))   '科目+回车键+教师=d(班级+星期+节次)
  22.             Next
  23.         Next
  24.         .[a7:h18] = arr
  25.     End With
  26. End Sub
复制代码
回复

使用道具 举报

发表于 2021-3-12 10:27 | 显示全部楼层    本楼为最佳答案   
在教师表和班级表里做了个有效性下拉。

vba制作课表.rar

165.12 KB, 下载次数: 12

回复

使用道具 举报

发表于 2021-3-12 13:29 | 显示全部楼层
Sub 显示教师课表()
Dim i As Integer, li As Integer, jskb As Worksheet, arr, brr(1 To 11, 1 To 6) As String, js As String

arr = Worksheets("总课表").Range("a1").Resize(Worksheets("总课表").Cells(Rows.Count, 2).End(xlUp).Row, 58)
Set jskb = Worksheets("教师个人课表")
    js = jskb.Range("c5").Value
   
For i = 5 To UBound(arr) Step 2
                   If arr(i, 2) = js Then brr(10, 6) = arr(i - 1, 1) & Chr(10) & arr(i - 1, 2)
                   If arr(i, 3) = js Then brr(11, 6) = arr(i - 1, 1) & Chr(10) & arr(i - 1, 3)
      For l1 = 4 To 58
                If arr(i, l1) = js Then
                   brr(((l1 - 4) Mod 11) + 1, (l1 - 4) \ 11 + 1) = arr(i - 1, 1) & Chr(10) & arr(i - 1, l1)
                End If
      Next l1
Next i

With jskb.Range("c8").Resize(UBound(brr), UBound(brr, 2))
     .ClearContents
     .Value = brr
End With
End Sub


提存放单元格数据会影响速度,尽量少处理单元格,速度就提升了,要是禁止公式自动计算和事件响应,那你的程序是可以提升一些速度
    Application.Calculation = IIf(jz, xlAutomatic, xlManual) '设置工作表公式计算为手动模式
    Application.EnableEvents = false   '禁止工作表事件
回复

使用道具 举报

 楼主| 发表于 2021-3-15 07:23 | 显示全部楼层
谢谢各位大神,我马上去试试!
回复

使用道具 举报

 楼主| 发表于 2021-3-15 10:49 | 显示全部楼层
grf1973 发表于 2021-3-12 10:27
在教师表和班级表里做了个有效性下拉。

请问一下大神,我现在想在《教师课程表》和《班级课程表》中通过教师姓和班级进行批量打印,代码该怎么写,原来用函数做的课表,批量打印代码不能用了。谢谢了!

VBA课表.rar

254.21 KB, 下载次数: 6

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-7 07:35 , Processed in 0.360603 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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