我要在范围更改时激活宏。
以下代码可以正常工作,除了我要在最后一行使用变量(当前B100
在哪里)。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B1:B100")) Is Nothing Then
MsgBox "Updating sheets"
Call Thickborders2
End If
End Sub
该范围中的B100
取决于最后一行中是否有文字。
答案 0 :(得分:0)
您可以借用工作表技巧来查找其中包含文本的最后一行。
=MATCH("zzz", B:B)
上面的代码返回带有文本值的B列的最后一行。
Private Sub Worksheet_Change(ByVal Target As Range)
dim m as variant
m = application.match("zzz", columns("B"))
if iserror(m) then m = 1
If Not Intersect(Target, Range("B1").resize(m, 1)) Is Nothing Then
MsgBox "Updating sheets"
Call Thickborders2
End If
End Sub
我强烈建议添加错误控制(on error goto <label>
)和禁用事件触发器(application.enableevents = false
)。记得在退出子级之前重新启用事件。
答案 1 :(得分:0)
正如我在对OP的评论中所说-Worksheet_Change
本身将不起作用,因为它将根据刚刚输入的数据来计算最后一个单元格。
此代码将在您移动单元格时计算最后一个单元格(我尝试了Calculate
事件,但是这种情况发生在添加数据之后,与Change
事件一样,都是同样的问题)。
Option Explicit
Private rLastCell As Range
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set rLastCell = Cells(Rows.Count, 2).End(xlUp)
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range(Cells(1, 2), rLastCell)) Is Nothing Then
MsgBox "Updating sheets"
Call Thickborders2
End If
End Sub
前两行必须在模块的顶部。
答案 2 :(得分:-1)
以Taazar和L42的评论为基础,尝试:
Private Sub Worksheet_Change(ByVal Target As Range)
LastCell = Activesheet.Usedrange.Rows.Count
If Not Intersect(Target, Range("B1:B" & LastCell)) Is Nothing Then
MsgBox "Updating sheets"
Call Thickborders2
End If
End Sub
Activesheet应替换为您要检查的工作表名称。