2015-07-28 5 views
1

Итак, у меня есть функция в excel, которая в основном добавляет, сколько желтых ячеек есть строка.Функция VBA Excel не работает постоянно

Function CountColorIf(rArea As Range) As Long 

    Dim rAreaCell As Range 
    Dim lCounter As Long 


    For Each rAreaCell In rArea 

     If rAreaCell.Interior.ColorIndex = 6 Then 

      lCounter = lCounter + 1 

     End If 

    Next rAreaCell 

    CountColorIf = lCounter 
End Function 

код работает, но не сразу ... Так, например, сказать, что я сделать два из клеток желтого, я тогда должен щелкнуть backinto ячейку, в которой эта функция находится и нажмите ввод для правильного появится номер.

Может ли кто-нибудь показать мне, как сделать так, чтобы он работал в любое время, когда рабочий лист был изменен?

Я нашел что-то о Worksheet.event (извините что-то подобное), но из моего понимания, что работает только с суб, а не с функцией.

Любая помощь была бы действительно уязвлена!

Приветствия

Sam

+0

возможно дубликат [значения Excel не обновляя] (http://stackoverflow.com/questions/7389065/excel-values-not-updating) – GSerg

+1

почему не только рассчитывать на основе условий, которые вызывают желтый и пропустить подсчет цвета интерьера? – sous2817

ответ

1

Вы можете отметить функцию Volatile поэтому он получает повторно Calced каждый раз, когда есть изменения. Это может быть очень интенсивным CPU, хотя из-за того, что даже ввод числа приведет к его запуску.

Application.Volatile (True) 
+0

Это все равно не будет реагировать на простое изменение цвета, хотя функция будет, по крайней мере, пересчитываться, когда что-то еще заставляет книгу пересчитывать. Bottom Line: цвет должен использоваться для освещения данных, а не как данные. – Rory

0

EDIT: Это не будет работать для вас

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


За исключением Application.Volatile будет событие Worksheet_Change. Он запускается всякий раз, когда на рабочем листе происходит изменение. Я переворачиваю некоторые вещи для этого, поэтому для получения больших ресурсов требуется меньше ресурсов.

Чтобы работать, его необходимо вставить в код вашего рабочего листа (а не модуль).

Private Sub Worksheet_Change(ByVal Target As Excel.Range) 

    Dim rng as Range 

    Application.enableevents = False 
    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 

    If Not Intersect(Target, Sheet1.Cells) Is Nothing Then 
     set rng = ActiveCell.Entirerow 
     msgbox "There are " & CountColorIf(rng) & " yellow cells in this row!" 
    End If 

    Application.ScreenUpdating = True 
    Application.enableevents = True 
    Application.Calculation = xlCalculationAutomatic      
End Sub 
+0

Вы правы, что workheet_change является вспомогательным, но сам sub может вызвать вашу функцию! В этом случае я назвал его частью сообщения пользователю. –

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