vba - Excel VBA代码导致崩溃-未知原因

标签 vba excel crash

谁能告诉我以下代码为什么会导致Excel 2010崩溃:

Private Sub Worksheet_Change(ByVal Target As range)
Dim r As range
Dim r1 As range
Dim c As range
Dim i As Long
Dim j As Long
Dim rows As Long
Dim count As Long
Dim sheet As String
Dim sh As Worksheet
Dim range1 As range
Dim range2 As range

If WorksheetFunction.CountA(range("D5:H16")) <= 0 Then
    ActiveSheet.Unprotect
End If

Set c = Target

For i = 4 To 8
    For j = 5 To 16
        If Not i = Target.Column Then
            If r Is Nothing Then
                Set r = ActiveSheet.Cells(j, i)
            Else
                Set r = Application.Union(r, ActiveSheet.Cells(j, i))
            End If
        Else
            If r1 Is Nothing Then
                Set r1 = ActiveSheet.Cells(j, i)
            Else
                Set r1 = Application.Union(r1, ActiveSheet.Cells(j, i))
            End If
        End If
    Next
Next
rows = Target.row

sheet = CStr(ActiveSheet.Cells(rows, 2).Value)
Set sh = ThisWorkbook.Sheets(sheet)
MsgBox (sh.Name)
count = sh.range("J6").End(xlDown).row
MsgBox (count)
Set range1 = ThisWorkbook.Worksheets("Summary").range("J6:J" & count)
Set range2 = ThisWorkbook.Worksheets(sheet).range("J6:J" & count)
range1 = range2.Value

If WorksheetFunction.CountA(range("D5:H16")) <= 0 Then
    ActiveSheet.Unprotect
Else
    ActiveSheet.Unprotect
    r1.Cells.Locked = False
    r.Cells.Locked = True
    ActiveSheet.Protect
End If

End Sub

我正在尝试做的是允许用户在矩阵中选择多个选项,然后根据矩阵选择显示设备列表

谢谢

最佳答案

也许简化代码可以使您更接近崩溃的问题

如果我正确理解,您的代码可能会归结为:

Private Sub Worksheet_Change(ByVal Target As Range)               
    With Worksheets(CStr(Cells(Target.Row, 2).Value))
        With .Range("J6", .Range("J6").End(xlDown))
            Worksheets("Summary").Range("J6").Resize(.rows.count).Value = .Value
        End With
    End With

    With Range("D5:H16")
        If WorksheetFunction.CountA(.Cells) > 0 Then
            ActiveSheet.Unprotect
            .Locked = True
            Intersect(.Cells, Target.EntireColumn).Locked = False
            ActiveSheet.Protect
        End If
    End With
 End Sub

在其中添加以下问题:
  • Target大小问题

    在我看来,您假设Target始终是1个单元格range,因为您正在使用:
       Target.Column
       Target.Row
    

    这将返回一个单元格range的行和列索引以及一个多单元格range的最左单元格的行和列索引

    如果您实际上要将1单元格range处理为Target,则必须在子程序的开头添加以下行
    If Target.count > 1 Then Exit Sub
    

    否则,将被告知您的代码实际上会将Target折叠到其最左侧的单元格


  • 2)ThisWorkbook问题

    如果您要从中开始的宏所在的工作簿与您正在编码的Change事件处理程序所属的工作表所在的工作簿不同,则适用此问题

    比方说:
  • 您的主要“KickOff”宏位于某些“MyStartingWorkbook”工作簿中
  • 运行时,它将影响“MyDataWorkbook”工作簿
  • 的“dataSheet”工作表的内容
  • 您的Worksheet_Change()事件处理程序适用于后一个工作表(即“MyDataWorkbook”工作簿的“dataSheet”工作表)

  • 然后

    “KickOff”宏开始处的
  • ThisWorkbook指向“MyStartingWorkbook”工作簿
  • ,但是一旦宏更改了“MyDataWorkbook”工作簿的“dataSheet”工作表的内容,就会触发后者的Worksheet_Change()事件处理程序,并且ThisWorkbook切换到“MyDataWorkbook”工作簿

    如果"Summary"sheet工作表属于“MyStartingWorkbook”工作簿
  • ,则可能不是您想要的

    关于vba - Excel VBA代码导致崩溃-未知原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40630757/

    相关文章:

    crash - 管理 Nuget 包崩溃 VS2017

    ios - iOS 9 中神秘崩溃 : -[SKTAppDelegate application:didReceiveLocalNotification:]: unrecognized selector sent to instance

    android - Eclipse ADT已停止工作。

    .net - 使用 VBA 与 .Net 自动化 Excel 的优缺点

    java - Apache POI 评估 SXSSF 工作簿中的公式

    excel - 根据某一列中重复值的计数对数据进行分组

    excel - 如果路径不存在,则询问用户文件夹路径

    excel - 基于列值合并单元格的 VBA 宏

    Excel:写入整个 ListObject 列

    vba - 如何停止在VBA中使用ShellExecute命令创建的正在运行的任务