|
v7: Несовпадение типов при загрузке из Excel | ☑ | ||
---|---|---|---|---|
0
kobzon2
12.09.14
✎
09:52
|
Заполняю ТЗ из Excel. Бывает что пользователи в excelе собьют формулу или еще что и в ячейке, значение которой нужно установить получается #ЗНАЧ!. 1С выдает ошибку Несовпадение типов и намертво зависает.
Попробовал вставить попытку не помогло: Для инСтроки=НСтрока По КСтрока Цикл ТзФ.НоваяСтрока(); Для ин=1 По ЧислоКолонок Цикл Попытка ТзФ.УстановитьЗначение(ТзФ.НомерСтроки,ин,Сокрлп(ВходExcel.ActiveSheet.Cells(инСтроки,ин).Value)); Исключение // Ошибка несоответствия типов Предупреждение(ОписаниеОшибки()); Возврат; КонецПопытки; КонецЦикла; КонецЦикла Что еще можно придумать? |
|||
1
kosts
12.09.14
✎
10:18
|
(0) Попробовать отловить конкретное место ошибки. Выяснить какое значение у Value, если в ячейке #ЗНАЧ! . Может достаточно написать Если Value = Что_То Тогда и т.д.
|
|||
2
FN
12.09.14
✎
10:21
|
спОшибки=СоздатьОбъект("СписокЗначений");
спОшибки.ДобавитьЗначение("#ПУСТО!"); спОшибки.ДобавитьЗначение("#ДЕЛ/0!"); спОшибки.ДобавитьЗначение("#ЗНАЧ!"); спОшибки.ДобавитьЗначение("#ССЫЛКА!"); спОшибки.ДобавитьЗначение("#ИМЯ?"); спОшибки.ДобавитьЗначение("#ЧИСЛО!"); спОшибки.ДобавитьЗначение("#Н/Д"); //Для англ. версии спОшибки.ДобавитьЗначение("#NULL!"); спОшибки.ДобавитьЗначение("#DIV/0!"); спОшибки.ДобавитьЗначение("#VALUE!"); спОшибки.ДобавитьЗначение("#REF!"); спОшибки.ДобавитьЗначение("#NAME?"); спОшибки.ДобавитьЗначение("#NUM!"); спОшибки.ДобавитьЗначение("#N/A"); Если спОшибки.НайтиЗначение(СокрЛП(ЗагружаемаяОбласть.Cells(х,у).Text))<>0 Тогда значЕ=ЗагружаемаяОбласть.Cells(х,у).Text; Иначе значЕ=ЗагружаемаяОбласть.Cells(х,у).Value; КонецЕсли; Это из 7.7. В 8-ке можно попробовать через ТипЗнч определить тип значения, но я лично не пробовал. |
|||
3
Zhuravlik
12.09.14
✎
10:22
|
(0) использовать Йоксель, и посмотреть как это выглядит в конверторе в таблицу значений
|
|||
4
FN
12.09.14
✎
10:22
|
(0) и переведи код на использование ComSafeArray - благо в 8-ке он поддерживается штатно.
|
|||
5
Zhuravlik
12.09.14
✎
10:23
|
(4) Вроде рубрика "7.7 и ранние"?..
|
|||
6
kobzon2
12.09.14
✎
10:31
|
(5) Да это 7.7
|
|||
7
FN
12.09.14
✎
10:34
|
(5) а блин, не увидел :)
(6) лови готовый код На вход подаешь ВходExcel.ActiveSheet и на форме ТаблицаЗначений "ТЗ" заполняется данными с листа. Процедура ЗагрузитьИзЕкселя(Лист) Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl"); Скрипт.language="javascript"; Скрипт.timeout=-1; Mas=Лист.UsedRange; Скрипт.addobject("Mas",Mas); Массив=Скрипт.eval("Массив=new VBArray(Mas.Value)"); спШирина=СоздатьОбъект("СписокЗначений"); Строк=Массив.ubound(1); Столбцов=Массив.ubound(2); Для у=1 по Столбцов Цикл ТЗ.НоваяКолонка(); спШирина.ДобавитьЗначение(1); КонецЦикла; Форма.ТЗ.Видимость(0); Для л=Массив.lbound(1) По Массив.ubound(1) Цикл Если л%10=0 тогда ТекстИнфо="Чтение файла: обработано "+л+" из "+Строк+" строк"; КонецЕсли; Форма.Обновить(0); ТЗ.НоваяСтрока(); Для к=Массив.lbound(2) По Массив.ubound(2) Цикл Если Скрипт.eval("typeof(Массив.getItem("+л+","+к+"))")="unknown" тогда Продолжить; КонецЕсли; Попытка значЕ=(Массив.getItem(л,к)); ТЗ.УстановитьЗначение(л,к,значЕ); Если СтрДлина(СокрЛП(Строка(ЗначЕ)))>спШирина.ПолучитьЗначение(к) тогда Если СтрДлина(СокрЛП(Строка(ЗначЕ)))<40 тогда спШирина.УстановитьЗначение(к,СтрДлина(СокрЛП(Строка(ЗначЕ)))); КонецЕсли; КонецЕсли; исключение Сообщить("Ошибка в строке:"+л+", в колонке:"+к); КонецПопытки; КонецЦикла; КонецЦикла; для ш=1 по спШирина.РазмерСписка() Цикл ТЗ.УстановитьПараметрыКолонки(ш,,,,,спШирина.ПолучитьЗначение(ш)*1.25); КонецЦикла; Форма.ТЗ.Видимость(1); КонецПроцедуры |
|||
8
kobzon2
12.09.14
✎
11:01
|
(7) Чето как то я очкую работать со скриптами)
|
|||
9
FN
12.09.14
✎
11:12
|
(8) попробуй грузануть большую таблицу своим методом и с помощью скрипта - перестанешь очковать.
|
|||
10
kobzon2
12.09.14
✎
11:28
|
(9) В принципе мне (1) и (2) нравится, но 1 чето не получается получить значение Value.
|
|||
11
FN
12.09.14
✎
11:31
|
1 - нерабочее
|
|||
12
kobzon2
12.09.14
✎
12:35
|
(11) Сделал как в (2) - Спасибо!!!
Еще не скромный вопрос: как код убирать в спойлер? |
|||
13
kosts
12.09.14
✎
12:35
|
(11) Предложил универсальный способ ...
Вот так можно еще Если Excel.IsError(Excel.ActiveSheet.Cells(1,1)) = True Тогда |
|||
14
kosts
12.09.14
✎
12:41
|
Хотя и предложенный вариант вроде верный только тип нужно проверить
http://stackoverflow.com/questions/2424718/how-to-know-if-a-cell-has-an-error-in-the-formula-in-c-sharp -2146826281 = #Div/0! -2146826246 - #N/A -2146826259 = #Name? -2146826288 = #Null! -2146826252 = #Num! -2146826265 = #Ref! -2146826273 = #Value! |
|||
15
FN
12.09.14
✎
12:42
|
(13) хороший метод, лучше чем 2 (там только для двух языков сработает, а если локаль не рус/анг - то облом).
Тока в 7.7 True нет. Я лично уже давно гружу через ComSafeArray - разница в скорости огромна. |
|||
16
FN
12.09.14
✎
12:43
|
(12) движок форума автоматом это делает для "простыней"
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |