Запуск функции в режиме реального времени в макросе Excel

Мне нужна идея, чтобы эта функция обновлялась в режиме реального времени. Эта функция считает цвет ячеек для нужной мне работы.

Function COUNTCOLOR(celdaOrigen As Range, rango As Range)

Application.Volatile

Dim celda As Range

For Each celda In rango

    If celda.Interior.Color = celdaOrigen.Interior.Color Then
        COUNTCOLOR = COUNTCOLOR + 1
    End If

Next celda

End Function

Я уже пытаюсь запустить эту функцию

Application.CalculateFullRebuild

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

=COUNTCOLOR(A1;A1:A9998)

Где «A1» — это ячейка цвета, который мне нужен для подсчета ячеек (например, образец), а «A1: A9998» — это диапазон, в котором я хочу, чтобы формула нашла цвет в предыдущем назначенном образце. Ячейка покажет количество ячеек в диапазоне с цветом образца.

Я надеюсь, что эта информация, которую я предоставил, может помочь вам дать мне хороший ответ :)

Большое спасибо!

Нет встроенного «события», которое вызывается изменением цвета ячейки. Вам нужно будет создать свой собственный из очереди сообщений приложения.

user11314630 08.04.2019 06:22
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
1
949
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Возможно, это не самое элегантное решение, но оно работает. Идея состоит в том, чтобы запускать Sub каждые 5-10 секунд, чтобы он работал в режиме реального времени.

Вот код:

Sub COUNTCOLOR()

    Dim RunTime
    Dim COUNTCOLOR As Integer
    Dim celda As Range

    Dim lastRow As Variant
        lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    Dim rango As Range
    Set rango = Range("A1:A" & lastRow)

    For Each celda In rango

        'Compare cell interior color with cell A1
        If celda.Interior.Color = Cells(1, "A").Interior.Color Then
            COUNTCOLOR = COUNTCOLOR + 1
        End If

        Cells(1, "C").Value = COUNTCOLOR

    Next celda

    'To run sub every 5 seconds
    RunTime = Now + TimeValue("00:00:05")
    Application.OnTime RunTime, "COUNTCOLOR"

End Sub

Подход с таймером, вероятно, является лучшим возможным обходным путем. Это решение может быть немного аккуратнее. Volatile не влияет на подпрограммы; RefreshAll не требуется, если нет внешних данных; и COUNTCOLOR должен быть целым числом, чтобы возвращать 0 по умолчанию, если нет ячеек с совпадающим цветом. Отключение ScreenUpdating также не требуется при простом обновлении значения одной ячейки.

Michael 08.04.2019 07:34

Это было очень хорошее решение, но из-за моего требования я думаю, что это невыполнимо, я очень ценю ваши усилия по помощи мне. Мне было интересно, могу ли я добавить в свой исходный код что-то, чтобы он снова запускался (пересчитывал) каждый раз, когда я использую кнопку «Сохранить». Как вы думаете, это возможно? Я думаю, что это может быть хорошим решением для меня тоже! ;)

Santiago Cuartas Rmrz 08.04.2019 09:56

Затем вы можете использовать событие Workbook_BeforeSave, ниже я опубликую другое решение.

EvR 08.04.2019 09:59
Ответ принят как подходящий

Вставьте модуль класса и назовите его ClsMonitorOnupdate.

Вставьте код ниже

Option Explicit

Private WithEvents objCommandBars As Office.CommandBars
Private rMonitor As Range
Public Property Set Range(ByRef r As Range): Set rMonitor = r: End Property
Public Property Get Range() As Range: Set Range = rMonitor: End Property
Private Sub Class_Initialize()
    Set objCommandBars = Application.CommandBars
End Sub
Private Sub Class_Terminate()
    Set objCommandBars = Nothing
End Sub
Private Sub objCommandBars_OnUpdate()
    If ActiveWorkbook.Name <> ThisWorkbook.Name Then Exit Sub
    If TypeName(Selection) <> "Range" Then Exit Sub
    If Intersect(Selection, rMonitor) Is Nothing Then Exit Sub
rMonitor.Dirty 'dosomething to trigger your function
End Sub

В разделе ThisWorkbook вы указываете:

Option Explicit
Private Const sRanges As String = "A1:A100" 'adjust to your range Rango?
Private Const sSheet As String = "YourSheetName" 'adjust to your sheetname
Private cMonitor As ClsMonitorOnupdate

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Set cMonitor = Nothing
End Sub

Private Sub Workbook_Open()
    Set cMonitor = New ClsMonitorOnupdate
    Set cMonitor.Range = Sheets(sSheet).Range(sRanges)
End Sub

Настройте свое имя листа и диапазон для мониторинга, после запуска события WorkBookopen ваши диапазоны будут отслеживаться, а изменение цвета будет пересчитывать вашу функцию Countcolor (вы можете оставить application.volatile вне ее)

Другие вопросы по теме