Так что я работаю над 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 будет рассчитывать процент восстановления для значений из моих данных, и условное форматирование будет применяться для выделения значений, которые имеют проблемы, но нужно ли это делать каждой ячейке, а не начальной ячейке, применяющей ее