搜索/复制/插入VBA宏在Excel 2016中导致多个不同的崩溃

时间:2016-05-13 02:03:06

标签: excel vba excel-vba

我在使用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

这通常适用于星期一。我通常可以多次击中那个而没有问题。

当我返回人工日志表并将日期更改为任何其他日期时,我在点击宏时会开始在这些表格上出错。宏代码完全相同,但相关日期输入正确的位置。

我经常遇到的第一个错误是:

enter image description here

进行调试说错误:

enter image description here

然后我停止宏并再次运行它,得到以下错误:

enter image description here

调试它给出了这一行:

enter image description here

之后,我可以关闭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

我在网上搜索了各种答案,但它们似乎没有用。我尝试了以下内容:

  • 清除C:\ Users \ User_Name \ AppData \ Roaming \ Microsoft \ Excel
  • 中的Excel文件夹
  • 清理注册表
  • 长宁设置打印机(远射,但看到一些人说它有效)
  • 在星期一前一天运行
  • 运行Windows Update
  • 在If循环中移动Application.CutCopyMode = False

我对VBA的了解并不是很好,很多代码都是从搜索中获取的,并根据我的目的进行了修改,但我不明白为什么它适用于星期一表,但会崩溃所有其他代码。 / p>

非常感谢任何见解。

感谢。

2 个答案:

答案 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
    

以上所有内容仍然可以大大改善,但它至少会给你带来以下好处:

  • 编写更少的代码

    因此两者在维护它方面的努力要少得多,并且可能有很多错误!

  • 没有使用复制/粘贴方法来不通过剪贴板而且速度更快

为了进一步有效改进,我建议您执行以下步骤:

答案 1 :(得分:0)

虽然我同意user3598756,但这还不足以确定答案,我还有其他一些尝试:

  1. 我使用.CurrentRegion获得了比.UsedRange更好的结果,以获得数据区域。也有例外情况,但如果您的标题不能为空且至少有一列没有空格,则可以完美运行。

  2. 当一行中有多个内容导致错误时,将其分解会为您提供有关崩溃的更好信息,因此请将dc.Resize(1, 1).EntireRow.Copy更改为两个语句:dc.Resize(1,1)和{ {1}}。

  3. COM对象,特别是.Rows(x)等Range对象是棘手的野兽。这在C#插件中似乎比VBA宏更糟糕,但我经常看到当你做一些重要的内容时,它们没有按预期更新。解决方案是我在第2点给出的具体案例的一般情况:一点好,两点坏。例如,而不是调用dc.EntireRow.Copy尝试类似:

  4. Sheets("Monday").Rows(8).Insert
    1. 最后,我养成了不更新不活跃的床单的习惯。相反,我激活了表单,我将进行更改,进行更改,然后返回到最初活动的工作表。这模仿了用户手动进行更改的方式,这也有助于直观地显示宏在调用中导致错误的位置。