2016-08-05 6 views
1

Я пытаюсь перенести часть своего условного форматирования на VBA, но применяю его к диапазонам, которые могут меняться каждый раз, когда я запускаю макрос. Я думаю, что я правильно определил свои диапазоны, переменные, формулы и форматы (никогда не делал vba format.conditions, поэтому синтаксис мог быть неправильным там). Когда я запускаю код, он останавливается на линииvba условное форматирование со стандартными отклонениями - ошибка времени выполнения с неправильным StDev

With checkrange.FormatConditions _ 
.Add(xlCellValue, xlGreater, Formula1:="=R" & cfcll.Row & "C" & q & "+ " & devone & ")") 

с ошибкой времени выполнения 5, недействительной процедурой или вызовом.

Полный фрагмент кода выглядит следующим образом:

Dim cflastrow As Long 
Dim cfrange As Range 
Dim cfcll As Range 
Dim checkrange As Range 
Dim q As Long 
Dim devone As Long 
Dim devtwo As Long 
Dim devthree As Long 
Dim devfour As Long 



cflastrow = finwb.Sheets("strt_Dash_Final").Cells(Rows.Count, 52).End(xlUp).Row 
Set cfrange = finwb.Sheets("Strt_Dash_Final").Range("AV6:AV" & cflastrow) 

For Each cfcll In cfrange 
    If cfcll.value <> "" Then 
     For q = 4 To 38 
      Set checkrange = finwb.Sheets("Strt_Dash_Final").Range(Cells((cfcll.Row + 1), q), Cells((cfcll.Row + (cfcll.value - 2)), q)) 
      devone = Application.WorksheetFunction.StDev_P(checkrange) 
       With checkrange.FormatConditions _ 
        .Add(xlCellValue, xlGreater, Formula1:="=R" & cfcll.Row & "C" & q & "+ " & devone & ")") 
        With .Font 
        .ThemeColor = xlThemeColorDark1 
        .TintAndShade = 0 
        .ThemeFont = xlThemeFontMinor 
        End With 
        With .Interior 
        .Pattern = xlSolid 
        .PatternColorIndex = xlAutomatic 
        .Color = 255 
        End With 
       End With 
       With checkrange.FormatConditions _ 
        .Add(xlCellValue, xlGreater, "=" & Cells(cfcll.Row, q).value & "+ 2*stddev(" & checkrange & ")") 
        With .Font 
        .Color = 255 
        .TintAndShade = 0 
        .ThemeFont = xlThemeFontMinor 
        End With 
        With .Interior 
        .Pattern = xlSolid 
        .PatternColorIndex = xlAutomatic 
        .Color = 49407 
        End With 
       End With 
       With checkrange.FormatConditions _ 
        .Add(xlCellValue, xlGreater, "=" & Cells(cfcll.Row, q).value & "- stddev(" & checkrange & ")") 
        With .Font 
        .ThemeColor = xlThemeColorAccent3 
        .TintAndShade = -0.499984741 
        .ThemeFont = xlThemeFontMinor 
        End With 
        With .Interior 
        .Pattern = xlSolid 
        .PatternColorIndex = xlAutomatic 
        .ThemeColor = xlThemeColorAccent3 
        End With 
       End With 
       With checkrange.FormatConditions _ 
        .Add(xlCellValue, xlGreater, "=" & Cells(cfcll.Row, q).value & "- 2*stddev(" & checkrange & ")") 
        With .Font 
        .ThemeColor = xlThemeColorDark1 
        .TintAndShade = 0 
        .ThemeFont = xlThemeFontMinor 
        End With 
        With .Interior 
        .Pattern = xlSolid 
        .PatternColorIndex = xlAutomatic 
        .Color = 5287936 
        End With 
       End With 
     Next q 
    ElseIf cfcll.value = "" Then 
     'nada 
    End If 
Next cfcll 

Кроме того, несмотря на «checkrange» диапазона, безусловно, является правильным (проверено на покупку с помощью checkrange = 5, и все значения пошел 5) devone всегда выходит как '1', когда это должно быть что-то вроде 1.23 .....

Моя теория заключается в том, что я не могу правильно использовать R1C1 в контексте формулы, но я видел, что она использовалась таким образом в нескольких других примерах, поэтому теперь действительно не уверен. Любая помощь, как всегда, очень ценится!

ответ

1

В

With checkrange.FormatConditions _ 
.Add(xlCellValue, xlGreater, Formula1:="=R" & cfcll.Row & "C" & q & "+ " & devone & ")") 

формула будет =R5C4+ 1) если cfcll.Row 5 и q составляет 4 и devone является 1.

Как вы видите, есть закрывающая скобка много.

With checkrange.FormatConditions _ 
.Add(xlCellValue, xlGreater, Formula1:="=R" & cfcll.Row & "C" & q & "+ " & devone) 

Как отлаживать? Сначала введите формулу в строковом переменном

sFormula = "=R" & cfcll.Row & "C" & q & "+ " & devone & ")" 

тогда вы бы это видели.

Для пользователей, не имеющих английских версий Excel: Формулы, установленные для FormatConditions с VBA, должны быть на языке Excel. В VBA они не должны быть на английском языке, как обычно. Таким образом, R1C1 будет Z1S1 в немецком Excel, например. Это странно и раздражает.

И для вашего devone: Это Dim ed как Long, который является целым типом. Поэтому не удивительно, что он не содержит значений Double.

+0

Ah, danke Axel !! Полностью забытый Long - это целые числа. Кроме того, я ценю советы по будущей отладке: D – IIJHFII