更改范围内的可变行时激活宏

时间:2018-12-18 09:41:18

标签: excel vba

我要在范围更改时激活宏。

以下代码可以正常工作,除了我要在最后一行使用变量(当前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取决于最后一行中是否有文字。

3 个答案:

答案 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应替换为您要检查的工作表名称。