使用Worksheet_Change时 - 如何在更改前获取单元格中的值?

时间:2017-05-28 19:43:30

标签: excel excel-vba vba

在我的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

但它有两个问题:

  1. 它没有用。子例程Worksheet_Change似乎没有认识到变量current_plot的值,虽然它没有抛出错误。
  2. 我尝试了the question above中的另一种方法,将旧值保存到隐藏的工作表中。这是有效的,除非用户更改了&#34; plot&#34;首先不选择另一个范围(然后隐藏工作表中的值不会更新)。
  3. 所以我的问题是:什么是最简单的方法(我对VBA很新)在例程Target之前使用Worksheet_Change { {1}}已被触发?

    编辑:我改变了#34;情节&#34;要成为单个细胞范围($ P $ 2),要将问题集中在真正的问题上。

1 个答案:

答案 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