2016-03-14 3 views
0

Я использовал код с веб-страницы Microsoft, чтобы каждый раз, когда ячейка моего диапазона менялась, окно сообщения автоматически сообщает мне, что это произошло. Страница: https://support.microsoft.com/en-us/kb/213612Макрос, который смотрит на вывод ячейки, а не на формулу

код, который я скопировал и вставил это (я слегка редактировали - редактирует в коде ниже):

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim KeyCells As Range 

' The variable KeyCells contains the cells that will 
' cause an alert when they are changed. 
Set KeyCells = Range("B1:B10") 

If Not Application.Intersect(KeyCells, Range(Target.Address)) _ 
     Is Nothing Then 

    ' Display a message when one of the designated cells has been 
    ' changed. 
    ' Place your code here. 
    MsgBox "Cell " & Target.Address & " has changed." 

End If 
End Sub 

Однако этот код не делая именно то, что я хотел бы сделать. Внутри B10 у меня есть формула:

=IF(D10="709A", IF(AND(D10="709A"), "Yes", "No"), "") 

Формула сама по себе не важна, это то, что делает формула. Формула выводит «Да» в B10, если D10 вводится с «709A». Поэтому, по моим сведениям, я должен автоматически получить окно сообщения из моего макроса, если я введу «709A» в D10, потому что он изменяет значение B10. Но я этого не делаю. Я получаю сообщение только в том случае, если сама формула изменяется, даже если выход (значение/то, что видно в ячейке, есть ли техническая метка для этого?) Не изменяется. Как я могу создать макрос, который автоматически сообщает мне, когда изменяется выход ячейки? I.e: это говорит мне, что выход изменился с «" на «Да», когда D10 вводится с «709A»?

ответ

1

Аналогичное обходное решение для предложения Романа Б, но с использованием глобального массива. Это сохраняет значения в B1: B10 при активации листа, а затем проверяет и обновляет каждый раз, когда изменения сделаны на листе. Это может быть не идеальное решение, но похоже, что он может выполнить эту задачу, чтобы проверить только 10 ячеек.

Option Explicit 
Option Base 1 

Dim globalArray(10) 

Sub Worksheet_Activate() 

Dim i As Long 

For i = 1 To 10 
    globalArray(i) = Cells(i, 2) 
Next i 

End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 

Dim i As Long 

For i = 1 To 10 
    If globalArray(i) <> Cells(i, 2) Then 
     ' Do stuff here 
     ' 
     globalArray(i) = Cells(i, 2) 
    End If 
Next i 

End Sub 
+0

Спасибо, Дейв! Yeh, похоже, что VBA не предлагает элегантного решения, которое является позором, но ваши и римские B помогают :) –

0

можно получить доступ к свойствам ячейки Formula, Text, Value и Value2. Вам нужно будет указать Value или Value2 вашей ячейки, или Text, если вы после форматированного текста.

MSDN page имеет больше информации об этих членах диапазона. This page адресует разницу между свойствами.

1

Обходной путь, который я могу придумать, состоит в том, чтобы иметь массив переменных в событии Worksheet_Change, который будет хранить свойство .value или .value2 каждой из ваших ключевых ячеек и сравнивать его с измененной ячейкой и запускать ваши окно сообщений так же. Проблема в том, что код довольно kludgey и может получить громоздкие больше ключевых ячеек, которые вы начали смотреть.

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