繁体   English   中英

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

[英]Using Excel VBA to automatically move to cell if value changes

我将值放在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

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

在H6中,我使用F单元的SUM来触发它,但是它不起作用。

图片

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

因此,测试F列(数字6):

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

由于活动单元格可能位于被编辑的单元格下方(如果用户按下Enter键),或者位于其他任何位置(如果用户只是单击另一位置),那么使用ActiveCell将是一件坏事,请改用更改后的行:

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


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

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

另外,我建议不要使用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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM