Страницы: 1
RSS
VBA. Как в массив загнать диапазон ячеек так, чтобы в дробных числах знаком была точка, а не запятая
 
Добрый день
Помогите, пож, по ситуации
Загоняю диапазон ячеек в массив, конкатенирую и применяю evaluate, выдает ошибку 2015 - из-за запятой, которая отделяет дробную часть от целой.
Нашел временный выход - Replace (меняю запятую на точку)...
Пока работает, но так как таблиц много и они меняются, в будущем это может не сработать (могут заменяться запятые, которые нужны)
Подскажите, пож, как в массив можно загнать диапазон ячеек без запятых, а с точками? Т.е. как получить массив в котором числа находятся с точкой?
Пример прилагаю (см. в собщении ниже)
Изменено: Ливиан - 09.03.2020 13:31:47 (отредактировал)
 
Превращать числовые значения в текст, чтобы потом подсунуть оператору, который преобразует текст в выражение... Зачем?
Код
Sub aaa()
    Dim arr_()
    Dim dSum As Double
    Dim i As Long
    
    With ThisWorkbook.Sheets(1)
        arr_ = .Range("a1:a10").Value
        
        For i = 2 To 10
            dSum = dSum + arr_(i, 1)
        Next i
    End With

    DeBug.Print dSum
End Sub
 
Это только пример. Evaluate будет вычислять условие для if. Т.е. условно
Код
a=evaluate ("(a=1,1)*(b>2,1)+(c<3,1)")
if a then ...
 
Вопрос о двигателе внутреннего сгорания, а пример - "как накачать колесо велосипеда"
Покажите нормальный пример. И с вариантом, где запятые должны остаться
 
Прикладываю пример. На Рабочем Листе в ячейках элементы, которые конкатенируются и вычисляются для If...Then...
 
В VBA разелитель целой и дробной части - точка.
Варианты:
- пробежаться по массивам, преобразовать числовые значения в тект с точкой;
- перед сцепкой проверять тип значения и заменять запятую в числах;
- вычислять условия отдельно.
В примере значения и операторы разделены по столбцам. Как для меня - третий вариант самый правильный.
 
vikttur, спасибо
Два первых способа понял, попробую применить.
А 3 вариант не совсем...
Отдельно, т.е. те где заменять запятую можно - там оставить Replace, а где нельзя - там оставить все как есть - без Replace, сделать в таблице с условиями еще один столбец с меткой, можно менять запятую или нет?
 
Метод Application.Evaluate (или Range.Evaluate) не учитывает региональных настроек. Соответственно, разделитель дробной части числовых литералов в передаваемой формуле - точка. Можно для преобразования числа в текст использовать функцию Str (следует учитывать, что для неотрицательных чисел она возвращает число с ведущим пробелом, что в формуле не должно помешать).

P.S. В процитированной документации по Evaluate есть неточность - утверждается, что формулы должны задаваться в стиле A1. На самом деле стиль формул должен соответствовать значению свойства Application.ReferenceStyle. По эту тему на сайте есть много замечательных сообщений Алексея (Казанский).
Владимир
 
sokol92, спасибо, попробую Str и посмотрю сообщения Казанского
 
Цитата
Ливиан написал: 3 вариант не совсем [понял]...
И правильно не поняли :)
Я не сообразил, что отдельные условия - тоже сцепленный текст...

Цитата
sokol92 написал: использовать функцию Str
Т.к. в диапазоне с числами присутствует текст, то все равно сначала нужно проверять тип значения, иначе Str(текст) -  ошибка.
Получается, что перед сцеплением массивы нужно дополнительно обработать - заменить числа на текст с точкой.

Пишите данные для условий текстом  - текстовый формат ячеек, вместо запятой писать точку. Если значения получаются в результате работы формул - менять запятую на точку в формулах.
 
Понятно, так и сделаю.
Спасибо всем большое за помощь!
Страницы: 1
Наверх