Excel 删除单元格值工作表\u更改事件时崩溃

Excel 删除单元格值工作表\u更改事件时崩溃,excel,vba,Excel,Vba,每当给定范围(F5到LastRow)内的值出现时,我希望在工作表上连续运行宏(比如test1)。工作表激活和工作表更改事件在这方面有所帮助。但是,只要删除范围中的值,Excel就会崩溃。例如: F5=100,F6=120,F7=140 假设F5的值更改为120。然后宏和事件工作正常。但是,当删除所有值(因此F5 uptill F7为空)时,Excel崩溃 我试图分别运行代码中的每一行,但我不确定是什么导致崩溃(可能是宏中编写的循环) 我是VBA的初学者,非常感谢您的帮助:-) 子测试() 最后一

每当给定范围(F5到LastRow)内的值出现时,我希望在工作表上连续运行宏(比如test1)。工作表激活和工作表更改事件在这方面有所帮助。但是,只要删除范围中的值,Excel就会崩溃。例如:

F5=100,F6=120,F7=140

假设F5的值更改为120。然后宏和事件工作正常。但是,当删除所有值(因此F5 uptill F7为空)时,Excel崩溃

我试图分别运行代码中的每一行,但我不确定是什么导致崩溃(可能是宏中编写的循环)

我是VBA的初学者,非常感谢您的帮助:-)

子测试()
最后一排一样长
我想我会坚持多久
LastRow=图纸(“blad1”).范围(“F5”).结束(xlDown).行
对于i=5到最后一行
范围(“Z”&i).Formula=“=ABS(F”&i&“-(J”&i&“*(100/21)))<5”
'检查F列中的值是否与J列中的金额相匹配
“在该列中,单元格的重要性为5。返回显示为
“对还是错。
接下来我
对于i=5到最后一行
如果Range(“Z”和i)=True,则Range(“F”和i).Interior.Color=RGB(255,
255,255)Else:Range(“F”&i).Interior.Color=RGB(255,0,0)
“如果
'Z列中的值为真,则F列中的单元格颜色为白色。
“如果为假,则为红色。
接下来我
端接头
'这些是相关工作表上的行:
专用子工作表_Activate()
呼叫测试
端接头
私有子工作表_更改(ByVal目标作为范围)
最后一排一样长
LastRow=板材(“测试”).范围(“F5”).结束(xlDown).行
如果不相交(Target,Me.Range(“F5:F”&LastRow))则为零
Application.EnableEvents=False
呼叫测试
Application.EnableEvents=True
如果结束
端接头
线路

LastRow = Sheets("blad1").Range("F5").End(xlDown).Row
当F列为空时,返回的值等于最后一行可能的绝对值(1048576)。然后,宏的其余部分将遍历整个工作表,并对每一行执行代码。您可以想象当您尝试将1048572个公式插入电子表格时会发生什么。更好的选择是使用

LastRow = Sheets("blad1").Range("F" & Rows.Count).End(xlUp).Row
从下至上搜索最后使用的行。然后您可以将
工作表\u更改
逻辑为

If LastRow > 1 Then
    'Code Here
End if
编辑:

同样值得注意的是,当
LastRow=Sheets(“blad1”).Range(“F5”).End(xlDown).行
时,则此代码

If Not Intersect(Target, Me.Range("F5:F" & LastRow)) Is Nothing Then
    Application.EnableEvents = False
    Call test
    Application.EnableEvents = True
End If

在编辑F列中大于第4行的任何行号的值时,将始终计算
True
,因为
Intersect()
基本上表示“如果范围1和范围2重叠返回True”。因此,
范围(“F7”)
范围(“F5:F1048576”)
之内,而不管它是否有值。

它们在同一个模块中吗?如果是这样的话,
范围似乎不匹配-您指的是
子测试()
中的
工作表(“blad1”)
,但是更改处理程序暗示代码在
工作表(“测试”)
中。对不起,我在这篇文章中输入代码时输入错误。图纸名称实际上是blad1。在Excel中执行代码时,工作表名称彼此相等。感谢您的解释。我试试这个。仅就我的理解而言,是行。仅选择范围内存储有值的单元格进行计数?或者它也会计算空单元格?基本上,我希望自动运行宏,但仅当单元格值不为空时。
Rows.Count
返回excel中可能的行总数。它没有选择任何内容。以下参数指定了搜索方向
.End(xlUp)
.End(xlDown)
。后者将从上到下返回最后一个填充单元格的数值,前者将从下到上返回第一个填充单元格的数值。假设您已填充了
F5
F10
xlDown
将返回
5
xlUp
将返回
10
。如果没有填充单元格,
xlDown
将返回
1048576
xlUp
将返回
1
。值得注意的是,搜索从
xlDown/xlUp
参数之前指定的范围开始。也就是说,填充了
F5
F10
之后,
Range(“F1”).End(xlDown)
将返回
5
Range(“F”和Rows.Count)。End(xlUp)。Row
将返回
10
。出于您的目的,使用
Range(“F”和Rows.Count).End(xlUp).Row
最有意义,可以防止excel应用程序崩溃。再次感谢您;我理解现在设置范围,代码防止Excel文件崩溃。
If Not Intersect(Target, Me.Range("F5:F" & LastRow)) Is Nothing Then
    Application.EnableEvents = False
    Call test
    Application.EnableEvents = True
End If