Проблема применения условного форматирования через udf - PullRequest
0 голосов
/ 16 мая 2018

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

udfвыглядит следующим образом:

Function AnalyzeData()
Dim Headers() As Variant
Dim Row1 As Variant

Headers = Array(Row1, Row2, Row3, Row4, Row5)

Row1 = Array("Final Curve", "", "Cr", "Fe", "Ni", "Cu", "Zn", "As", "Ag", "Cd", "Sn", "Pb")

Row2 = Array("Level", "Nominal", 100, 100, 100, 100, 100, 100, 100, 100, 100, 100)
col1 = Array("Level", "Cal 1", "Cal 2", "Cal 3", "Cal 4", "Cal 5", "Cal 6", "Cal 7", "Cal 8", "Cal 9", "Cal 10", "", "", "Level", "Cal 1", "Cal 2", "Cal 3", "Cal 4", "Cal 5", "Cal 6", "Cal 7", "Cal 8", "Cal 9", "Cal 10", "", "")
col2 = Array("", "Nominal", "0.1", "0.2", "0.5", "1.0", "2.5", "5.0", "10", "20", "30", "50", "", "", "Nominal", "0.1", "0.2", "0.5", "1.0", "2.5", "5.0", "10", "20", "30", "50", "", "")

Dim Location() As Variant

Select Case TypeName(Application.Caller)
    Case "Range"
        Location = Array(Application.Caller.Row, Application.Caller.Column)
        If Location(0) = 1 And Location(1) = 1 Then
            BuildArrays
            MethodCheck
            On Error Resume Next
            threecf

            AnalyzeData = Row1(0)
        Else
            Select Case Location(1)

                Case 1 - 2
                    Case 1
                        AnalyzeData = col1(Location(0) - 2)
                    Case 2
                        AnalyzeData = col2(Location(0) - 1)
                Case Else

                    Select Case Location(0)

                        Case 1, 14
                            AnalyzeData = SelectedAnalytes(Location(1) - 3)
                        Case 2, 15
                            AnalyzeData = Row2(Location(1) - 1)
                        Case 3 To 12
                            AnalyzeData = Round(STDArray(Location(0) - 2,Location(1) - 3), 3)
                        Case 13, 26
                            AnalyzeData = ""
                        Case 16 To 25
                            If CalValues(Location(1) - 3, Location(0) - 15) = "" Then
                                AnalyzeData = "N/A"
                            ElseIf Round(STDArray(Location(0) - 15, Location(1) - 3) / CalValues(Location(1) - 3, Location(0) - 15) * 100, 0) <= 100 + Acceptance And Round(STDArray(Location(0) - 15, Location(1) - 3) / CalValues(Location(1) - 3, Location(0) - 15) * 100, 0) >= 100 - Acceptance Then
                            AnalyzeData = Round(STDArray(Location(0) - 15, Location(1) - 3) / CalValues(Location(1) - 3, Location(0) - 15) * 100, 0) & "%"
                            Else
                                AnalyzeData = "Fail acceptance"
                            End If

                        End Select
                End Select
        End If

    Case "String"
        AnalyzeData = Application.Caller
    Case "Error"
        AnalyzeData = "Error"
    Case Else
        AnalyzeData = "unknown"
End Select

End Function

А подпункт "threecfs" -

Public Sub threecf()
Dim rg As Range
Dim cond1 As FormatCondition, cond2 As FormatCondition, cond3 As FormatCondition
Set rg = Range("C2", Range("C2").End(xlDown))

'clear any existing conditional formatting
rg.FormatConditions.Delete

'define the rule for each conditional format
Set cond1 = rg.FormatConditions.Add(xlCellValue, xlGreater, "=1")
Set cond2 = rg.FormatConditions.Add(xlCellValue, xlLess, "=$a$1")
Set cond3 = rg.FormatConditions.Add(xlCellValue, xlEqual, "=$a$1")

'define the format applied for each conditional format
With cond1
.Interior.Color = vbGreen
.Font.Color = vbWhite
End With

With cond2
.Interior.Color = vbRed
.Font.Color = vbWhite
End With

With cond3
.Interior.Color = vbYellow
.Font.Color = vbRed
End With

End Sub

, который я нашел, обратившись за помощью в этом онлайн.Таким образом, без строк

            On Error Resume Next
            threecf

Моя функция работает и анализирует данные надлежащим образом, но когда в ячейке A1 вызывается подпрограмма «threecf», ошибки не возникают без «при возобновлении ошибки далее» и при условииформатирование вообще не применяется.

Если диапазон в "threecf" изменяется на

rg=cells(1,1)

, то функция все еще требует "при возобновлении ошибки далее", но применяется условное форматирование, ноне правильно.Он добавляет условия, но без форматирования для каждого условия.

Если я запускаю «threecfs» через F5, тогда он работает правильно.

Мое понимание применения условного форматирования через udf неверно в этомне может быть сделано?

В идеале, мой udf будет рассчитывать процент восстановления для значений из моих данных, и условное форматирование будет применяться для выделения значений, которые имеют проблемы, но нужно ли это делать каждой ячейке, а не начальной ячейке, применяющей ее

...