2013-09-05 28 views
0

我想學習一點VB,並有一個練習來改變一個值,並檢查以前的值,如果它是不同的做一些事情。我終於找到了一個解決方案,我能理解,並獲得來自工作:How do I get the old value of a changed cell in Excel VBA? - 液4. 我的代碼是:VB - Excel檢查以前的值給出了一個錯誤

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,但隨後在對Worksheet_Change子的If previousRange.Exists(cell.Address)聲明翻倒。 所有代碼都是在Sheet1上定義的,但我似乎沒有爲我的按鈕值(C3)生成以前的值。我如何生成以前的值,或者我錯過了什麼?

問候 Ĵ

正如我似乎已經把事情弄得更糟我創建了一個新的電子表格,只需改變事件的代碼並沒有別的嘗試簡化問題。因此,完整的代碼我現在是:

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.

回答

0

的.Exists方法用於在字典對象,例如您所列舉的例子。但是我沒有看到你在代碼中聲明瞭哪個字典對象。也許你錯過了它的聲明聲明?

Dim previousrange As New Dictionary 

請注意,就像您引用的解決方案一樣,您需要在子例程之前聲明它。另外,您需要啓用Microsoft腳本運行時。具體方法如下:

  1. 在VBA編輯器,進入工具菜單,點擊引用...
  2. 在可用引用列表框中,向下滾動,直到您看到Microsoft腳本運行時 。確保它的複選框被選中。
  3. Click OK

現在您可以使用Dictionary對象。

+0

亞倫,我想我已經倒退了。我試着添加你的代碼,但我仍然有錯誤。只要incase我錯了我刪除了我添加了(這是不承認和包括一個評論),並再次嘗試。我現在正在'未定義用戶定義類型'。我擔心我刪除了通用目錄類,我不知道如何將其添加回來? J – user2750980

+0

嗯,不知道發生了什麼事。也許你可以添加你現有的東西,到你最初的問題的結尾?你可以通過編輯你的問題來做到這一點。 –

+0

亞倫,我編輯了我的問題。在此先感謝J. – user2750980