如果值更改,则使用Excel VBA自动移动到单元格

时间:2015-07-03 14:43:56

标签: excel vba excel-vba cells

我将值放在从C到F的列中,其中G是从这些单元格(C到F)计算的。

当我将数字放在单元格F的末尾时,有没有办法自动移动到下一行的单元格C?

我尝试过使用宏加VBA,但似乎存在问题。

 Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$H$6" Then
        Call Macro1
    End If
End Sub

MACRO

Sub Macro1()
'
' Macro1 Macro
'
    ActiveCell.Offset(1, -3).Range("A1").Select
End Sub

在H6中,我使用F单元格的SUM来触发它,但它没有用。

Image

2 个答案:

答案 0 :(得分:0)

您只检查单元格H6。只有在H6中键入内容时,它才会移动,其他单元格将无效。

因此,测试F列(编号6):

if Target.Column = 6 then
     ....
endif

由于acive单元格可能低于编辑的单元格(如果用户按下enter键)或其他任何地方(如果用户只是单击其他位置),使用ActiveCell将是一件坏事,请改用行代替:< / p>

if Target.Column = 6 then
     call Macro1(Target.row)
end if


Sub Macro1(row as integer)
     Worksheets("TheNameOfTheSheet").Cells(row,3).Select
end sub

答案 1 :(得分:0)

只有当用户更改单元格H6中的值时,才会触发此代码。如果由于计算而改变该值,则不会触发(即因为用户更改了另一个单元格中的值)。这在https://msdn.microsoft.com/en-us/library/office/ff839775.aspx的工作表更改事件的MSDN文档中提到。

此外,我建议不要使用ActiveCell.Offset,因为您不知道运行macro1时哪个单元格将处于活动状态。如果用户在F6中键入数字并按Enter键,则F7将成为Activecell,但如果用户键入数字并按下右箭头键,则它将是单元格G6。

您可以使用Change事件中的Target,而不是使用ActiveCell,因为我们知道这是已更新的单元格:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$F$6" Then
        Macro1 LastCell:=Target
    End If
End Sub

Sub Macro1(LastCell As Range)
    LastCell.Offset(1, -3).Select
End Sub

如果您有多行数据且想要为F中的多个单元格重复宏,则可能需要测试特定的Colum(F)和一系列行号,而不是一个单元格地址。除非你做一些更复杂的事情,否则也没有必要调用一个单独的子。您可能想尝试以下内容:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 6 Then
        If Target.Row > 1 And Target.Row < 10 Then
            Target.Offset(1, -3).Select
        End If
    End If
End Sub

(您需要根据需要调整行号。)