Страницы: 1
RSS
И снова о .DecimalSeparator и региональных стандартах.
 
*могли бы и не строить вавилонскую башню - сейчас бы проблем не огребали*  
 
Ладно, к делу. Навешиваю УФ кодом:  
 MaxOt = 0.01  
 With Range("A1").FormatConditions  
 .Delete  
 .Add Type:=xlExpression, Formula1:="=ИЛИ(RC>" & MaxOt & ";RC<" & -MaxOt & ")"  
 .Item(1).Interior.ColorIndex = 36  
 End With  
 
И замечаю ошибку на строке .Add при разных .DecimalSeparator, то есть при одном есть, при другом нет ошибки.  
Ошибка в Formula1:="=ИЛИ(RC>" & MaxOt & ";RC<" & -MaxOt & ")"    
MaxOt переводится в текст, а потом этот текст должен обратно стать числом.  
Решение очевидно - переводить в текст и менять точку на запятую или наоборот.  
Вопрос в том, как это сделать покороче, попроще и т.п. (конкурс объявлять не будем :-D).  
Естественно автоматически определять что на что менять.  
И мне совершенно непонятно почему в то же самое время Range("B1").FormulaR1C1 = "=RC[-1]+" & MaxOt совершенно индифферентно относится к .DecimalSeparator
Bite my shiny metal ass!      
 
"И мне совершенно непонятно почему в то же самое время Range("B1").FormulaR1C1 = "=RC[-1]+" & MaxOt совершенно индифферентно относится к .DecimalSeparator"
 
Здравствуйте Лузер,  
 
Если MaxOt = 0.01 числовая константа VBA? Причем здесь формат отображения разделителя разряда? Она по определению совершенно индифферентно относится к .DecimalSeparator.
 
И Вам не хворать, VovaK!  
MaxOt не константа. Самая что ни на есть переменная. Иначе зачем этот огород?  
Попробуйте эти два макроса:  
Sub Макрос1()  
   With Application  
       .DecimalSeparator = ","  
       .UseSystemSeparators = False  
   End With  
 
 MaxOt = 0.01  
 With Range("D1").FormatConditions  
 .Delete  
 .Add Type:=xlExpression, Formula1:="=RC[-1]+" & MaxOt
 .Item(1).Interior.ColorIndex = 36  
 End With  
End Sub  
Sub Макрос2()  
   With Application  
       .DecimalSeparator = "."  
       .UseSystemSeparators = False  
   End With  
 
 MaxOt = 0.01  
 With Range("D1").FormatConditions  
 .Delete  
 .Add Type:=xlExpression, Formula1:="=RC[-1]+" & MaxOt
 .Item(1).Interior.ColorIndex = 36  
 End With  
End Sub  
 
 
один из них даст ошибку  
 
А вот с     Range("D2").FormulaR1C1 = "=RC[-1]+" & MaxOt
я погорячился.  
 
Не дает ошибок только если в региональных настройках винды точка.  
Даже не так. в FormulaR1C1 нужно в любом случае подставлять число в виде текста с разделителем точка. Т.е. тут все просто:  
   MaxOt = 0.01  
   myStr = Replace(MaxOt, ",", ".")  
   Range("D2").FormulaR1C1 = "=RC[-1]+" & myStr
Bite my shiny metal ass!      
 
Sub Test()  
 Dim ds$, s$, n#  
 n = 0.01  
 With Application  
    If .UseSystemSeparators Then ds = Mid$(1.2, 2, 1) Else ds = .DecimalSeparator  
 End With  
 s = Replace(Str(n), ".", ds)  
 With Range("A1").FormatConditions  
   .Delete  
   .Add Type:=xlExpression, Formula1:="=ИЛИ(RC>" & s & ";RC<-" & s & ")"  
   .Item(1).Interior.ColorIndex = 36  
 End With  
End Sub
 
Чтобы не зависеть от локализации, т.е. чтобы исключить русское ИЛИ:  
.Add Type:=xlExpression, Formula1:="=(RC>" & s & ")+(RC<-" & s & ")>0"
 
Спасибо, ZVI.  
Я уже нашел Вашу функцию DecSep() от мая прошлого года.  
У меня получилось аналогично:  
 
Sub Макрос3()  
y$ = DecSep()  
 MaxOt = 0.01  
 MaxOtS$ = Replace(CStr(MaxOt), Mid$(CStr(0.1), 2, 1), y)  
 With Range("A1").FormatConditions  
 .Delete  
 .Add Type:=xlExpression, Formula1:="=ИЛИ(RC>" & MaxOtS$ & ";RC<-" & MaxOtS$ & ")"  
 .Item(1).Interior.ColorIndex = 36  
 End With  
End Sub  
 
Function DecSep() As String  
With Application  
If .UseSystemSeparators Then  
DecSep = Mid$(CStr(0.1), 2, 1)  
Else  
DecSep = .International(xlDecimalSeparator)  
End If  
End With  
End Function  
 
 
только оно мне показалось громоздким (столько строк из-за "какой-то" запятой) и я решил открыть тему.
Bite my shiny metal ass!      
 
{quote}{login=ZVI}{date=21.10.2009 11:22}{thema=}{post}Чтобы не зависеть от локализации, т.е. чтобы исключить русское ИЛИ:  
.Add Type:=xlExpression, Formula1:="=(RC>" & s & ")+(RC<-" & s & ")>0"{/post}{/quote}И за это спасибо.  
Я думал над этим, но не слишком усердно - маловероятно, что этот макрос станет интернациональным :)
Bite my shiny metal ass!      
 
Можно я нажму синенький? :-)
 
Для Вашего конкретного случая можно проще:  
Sub Test()  
 Dim ds$, s$, n#  
 n = 0.01  
 s = Format(n, "0%")  
 With Range("A1").FormatConditions  
   .Delete  
   .Add Type:=xlExpression, Formula1:="=(RC>" & s & ")+(RC<-" & s & ")>0"  
   .Item(1).Interior.ColorIndex = 36  
 End With  
End Sub
 
{quote}{login=ZVI}{date=21.10.2009 11:54}{thema=}{post}Для Вашего конкретного случая можно проще:{/post}{/quote}Точно! Даром, что у меня формат А1 тоже процентный :)
Bite my shiny metal ass!      
 
{quote}{login=Юрий М}{date=21.10.2009 11:50}{thema=}{post}Можно я нажму синенький? :-){/post}{/quote}15 минут втыкал кто такой "синенький".  
Доперло. Можно сразу было нажимать - решение-то было мне известно :)
Bite my shiny metal ass!      
 
Так меня для того и взяли, чтобы "синенькие" ставить. С более сложными вопросами разбирается Prist :-)
 
{quote}{login=Юрий М}{date=22.10.2009 12:11}{thema=}{post}Так меня для того и взяли, чтобы "синенькие" ставить. С более сложными вопросами разбирается Prist :-){/post}{/quote}Ой, ладно прибедняться-то :)
Bite my shiny metal ass!      
 
{quote}{login=Лузер™}{date=22.10.2009 12:15}{thema=Re: }{post}{quote}{login=Юрий М}{date=22.10.2009 12:11}{thema=}{post}Так меня для того и взяли, чтобы "синенькие" ставить. С более сложными вопросами разбирается Prist :-){/post}{/quote}Ой, ладно прибедняться-то :){/post}{/quote}  
Хорошо - и "красненькие".
 
Ребята, давайте до конца просвещение в массы. Какое практическое применение может имет макрос присвоения индивидуального разделителя для локального диапазона. Сижу думаю где это может пригодиться...
 
VovaK, это не "индивидуальный разделитель для локального диапазона".  
Всего навсего это попытка сделать рабочий код в условиях разных настроек у пользователя.  
Проблема откуда возникла? От того, что рабочий код запустили на другой машине. Вылезла ошибка. Причем дурацкая. Invalid procedure call or argument  
Долго думал, где я процедуру вызываю...
Bite my shiny metal ass!      
 
Еще одно решение такое:  
Sub Макрос1()  
With Application  
myUseSystemSeparators = .UseSystemSeparators  
.UseSystemSeparators = True  
End With  
MaxOt = 0.01  
With Range("D1").FormatConditions  
.Delete  
.Add Type:=xlExpression, Formula1:="=RC[-1]+" & MaxOt
.Item(1).Interior.ColorIndex = 36  
End With  
With Application  
.UseSystemSeparators = myUseSystemSeparators  
End With  
End Sub  
 
Только надо будет потестировать как .UseSystemSeparators = True скажется на остальном коде.
Bite my shiny metal ass!      
Страницы: 1
Читают тему
Наверх