谁能告诉我以下代码为什么会导致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
事件处理程序所属的工作表所在的工作簿不同,则适用此问题比方说:
Worksheet_Change()
事件处理程序适用于后一个工作表(即“MyDataWorkbook”工作簿的“dataSheet”工作表)然后
“KickOff”宏开始处的
ThisWorkbook
指向“MyStartingWorkbook”工作簿Worksheet_Change()
事件处理程序,并且ThisWorkbook
切换到“MyDataWorkbook”工作簿如果
"Summary"
和sheet
工作表属于“MyStartingWorkbook”工作簿关于vba - Excel VBA代码导致崩溃-未知原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40630757/