[英]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.