【问题标题】:Excel 2013 stops working in subExcel 2013 停止在 sub 中工作
【发布时间】:2016-09-26 12:54:51
【问题描述】:

我正在使用 VBA 代码,当单元格选择器移动时,它会突出显示活动单元格的边框颜色。

代码是

Private mOutline As Shape  
Private Const SelectedShapeName As String = "Selection Box"

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

    Dim SelectedShape As Shape
    Dim SelectedArea As Range

    On Error Resume Next
    For Each SelectedShape In Sh.Shapes
        If SelectedShape.Name = SelectedShapeName Then
            SelectedShape.Delete
        End If
    Next SelectedShape

    For Each SelectedArea In Selection.Areas
        Set mOutline = ActiveSheet.Shapes.AddShape(msoShapeRectangle, SelectedArea.Left, SelectedArea.Top, SelectedArea.Width, SelectedArea.Height)
        With mOutline.OLEFormat.Object.ShapeRange
            .Fill.Visible = msoFalse
            .Line.ForeColor.RGB = RGB(255, 0, 0)
            .Line.Transparency = 0
            .Line.Weight = 3
        End With
        mOutline.Name = SelectedShapeName
    Next SelectedArea
    On Error GoTo 0 End Sub

当我右键单击工作表中的列标题时,Excel 突然停止工作并存在。

有谁知道是什么导致了这个错误,如果知道,我该如何修改我的代码来避免这种情况?

谢谢。

【问题讨论】:

  • 取出On Error Resume Next 并在调试器中单步执行。哪一行导致崩溃?
  • Set mOutline = ActiveSheet.Shapes.AddShape(msoShapeRectangle, SelectedArea.Left, SelectedArea.Top, SelectedArea.Width, SelectedArea.Height) 行出现运行时错误“1004”“特定值超出范围”
  • 当您说“右键单击列标题”时,您指的是单元格还是列选择区域?
  • 列选择区域。
  • 你应该测试一下Selection.Rows.Count = Rows.Count,因为我看不出在整个列周围放置一个矩形有什么好处,即使它确实有效。

标签: excel error-handling excel-2013 vba


【解决方案1】:

您的代码正在尝试添加一个太高而 Excel 无法处理的形状。当你右键单击时,它会选择整个列,所以SelectedArea.Top 是 0 而SelectedArea.Height 是一个大得离谱的数字(在我的机器上是 15728640)。这导致ActiveSheet.Shapes.AddShape 失败。

完全删除On Error Resume Next 行。您忽略了 1004 错误而不是处理它。然后下一行代码尝试取消引用不存在的OLEObject(这将是第二个被忽略的错误),然后尝试将属性分配给空引用(这将是第三个被忽略的错误)。我不会通过测试找出是哪一个导致 Excel 崩溃,但我猜测第二个或第三个导致访问冲突。

添加适当的错误处理,或者更好的是,通过测试查看您是否有有效的Target 来避免错误:

'Assuming you want to limit to one cell
If Target.Rows.Count > 1 Or Target.Columns.Count > 1 Then Exit Sub

【讨论】:

    猜你喜欢
    • 2016-01-02
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    相关资源
    最近更新 更多