Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Автоматическое преобразование типа данных в скрипте - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Автоматическое преобразование типа данных в скрипте
Kashimirush Дата: Пятница, 14.01.2022, 13:57 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 240
Репутация: 41 ±
Замечаний: 0% ±

Excel 2010
Товарищи, помогите разобраться.
Имею простой скрипт - перенос данных с одного листа на другой, назначение скрипта не суть. Переносим с Лист2 на Лист1

ТАБЛИЦА

Выявил следующий баг - на листе 2 цены имеют денежный формат, но все мы люди и если специально сделать ошибку и ввести число в строковом формате (с пробелом, выделено красным).
При вставке на Лист1 данная цена Волшебным образом превращается в Число. Не понимаю в какой момент и почему.
А это ошибка, и мне хотелось бы знать, что кто-то число ввел неправильно, точнее ввёл не число.

[offtop]Константин выручай))[/offtop]


Работа, работа, перейди на Федота...

Сообщение отредактировал Kashimirush - Пятница, 14.01.2022, 14:14
 
Ответить
СообщениеТоварищи, помогите разобраться.
Имею простой скрипт - перенос данных с одного листа на другой, назначение скрипта не суть. Переносим с Лист2 на Лист1

ТАБЛИЦА

Выявил следующий баг - на листе 2 цены имеют денежный формат, но все мы люди и если специально сделать ошибку и ввести число в строковом формате (с пробелом, выделено красным).
При вставке на Лист1 данная цена Волшебным образом превращается в Число. Не понимаю в какой момент и почему.
А это ошибка, и мне хотелось бы знать, что кто-то число ввел неправильно, точнее ввёл не число.

[offtop]Константин выручай))[/offtop]

Автор - Kashimirush
Дата добавления - 14.01.2022 в 13:57
Kashimirush Дата: Пятница, 14.01.2022, 13:57 | Сообщение № 2
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 240
Репутация: 41 ±
Замечаний: 0% ±

Excel 2010
Код скрипта:


Работа, работа, перейди на Федота...
 
Ответить
СообщениеКод скрипта:

Автор - Kashimirush
Дата добавления - 14.01.2022 в 13:57
Gustav Дата: Суббота, 15.01.2022, 17:03 | Сообщение № 3
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Константин выручай))

Да, интересная проблема. Есть ощущение, что Range.setValue() использует какой-то витиеватый услужливый алгоритм, пытающийся найти в последовательности помещаемых в ячейку символов нечто большее, чем просто строка, а именно - число или дату. Т.е. имеет место быть некий примерно такой же алгоритм, который в Excel, скажем, превращает ввод 1.1 не в число "одна целая одна десятая", а в дату "1 января текущего года".

Гугл мне ничего конкретного на тему раскрытия этого алгоритма не нашёл, поэтому если кому-то повезет больше, чем мне - пожалуйста, поделитесь!

Я набросал небольшой тест, который иллюстрирует "непредсказуемость" setValue() в тех случаях, когда ей подсовываешь нечто сродни тому, что по известному анекдоту (Гугл расскажет) в конце эксперимента с японской бензопилой ей подсунули суровые сибирские мужики (железный лом):
[vba]
Код
function myFunc1() {
    var ss = SpreadsheetApp.getActive();
    var sheet = ss.getSheets()[0];
    sheet.getRange('A1').setValue('1          234'); // число 1234
    sheet.getRange('A2').setValue('1          2345'); // внешне 1 2345, внутри ячейки - дата 01.01.2345
    sheet.getRange('A3').setValue('1          23456'); // число 123456
    sheet.getRange('A4').setValue('1          23   4567'); // число 1234567
    sheet.getRange('A5').setValue('1          23   45678'); // число 12345678
    sheet.getRange('A6').setValue('1          2345678   9'); // строка 1          2345678   9
    sheet.getRange('A7').setValue('1          23   45   6789'); // число 123456789
    sheet.getRange('A8').setValue('1          23   45   678 9'); // строка 1          23   45   678 9
}
[/vba]

Для анализа ошибок пользовательского ввода при переброске данных с одного рабочего листа на другой с помощью Range.getValue() и Range.setValue() лучше всего делать попытки явного преобразования в число тех данных, которые по замыслу должны быть числами. Делать это нужно между getValue() и setValue() с помощью таких функций, как Number() и typeof - с тем, чтобы в setValue() данные в ошибочные ячейки подавались уже в виде значения ошибки (#NUM!) или в виде сформированной строки с информацией об ошибке:
[vba]
Код
function myFunc2() {
    var ss = SpreadsheetApp.getActive();
    var sheet = ss.getSheets()[0];
    sheet.getRange('A1').setValue( Number('  1234  ') ); // число 1234
    sheet.getRange('A2').setValue( Number('1          2345') ); // ошибка #NUM!
    sheet.getRange('A3').setValue( Number('1          23456') ); // ошибка #NUM!
    sheet.getRange('A4').setValue( Number('1          23   4567') ); // ошибка #NUM!
    sheet.getRange('A5').setValue( Number('1          23   45678') ); // ошибка #NUM!
    sheet.getRange('A6').setValue( Number('1          2345678   9') ); // ошибка #NUM!
    sheet.getRange('A7').setValue( Number('1          23   45   6789') ); // ошибка #NUM!
    sheet.getRange('A8').setValue( Number('1          23   45   678 9') ); // ошибка #NUM!
}
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
Константин выручай))

Да, интересная проблема. Есть ощущение, что Range.setValue() использует какой-то витиеватый услужливый алгоритм, пытающийся найти в последовательности помещаемых в ячейку символов нечто большее, чем просто строка, а именно - число или дату. Т.е. имеет место быть некий примерно такой же алгоритм, который в Excel, скажем, превращает ввод 1.1 не в число "одна целая одна десятая", а в дату "1 января текущего года".

Гугл мне ничего конкретного на тему раскрытия этого алгоритма не нашёл, поэтому если кому-то повезет больше, чем мне - пожалуйста, поделитесь!

Я набросал небольшой тест, который иллюстрирует "непредсказуемость" setValue() в тех случаях, когда ей подсовываешь нечто сродни тому, что по известному анекдоту (Гугл расскажет) в конце эксперимента с японской бензопилой ей подсунули суровые сибирские мужики (железный лом):
[vba]
Код
function myFunc1() {
    var ss = SpreadsheetApp.getActive();
    var sheet = ss.getSheets()[0];
    sheet.getRange('A1').setValue('1          234'); // число 1234
    sheet.getRange('A2').setValue('1          2345'); // внешне 1 2345, внутри ячейки - дата 01.01.2345
    sheet.getRange('A3').setValue('1          23456'); // число 123456
    sheet.getRange('A4').setValue('1          23   4567'); // число 1234567
    sheet.getRange('A5').setValue('1          23   45678'); // число 12345678
    sheet.getRange('A6').setValue('1          2345678   9'); // строка 1          2345678   9
    sheet.getRange('A7').setValue('1          23   45   6789'); // число 123456789
    sheet.getRange('A8').setValue('1          23   45   678 9'); // строка 1          23   45   678 9
}
[/vba]

Для анализа ошибок пользовательского ввода при переброске данных с одного рабочего листа на другой с помощью Range.getValue() и Range.setValue() лучше всего делать попытки явного преобразования в число тех данных, которые по замыслу должны быть числами. Делать это нужно между getValue() и setValue() с помощью таких функций, как Number() и typeof - с тем, чтобы в setValue() данные в ошибочные ячейки подавались уже в виде значения ошибки (#NUM!) или в виде сформированной строки с информацией об ошибке:
[vba]
Код
function myFunc2() {
    var ss = SpreadsheetApp.getActive();
    var sheet = ss.getSheets()[0];
    sheet.getRange('A1').setValue( Number('  1234  ') ); // число 1234
    sheet.getRange('A2').setValue( Number('1          2345') ); // ошибка #NUM!
    sheet.getRange('A3').setValue( Number('1          23456') ); // ошибка #NUM!
    sheet.getRange('A4').setValue( Number('1          23   4567') ); // ошибка #NUM!
    sheet.getRange('A5').setValue( Number('1          23   45678') ); // ошибка #NUM!
    sheet.getRange('A6').setValue( Number('1          2345678   9') ); // ошибка #NUM!
    sheet.getRange('A7').setValue( Number('1          23   45   6789') ); // ошибка #NUM!
    sheet.getRange('A8').setValue( Number('1          23   45   678 9') ); // ошибка #NUM!
}
[/vba]

Автор - Gustav
Дата добавления - 15.01.2022 в 17:03
Kashimirush Дата: Понедельник, 17.01.2022, 07:54 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 240
Репутация: 41 ±
Замечаний: 0% ±

Excel 2010
Благодарю за объяснение.


Работа, работа, перейди на Федота...
 
Ответить
СообщениеБлагодарю за объяснение.

Автор - Kashimirush
Дата добавления - 17.01.2022 в 07:54
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!