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 に 1 を追加するが、サブの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. [ OK]をクリックします。

Dictionary オブジェクトを使用できるようになりました。

于 2013-09-05T14:24:20.643 に答える