在我的Excel表格中,我有一个范围"情节"在变化时触发子程序。我使用了以下代码:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("plot").Address Then
auto_save_data (current_plot) ' <- doesn't work
restore_data
End If
End Sub
此代码必须先将当前工作表中的数据保存到特定范围内,该范围由current_plot
在另一个工作表中定义(让我们称之为&#34; DATA&#34;),致电auto_save_data (current_plot)
然后它恢复来自&#34; DATA&#34;中的特定范围的数据。由Range("plot")
定义,通过调用restore_data
。
上面的restore_data
子例程按预期工作,但auto_save_data
没有。问题是当用户改变&#34; plot&#34;的值时我需要以某种方式知道更改之前的值是什么,因此我可以在从&#34; DATA&#34;恢复数据之前将数据保存到正确的位置。更新后的值,以及删除当前工作表中的数据。
我尝试使用Worksheet_SelectionChange
事件,如here所述:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim current_plot As Variant
If Target.Address = Range("plot").Address Then
current_plot = Target.Value
End If
End Sub
但它有两个问题:
Worksheet_Change
似乎没有认识到变量current_plot
的值,虽然它没有抛出错误。所以我的问题是:什么是最简单的方法(我对VBA很新)在例程Target
之前使用Worksheet_Change
{ {1}}已被触发?
编辑:我改变了#34;情节&#34;要成为单个细胞范围($ P $ 2),要将问题集中在真正的问题上。
答案 0 :(得分:2)
假设&#34; Plot&#34;是工作表中的单个单元格范围,其中包含Name
&#34; DATA&#34;,将以下代码放在Worksheets("DATA")
的代码模块中:
'Declare a variable with global scope, i.e. accessible in this worksheet
'and in other code modules.
Public current_plot As Variant
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("plot").Address Then
'Use "current_plot" whenever the cell is changed
MsgBox "Old value: " & current_plot & vbCrLf & _
"New value: " & Target.Value
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = Range("plot").Address Then
'Update "current_plot" whenever the cell is selected
current_plot = Target.Value
End If
End Sub
并将此代码放在ThisWorkbook
代码模块中:
Private Sub Workbook_Open()
'Initialise "current_plot" when the workbook is opened
Worksheets("DATA").current_plot = Worksheets("DATA").Range("Plot").Value
End Sub
假设您不想知道单元格中曾经存在的内容,而是您实际上想知道上次使用单元格值时单元格中的内容,您可以通过使用以下内容简化这一点:
'Declare a variable with global scope, i.e. accessible in this worksheet
'and in other code modules.
Public current_plot As Variant
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("plot").Address Then
'Use "current_plot" whenever the cell is changed
MsgBox "Old value: " & current_plot & vbCrLf & _
"New value: " & Target.Value
'...
'... process whatever needs to be processed
'...
'Save the value we used this time
current_plot = Target.Value
End If
End Sub
并将此代码放在ThisWorkbook
代码模块中:
Private Sub Workbook_Open()
'Initialise "current_plot" when the workbook is opened
Worksheets("DATA").current_plot = Worksheets("DATA").Range("Plot").Value
End Sub