我在使用Excel中的VBA宏时遇到了一个奇怪的问题。背景是,我正在为人工日志创建一个模板来记录员工在现场的时间。有一张主页,其中所有数据都输入“人工日志”,然后输入8张,一周中的一天和一张假期表。有一个隐藏的工作表,其中包含我的动态列表和静态列表。
导致问题的宏是一周中几天的工作表上的宏。他们正在做的是,在“人工日志”表中搜索B列中某一天的任何单元格,然后在日期表的第8行插入该行。这将循环,直到输入所有实例。以下星期一的例子。
Private Sub PullMondayData_Click()
Dim dc As Range
With Sheets("Labour Log") 'Reference to Labour Log Sheet
For Each dc In Intersect(.Range("B:B"), .UsedRange)
If dc.Value2 = "Monday" Then 'Search/Filter B:B for Monday
dc.Resize(1, 1).EntireRow.Copy 'Copy the row
Sheets("Monday").Rows(8).Insert Shift:=xlDown 'Insert in Row 8, shifting down
End If
Next
End With
Application.CutCopyMode = False 'Remove copy mode
End Sub
这通常适用于星期一。我通常可以多次击中那个而没有问题。
当我返回人工日志表并将日期更改为任何其他日期时,我在点击宏时会开始在这些表格上出错。宏代码完全相同,但相关日期输入正确的位置。
我经常遇到的第一个错误是:
进行调试说错误:
然后我停止宏并再次运行它,得到以下错误:
调试它给出了这一行:
之后,我可以关闭Excel工作表的唯一方法是从任务管理器结束进程,程序的其余部分被锁定。
我不时会遇到崩溃,输出结果为:
Problem signature:
Problem Event Name: APPCRASH
Application Name: EXCEL.EXE
Application Version: 16.0.6868.2060
Application Timestamp: 5723a711
Fault Module Name: mso20win32client.dll
Fault Module Version: 0.0.0.0
Fault Module Timestamp: 57222bc3
Exception Code: c0000005
Exception Offset: 0008c78d
OS Version: 6.1.7601.2.1.0.256.48
Locale ID: 4105
Additional information about the problem:
LCID: 1033
skulcid: 1033
我在网上搜索了各种答案,但它们似乎没有用。我尝试了以下内容:
Application.CutCopyMode = False
我对VBA的了解并不是很好,很多代码都是从搜索中获取的,并根据我的目的进行了修改,但我不明白为什么它适用于星期一表,但会崩溃所有其他代码。 / p>
非常感谢任何见解。
感谢。
答案 0 :(得分:0)
实际跟踪该错误的信息太少
但是,假设您正在使用具有许多按钮的Userform进行单击并进行适当的日处理,我建议您使用一些代码来帮助您保持清洁,从而减少错误
根据相关日期设置按钮caption
属性
所以你有
PullMondayData
按钮上显示“星期一”字幕
PullTuesdayData
按钮上显示“星期二”字幕
依此类推
将您的所有Pull
day
button
“点击”事件处理程序代码如下所示:
Private Sub PullMondayData_Click()
PullDayData (Me.ActiveControl.Caption)
End Sub
Private Sub PullTuesdayData_Click()
PullDayData (Me.ActiveControl.Caption)
End Sub
依此类推
将以下子项添加到Userform代码窗格
Private Sub PullDayData(thisDay As String)
Dim dc As Range
With Sheets("Labour Log") 'Reference to Labour Log Sheet
For Each dc In Intersect(.Range("B:B"), .UsedRange)
If dc.Value2 = thisDay Then 'Search/Filter B:B for Monday
With Sheets(thisDay).Rows(8)
.Insert Shift:=xlDown 'Insert in Row 8, shifting down
.Value = dc.Resize(1, 1).EntireRow.Value
End With
End If
Next
End With
End Sub
以上所有内容仍然可以大大改善,但它至少会给你带来以下好处:
编写更少的代码
因此两者在维护它方面的努力要少得多,并且可能有很多错误!
没有使用复制/粘贴方法来不通过剪贴板而且速度更快
为了进一步有效改进,我建议您执行以下步骤:
使用Range
对象的AutoFilter()和SpecialCells()方法来提高控制力和效率
使用课程
答案 1 :(得分:0)
虽然我同意user3598756,但这还不足以确定答案,我还有其他一些尝试:
我使用.CurrentRegion
获得了比.UsedRange
更好的结果,以获得数据区域。也有例外情况,但如果您的标题不能为空且至少有一列没有空格,则可以完美运行。
当一行中有多个内容导致错误时,将其分解会为您提供有关崩溃的更好信息,因此请将dc.Resize(1, 1).EntireRow.Copy
更改为两个语句:dc.Resize(1,1)
和{ {1}}。
COM对象,特别是.Rows(x)等Range对象是棘手的野兽。这在C#插件中似乎比VBA宏更糟糕,但我经常看到当你做一些重要的内容时,它们没有按预期更新。解决方案是我在第2点给出的具体案例的一般情况:一点好,两点坏。例如,而不是调用dc.EntireRow.Copy
尝试类似:
Sheets("Monday").Rows(8).Insert