2013-09-30 7 views
1

мне нужна функция, которая проверяет, является ли конкретный диапазон ячеек в VBA был изменен:проверка изменения VBA в определенном диапазоне ячеек

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Range("A9:J100")) Is Nothing Then 
     MsgBox Target.Address 
    End If 
End Sub 

Этого код работает, проблема: они изменили на одни и те же значения (бросить интернет-обновление). Как проверить, действительно ли обновленные значения ячеек изменились на новые? (Без проверки один за другим OFC)

Заранее спасибо

+1

Вопросы, требующие кода, должны демонстрировать минимальное понимание решаемой проблемы. Включите попытки решения, почему они не работают и ожидаемые результаты. См. Также: [Контрольный список вопросов переполнения стека] (http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist) –

+3

Вам нужно будет сохранить их содержимое в другом месте и сравнить их ... –

+0

I ' m, не запрашивая код, я знаю, как кодировать (я по сути дела делал это), чтобы решить описанную проблему, вопрос о функциональности VBA Excel Events. Вместо жесткого кодирования что-то, что, возможно, уже разрешено инструментом. Я пытаюсь решить (как это можно прочитать в коде) и увидел решение, которое dnt удовлетворяет моему предложению .. я действительно не понимаю этого критика, но хорошо – Orange

ответ

3

В этом небольшом примере мы сохранить память блока данных и таким образом можем проверить, если какое-либо значение фактически изменилось. Обратите внимание на то, что память была уменьшена выше субстанции, чтобы сделать ее статической:

Dim MemoryOfThingsPast() As Variant 
Dim init As Long 
Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim Interesting As Range 
    Dim I As Long, J As Long, K As Long 
    Set Interesting = Range("A9:J100") 
    If init = 0 Then 
     MemoryOfThingsPast = Interesting 
     init = 1 
     Exit Sub 
    End If 
    If Intersect(Target, Interesting) Is Nothing Then Exit Sub 
    K = 1 
    For I = LBound(MemoryOfThingsPast, 1) To UBound(MemoryOfThingsPast, 1) 
     For J = LBound(MemoryOfThingsPast, 2) To UBound(MemoryOfThingsPast, 2) 
      v1 = Interesting(K) 
      v2 = MemoryOfThingsPast(I, J) 
      If v1 <> v2 Then 
       MsgBox "Cell " & Interesting(K).Address & " has really changed" 
      End If 
      K = K + 1 
     Next J 
    Next I 
    MemoryOfThingsPast = Interesting 
End Sub 
+0

. Я думаю, что единственное, что я изменил, было, если v1 <> v2 или init = 0, тогда init = 1. Хорошо работает для моих целей, спасибо. –

+0

@JakeGaston Вы очень желанны! –

Смежные вопросы