0

我正在尝试学习一些 VB,并且有一个练习可以更改一个值并检查以前的值,如果它不同,请执行一些操作。我最终找到了一个我可以理解并开始工作的解决方案:如何在 Excel VBA 中获取已更改单元格的旧值? - 解决方案4。我的代码是:

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim cell As Variant

    For Each cell In Target
        If previousRange.Exists(cell.Address) Then
            If Not Application.Intersect(Target, Me.Range("B12:B12")) Is Nothing Then
                If previousRange.Item(cell.Address) <> cell.FormulaR1C1 Then
                    cell.Interior.ColorIndex = 36
                End If
            End If
        End If
    Next

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim cell As Variant

    Set previousRange = Nothing 'not really needed but I like to kill off old references
    Set previousRange = CreateObject("Scripting.Dictionary")

    For Each cell In Target.Cells
        previousRange.Add cell.Address, cell.FormulaR1C1
    Next

End Sub

下一个练习是添加一个按钮并根据用户的响应执行操作。所以我补充说:

Private Sub CommandButton2_Click()
    Dim currentValue, message As Integer

    currentValue = Range("C3").Value
    message = MsgBox("Click OK to add 1, cancel to leave", vbOKCancel, "Addition")

    If message = 1 Then
        Range("C3").Value = currentValue + 1
    End If
End Sub

我遇到的问题是该按钮向 C3 添加了一个,但随后在子上的If previousRange.Exists(cell.Address)语句处掉了Worksheet_Change下来。所有代码都在 Sheet1 上定义,但我似乎没有为我的按钮值(C3)生成以前的值。如何生成以前的值,或者我缺少什么?

问候 J

由于我似乎让事情变得更糟,我创建了一个新的电子表格,其中只包含更改事件代码,没有其他任何东西可以尝试简化问题。所以我现在拥有的完整代码是:

Option Explicit
Dim previousRange As New Dictionary

Private Sub Worksheet_Change(ByVal Target As Range)

Dim cell As Variant

For Each cell In Target
    If previousRange.Exists(cell.Address) Then
        If Not Application.Intersect(Target, Me.Range("B12:B12")) Is Nothing Then
            If previousRange.Item(cell.Address) <> cell.FormulaR1C1 Then
                cell.Interior.ColorIndex = 36
            End If
        End If
    End If
Next

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim cell As Variant

Set previousRange = Nothing 'not really needed but I like to kill off old references
Set previousRange = CreateObject("Scripting.Dictionary")

For Each cell In Target.Cells
    previousRange.Add cell.Address, cell.FormulaR1C1
Next

End Sub

现在,如果我更改 B12 单元格,previousRange As New Dictionary代码将突出显示,并显示一条消息“编译错误:未定义用户定义类型”。在我引入消息框并进行后续更改之前,此代码曾经有效。一定是用户错误。你能帮我吗?

问候J。

4

1 回答 1

0

.Exists 方法用于字典对象,就像您引用的示例一样。但是我看不到您在代码中的何处声明了字典对象。也许您缺少它的声明声明?

Dim previousrange As New Dictionary

请注意,就像您引用的解决方案一样,您需要在子例程之前声明它。此外,您还需要启用 Microsoft Scripting Runtime。就是这样:

  1. 在 VBA 编辑器中,转到工具菜单并单击参考...
  2. 在可用引用列表框中,向下滚动直到您看到Microsoft Scripting Runtime。确保选中其复选框。
  3. 单击确定

现在您可以使用 Dictionary 对象了。

于 2013-09-05T14:24:20.643 回答