【发布时间】:2014-01-14 07:55:09
【问题描述】:
朋友们,
我有一个工作表,我在上面使用“自动呈现”宏。但是该宏的工作速度非常缓慢,缓慢意味着即使其他宏只需要不到一秒的时间,它也需要超过 5 秒的时间来处理。我不知道为什么会这样。
所以,朋友们我的实际需求和我生成的代码发布在下面。请帮我解决这个问题。
我的实际需求。
我有一个用于输入员工详细信息的电子表格。我正在输入员工的日常考勤状态。我正在对每个员工状态单元格使用数据验证。意味着,我正在从数据验证列表菜单中选择员工的状态。它有近 600 名员工,输入每个员工的状态是一项艰巨的任务。所以我需要的是,我可以在缺勤、临时休假等情况下进入……而其余未标记的员工将在场。所以我需要一个命令按钮来实现这个目的。因此,当我单击该按钮时,它应该自动在该特定日期列的剩余单元格上应用“P”。更清楚地说,我在一个月中的每一天都有 31 列,每列的第 7 行包含该特定日期的日期。所以宏必须在当前日期的特定列之间搜索空单元格,并在我单击命令按钮时用“P”填充它。空单元格将位于每天列的第 8 行到第 500 行之间。宏必须检查的另一件事。每天的空单元格只有在单元格各自的“B”单元格具有任何值(输入员工姓名的地方)时才需要填写。更清楚的是,我在“B”列的第 8 行到第 500 行中输入员工姓名。因此,在单击命令按钮后,宏必须找到包含特定日期的列,并找到该列的第 8 行到第 500 行之间的空单元格,并用“P”填充这些空单元格,前提是 B 列中有任何名称.
我的自动呈现 VBA 代码:
Private Sub Button506_Click()
Dim BeginCol As Long
Dim endCol As Long
Dim ChkRow As Long
Dim rng As Range
Dim c As Variant
Application.ScreenUpdating = False
BeginCol = 6
endCol = 37
ChkRow = 7
For Colcnt = BeginCol To endCol
If Sheets("Sheet1").Cells(ChkRow, Colcnt).Value = Date Then
Set rng = Sheets("Sheet1").Cells(ChkRow, Colcnt).Rows("2:500")
For Each c In rng
If Sheets("Sheet1").Cells(c.Row, 2).Value = "" Then
c.Value = "P"
End If
Next c
Else
'Sheets("Sheet1").Cells(ChkRow, Colcnt).EntireColumn.Hidden = True
End If
Next Colcnt
Application.ScreenUpdating = True
End Sub
【问题讨论】:
-
为这类员工使用关系数据库是值得的。尝试在
Private Sub下方添加Application.ScreenUpdating = False行,然后在End Sub之前添加Application.ScreenUpdating = True屏幕更新 下方的事件Application.EnableEvents = False并在 end sub 之前将其重新打开 -
先生,我也试过了。但没有结果......仍然是同样的滞后。 :-) 如果您同意,可以帮我修改一下这段代码吗?
-
万岁!!!!!!!!!先生,当我在两端添加 Application.Calculation = xlManual 和 Application.Calculation = xlAutomatic 时,它现在运行良好。非常感谢先生。 ;-)