Правильно называть клетку формулой из макроса в Excel VBA

Я пытаюсь разработать небольшой планировщик в Excel, чтобы управлять своей жизнью немного лучше. Я использую разные цвета ячеек для каждого события (желтый для работы, красный для университета и т. Д.). У меня уже есть макрос CountColor который считает появление цвета в определенном диапазоне, который работает нормально (я в значительной степени скопировал его из онлайн-решения). Теперь я использую макрос для вычисления использованного времени в ячейках, например:

клетки содержат =ColorCount(H5;B2:F15) тогда как внутренний цвет первого аргумента определяет цвет для подсчета, а параметр секунд - это диапазон для подсчета цвета. Этот макрос работает отлично. Последнее число является просто суммой трех вышеупомянутых.

Однако теперь я сталкиваюсь с проблемой, заключающейся в том, что изменение внутреннего цвета ячейки не вызывает перерасчета формул. Я создал простую кнопку (не ActiveX) и назначил ей макрос:

Public Sub CalcButton_onclick()
    Worksheets(1).Range("I13:I16").Calculate
End Sub

но когда я нажимаю кнопку (я также пытался пересчитать весь лист с помощью Worksheets(1).Calculate) Ничего не произошло. Например, только когда я изменяю значение в ячейке, мое время пересчитывается. Макрос моей кнопки определенно выполнен, я проверил это, добавив Worksheets(1).Cells(20, 20).Value = "Test" после Calculate вызов и он изменил значение данной ячейки правильно.

В целях завершения я также добавляю код макроса CountColor:

'counts the occurence of the interior color of rColor in rRange
Public Function ColorCount(ByRef rColor As Range, ByRef rRange As Range) As Integer
    Dim rCell As Range
    Dim lCol As Long
    Dim vResult As Integer
    vResult = 0
    lCol = rColor.Interior.ColorIndex
    For Each rCell In rRange
        If rCell.Interior.ColorIndex = lCol Then
            vResult = 1 + vResult
        End If
    Next rCell
    ColorCount = vResult
End Function

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

Кстати, что-то мета: это правильное использование картинки в вопросе? Я не мог придумать лучшего способа показать, как я хочу, чтобы мой результат выглядел.

2 ответа

Решение

Я сам нашел проблему.

Сначала я хочу поблагодарить всех за их советы и подсказки. Вероятно, они понадобились бы мне после исправления моей первоначальной проблемы, поэтому я решил их заранее:)

На самом деле моя проблема заключалась в том, что я хотел объявить свое свободное время белым цветом. Но на самом деле у меня было несколько ячеек, у которых после заливки каждой свободной ячейки явно белым было "нет цвета заливки", теперь она работает с кнопкой. Решение с Worksheet_Change() Метод в коде листа, к сожалению, не работает, потому что изменение цвета не оценивается как изменение в листе. Worksheet_SelectionChange() однако сделал трюк с обновлением, когда вы нажимаете на другую ячейку, поэтому мне больше не нужна кнопка.

Помогло бы сделать ваш UCF изменчивым с помощью colorcount UDF (добавьте Application.Volatile), но, как вы обнаружили, изменение цвета или форматирование ячейки не вызывает перерасчет, поэтому даже изменяемый UDF не будет пересчитываться только при изменении цвета.

Если вы сделаете свой UDF изменчивым, то Range.Calculate должен вызвать пересчет в режиме автоматического расчета.

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