Правильно называть клетку формулой из макроса в Excel VBA - PullRequest
0 голосов
/ 02 мая 2019

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

enter image description here

ячейки содержат =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 ]

3 голосов
/ 02 мая 2019

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

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

1 голос
/ 03 мая 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...