Числа в формате 1E-02

Автор Начинающий Макросер, 27 ноября 2016, 23:03

0 Пользователи и 1 гость просматривают эту тему.

Начинающий Макросер

Доброго времени суток, уважаемые форумчане.

Столкнулся с непонятной ситуацией.

Дано:
CSV файл с бухгалтерскими данными, все числа соответственно в виде текста. Разделитель дробной части точка "." , при импорте в Calc соответственно в ячейке появляется строка виде "332.01", что означает 332 рубля 01 копейка.

Что происходит:
Простенький макрос преобразует эти строки в числа, и производит арифметические действия.

Проблема:
некоторые ячейки содержат одну копейку - "0.01", когда нужно сложить это значение(после приведения в число) с другим, отличным от 0, то все проходит гладко, к примеру, 1 + 0.01 даст 1,01. А вот когда второй операнд 0, или в ячейку результат нужно вывести значение(числовое) без дополнительных операций, то в ячеке появляется вот такое представление "1E-02".

Помогите пожалуйста разобраться, как вывести в ячейку 0,01 из исходного 0.01.

фунции макроса:


searchData(i)(16) ' "0.01"



такой вариант выдаст в bonus "1E-02"

dim bonus
bonus = 0

bonus = bonus + val(searchData(i)(16))


такой вариант выдаст в bonus "1,01"

dim bonus
bonus = 1

bonus = bonus + val(searchData(i)(16))


Система:

Ubuntu 12.04 LTS
AMD A8-5600K APU with Radeon(tm) HD Graphics × 4
64-разрядная

ПО:
Версия: 5.0.3.2
ID сборки: 1:5.0.3~rc2-0ubuntu1~precise2
Локаль: ru-RU (ru_RU.UTF-8)


mikekaganski

Во-первых, почему числа в виде текста? Если Вы используете десятичный разделитель - точку, то при импорте укажите локаль USA.

А во-вторых, дайте макрос для тестирования.
С уважением,
Михаил Каганский

JohnSUN

А каким образом получаешь этот самый searchData? Расскажи всю цепочку - от чтения файла до считывания массива
Цитата: mikekaganski от 27 ноября 2016, 23:26А во-вторых, дайте макрос для тестирования.
+
И фрагмент CSV-файла, хотя бы строк 20
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Yakov

Если складываются рубли/другая валюта, то и тип данных должен быть денежный.

Начинающий Макросер

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

Начинающий Макросер

Цитата: JohnSUN от 27 ноября 2016, 21:27А каким образом получаешь этот самый searchData? Расскажи всю цепочку - от чтения файла до считывания массива

1 Скачал CSV, кликнул открыть, открывается диалог Calc - там кодировка UTF8 + раздилитель по умолчанию = получилась таблица.

2 Выделил все, скопровал, вставил в свой документ на лист "ведомость"

3 лист "Спарвочник водителей" - заполняю

4 в макросе фиксированно задан диапазон на листе с водителями, на листе "ведомость" тоже  - копирую диапазоны в массивы

5 беру первую строку, первую ячейку массива - это имя водителя. Ищу совпадения в во втором массиве. Складываю данные из совпавших строк и отсылаю на вставку на лист "Расчет"

JohnSUN

Понятно. Тогда самым простым способом обхода этой ошибки для тебя будет не "кликнул открыть", а выбрать из меню Лист-Вставить лист из файла
Открывается точно такой же диалог Calc - "там кодировка UTF8 + раздилитель по умолчанию", но этого мало: как тебе уже намекнул mikekaganski, нужно щелкнуть по заголовкам колонок с числами с точкой (не в листе, прямо здесь, в диалоге) и выбрать Тип столбца не "Стандарт", а "Английский США". После ОК, в следующем окне - поставь птичку в "Связь с файлом".  Ошибка с копейкой должна исчезнуть.
Но всё остальное, что в макрос уже насовал - нужно будет пересмотреть и переписать
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

mikekaganski

Кошмар.
Зачем всё в тексте возвращать???
Используйте setValue вместо SetString... хотя в макросах можно сломать ногу.
С уважением,
Михаил Каганский

Начинающий Макросер

Цитата: JohnSUN от 27 ноября 2016, 22:08Ошибка с копейкой должна исчезнуть.
Проделал, не исчезла =(((

Или нужно сначала макрос переписать, что бы исчесла - не допонял, наверное...

Начинающий Макросер

Цитата: mikekaganski от 27 ноября 2016, 22:17Используйте setValue


Проделал - с копейками помогло, огромное спасибо.

Как я понял нужно только использовать методы совместно, в зависимости от содержимого.

mikekaganski

#10
Цитата: Начинающий Макросер от 27 ноября 2016, 22:24Как я понял нужно только использовать методы совместно, в зависимости от содержимого.

Теперь по функциям.
Что у Вас делает transToNumber? Переводит строку в число, отбрасывая нечисловые символы? типа "ф1в2,3,4d5}{" -> "12,3,45}{"? или в ней больший смысл? Для чего она оставляет небуквенные символы типа "{}[]"?

Если на входе разумные строки-числа, то проще объявить переменную Double и присваивать значение ей.
Но если нужно отсеивать, как в предыдущем примере, то вот (правда, не оставляющая мусора в числе):
Function transToNumber(Str As String) As Double
   Const numChars As String = "0123456789-.,"
   Dim result As String, i As Integer
   For i = 1 To len(Str)
     Dim ch As String
     ch = MID(Str,i,1)
     If (InStr(numChars, ch)) Then
       result = result + ch
     EndIf
   Next i
   transToNumber = result
End Function


Зачем нужна getDia? Код ради кода? Неужели первая строка ниже понятнее или удобнее в записи, чем вторая или третья?
driversDia = getDia("A:F", 2, 100)
driversDia = "A2:F100"
driversDia = "A" & 2 & ":F" & 100


Почему stringTemplate объявляется с максимальным индексом 7? Там используются индексы с 0 до 6.
С уважением,
Михаил Каганский

JohnSUN

Так ты образец CSV-файла и не дал...
Попробуй прочитать и понять вот этот макрос.
Если не сможешь разобраться, можешь переспросить. А лучше в этом случае брось "макросерить", не твоё это...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне