Модуль автозапуска в Excel

#vba #excel

#vba #excel

Вопрос:

У меня есть модуль в Excel, который мне нужно запускать автоматически при изменении любой ячейки на листе.

В нынешнем виде он запускается, если я перехожу в режим редактирования в ячейке, в которой есть функция, а затем нажимаю enter или если я нажму Ctrl Alt F9 . Как я могу это сделать? Кроме того, я не очень разбираюсь в макросах и модулях VB или Excel и не писал этот код.

Это код, который находится в моем модуле…

 Function ColorFunction(rColor As Range, rRange As Range, Optional SUM As Boolean)
Dim rCell As Range
Dim lCol As Long
Dim vResult
lCol = rColor.Interior.ColorIndex

If SUM = True Then
    For Each rCell In rRange
        If rCell.Interior.ColorIndex = lCol Then
            vResult = WorksheetFunction.SUM(rCell, vResult)
        End If
            Next rCell
        Else
            For Each rCell In rRange
                If rCell.Interior.ColorIndex = lCol Then
                vResult = 1   vResult
            End If
        Next rCell
    End If
ColorFunction = vResult
End Function
  

Комментарии:

1. При изменении значения ячейки используется ли условное форматирование для изменения внутреннего цвета ячейки?

2. Нет, ячейки должны быть окрашены вручную, потому что мы отслеживаем использование портов в наших коммутационных панелях.

3. Изменение цвета не вызывает событие или повторное вычисление. Вам нужно будет сделать то, что вы делаете в данный момент, или нажать кнопку, чтобы запустить код. Я полагаю, вы могли бы использовать Application.OnTime для запуска обычной процедуры, чтобы проверить, изменился ли цвет ячейки. Это не самое лучшее решение, поскольку (на мой взгляд) оно замедляет работу Excel и его легко прервать. Другой вариант — создать процесс, позволяющий пользователю изменять цвет, который затем также может пересчитывать формулу.

4. Лучшим вариантом является условное форматирование — изменение значения, которое также приводит к изменению цвета.

5. В ячейках нет никакой информации, кроме цвета.

Ответ №1:

Я бы просто поместил Application.Volatile начало вашего макроса, похоже, это работает так, как ожидалось, когда я его тестирую, однако обратите внимание на комментарий Энди Джи выше:

… изменение цвета не вызовет повторного вычисления и не вызовет событие изменения …Изменение значения ячейки не влияет на результат формулы

Если вы хотите, чтобы изменение цвета вызывало повторное вычисление, нам понадобится другой подход.

 Function ColorFunction(rColor As Range, rRange As Range, Optional SUM As Boolean)
Dim rCell As Range
Dim lCol As Long
Dim vResult
Application.Volatile
lCol = rColor.Interior.ColorIndex

If SUM = True Then
    For Each rCell In rRange
        If rCell.Interior.ColorIndex = lCol Then
            vResult = WorksheetFunction.SUM(rCell, vResult)
        End If
            Next rCell
        Else
            For Each rCell In rRange
                If rCell.Interior.ColorIndex = lCol Then
                vResult = 1   vResult
            End If
        Next rCell
    End If
ColorFunction = vResult
End Function
  

Комментарии:

1. Хорошо, похоже, что раскраска ячейки не считается «изменением» ячейки, но это пересчитывается всякий раз, когда я редактирую ячейку. Хмммммм Интересно, есть ли способ вызвать его срабатывание при окрашивании ячейки.

2. Правильно, простое окрашивание ячейки не вызывает никакого события и не вызывает вычисления ни при каких обстоятельствах. ОДНАКО я думаю, что он будет пересчитан, если цвета ячеек задаются правилами условного форматирования — потому что это вычисляемые формулы.

3. К сожалению, я не могу сделать их цветными на основе условного форматирования, потому что я отслеживаю использование портов в наших коммутационных панелях, и мы никогда не знаем, когда кабели будут добавлены или удалены.

4. Я не знаю, почему вы думаете, что это мешает вам использовать условное форматирование. Конечно, вам придется поддерживать правила форматирования и периодически обновлять их, но вы наверняка МОЖЕТЕ использовать условное форматирование…

5. Я не понимаю, как бы я это сделал тогда.