Имя: Пароль:
1C
 
Загрузка из Эксель: Ошибка при вызове метода контекста (ПолучитьОбъект)
0 Старуха Шапокляк
 
26.02.10
14:53
Загружаю из Эксель в спр.Номенклатура файл, содержащий два столбца:
"КодТовара" и "НовыйРеквизит" (этот реквизит мы завели в спр.Номенклатура и теперь его надо заполнить данными из файла). Все загружает нормально, только когда доходит до последнего элемента, выдает ошибку:

{Форма.Форма(114)}: Ошибка при вызове метода контекста (ПолучитьОбъект): Элемент не выбран!
       Товар = Товар.ПолучитьОбъект();
по причине:
Элемент не выбран!

И Эксель зависает, хотя все подгрузил без ошибок...

Вот мой код:

НомерЛиста  = 1;
   Попытка
       Excel = новый COMОбъект("Excel.Application");
   Исключение
       Сообщить("Excel на компьютере не установлен.");
       Возврат;
   КонецПопытки;    
   
   Excel.Workbooks.Open(ИмяФайла);
   Excel.Sheets(НомерЛиста).select();  
   Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
   Если Версия = "8" тогда
       ФайлСтрок   = Excel.Cells.CurrentRegion.Rows.Count;
       ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
   Иначе
       ФайлСтрок   = Excel.Cells(1,1).SpecialCells(11).Row;
       ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;  
   Конецесли;
   
   НомерКолонкиКодаТовара = 1;
   НомерКолонкиНовогоРеквизита = 2;
   
   Для а = 2 По 469 Цикл
       КодТовара             = СокрЛП(Excel.Cells(а,НомерКолонкиКодаТовара).Value);
       НовыйРеквизит = СокрЛП(Excel.Cells(а,НомерКолонкиНовогоРеквизита).Value);
       Товар = Справочники.Номенклатура.НайтиПоКоду(КодТовара);
       Сообщить("Нашел Код номенклатуры" + КодТовара);
       Товар = Товар.ПолучитьОбъект();
       Товар.НовыйРеквизит = НовыйРеквизит;
       Товар.Записать();
   Конеццикла;
   
   Excel.ActiveWorkbook.Close();
1 73
 
26.02.10
14:55
С чего это такая уверенность, что "Нашел Код номенклатуры"?
2 dk
 
26.02.10
14:56
А кто будет проверять нашелся товар по коду или нет?
3 Старуха Шапокляк
 
26.02.10
15:07
(2) а как?
4 skunk
 
26.02.10
15:09
Товар.ПустаяССылка()
5 73
 
26.02.10
15:09
СП:
Пример:
СтрокаКода = "840";
Валюты = Справочники.Валюты;
НайденнаяСсылка = Валюты.НайтиПоКоду(СтрокаКода);
Если НайденнаяСсылка = Валюты.ПустаяСсылка() Тогда
   Сообщить("Валюты """ + СтрокаКода + """ еще нет");
КонецЕсли;
6 skunk
 
26.02.10
15:10
(5)полный пипец
7 73
 
26.02.10
15:11
(6) Это пример из СП.
Полный пипец - это (4).
Если уж так, как ты предлагаешь проверять, то: Товар.Пустая()
8 Старуха Шапокляк
 
26.02.10
15:11
(4), (6) а как надо правильно, применительно к моему коду в (0)???
9 73
 
26.02.10
15:12
(8) Ну-ну...
10 skunk
 
26.02.10
15:14
(7)ну да согласен ... затупил с сылкой
11 Старуха Шапокляк
 
26.02.10
15:16
Так будет правильно?

......
Товар = Справочники.Номенклатура.НайтиПоКоду(КодТовара);
Если Товар = Справочники.Номенклатура.ПустаяСсылка() Тогда
Сообщить("Строка НЕ ЗАГРУЖЕНА. Код Номенклатуры "+КодТовара+" не  найден в справочнике.");
Продолжить;
КонецЕсли;
Сообщить("Нашел Код номенклатуры" + КодТовара);
Товар = Товар.ПолучитьОбъект();
Товар.НовыйРеквизит = НовыйРеквизит;
Товар.Записать();
Конеццикла;
12 dk
 
26.02.10
15:22
сойдет
13 Старуха Шапокляк
 
26.02.10
15:36
Еще подскажите пож-та, т.к. даже если в файле меньше 469 строк, он все равно обрабатывал все 469 строчки, то я исправила строчки:
Было:

Для а = 2 По 469 Цикл
...
КонецЦикла;

Стало:

Для а = Excel.Cells(2,1).SpecialCells(21).Row по ФайлСтрок Цикл
...
КонецЦикла;

Стал выдавать ошибку:

{Форма.Форма(114)}: Ошибка при вызове метода контекста (SpecialCells): Произошла исключительная ситуация (Microsoft Office Excel): Unable to get the SpecialCells property of the Range class
   Для а = Excel.Cells(2,1).SpecialCells(21).Row по ФайлСтрок Цикл
по причине:
Произошла исключительная ситуация (Microsoft Office Excel): Unable to get the SpecialCells property of the Range class
14 Старуха Шапокляк
 
26.02.10
15:41
Вот мой текст итоговый:

НомерЛиста  = 1;
   Попытка
       Excel = новый COMОбъект("Excel.Application");
   Исключение
       Сообщить("Excel на компьютере не установлен.");
       Возврат;
   КонецПопытки;    
   
   Excel.Workbooks.Open(ИмяФайла);
   Excel.Sheets(НомерЛиста).select();  
   
   Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
   Если Версия = "8" тогда
       ФайлСтрок   = Excel.Cells.CurrentRegion.Rows.Count;
       ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
   Иначе
       ФайлСтрок   = Excel.Cells(1,1).SpecialCells(11).Row;
       ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;  
   Конецесли;
   
   НомерКолонкиКодаТовара = 1;
   НомерКолонкиНовогоРеквизита = 2;
   
   
   //Для а = 2 По 469 Цикл
   Для а = Excel.Cells(2,1).SpecialCells(21).Row по ФайлСтрок Цикл
       
       КодТовара             = СокрЛП(Excel.Cells(а,НомерКолонкиКодаТовара).Value);
       НовыйРеквизит = СокрЛП(Excel.Cells(а,НомерКолонкиНовогоРеквизита).Value);
       Товар = Справочники.Номенклатура.НайтиПоКоду(КодТовара);
       Если Товар = Справочники.Номенклатура.ПустаяСсылка() Тогда
           Сообщить("Строка НЕ ЗАГРУЖЕНА. Код Номенклатуры "+КодТовара+" не  найден в справочнике.");
           Продолжить;
       КонецЕсли;
       
       Сообщить("Нашел Код номенклатуры" + КодТовара);
       Товар = Товар.ПолучитьОбъект();
       Товар.НовыйРеквизит = НовыйРеквизит;
       Товар.Записать();
   Конеццикла;
15 Старуха Шапокляк
 
26.02.10
15:57
up!
16 dk
 
26.02.10
16:00
SpecialCells(11)
17 SlavCO
 
26.02.10
16:01
Для а = 2 по ФайлСтрок Цикл

Попробуй так
18 dk
 
26.02.10
16:01
хотя ...
нафига Excel.Cells(2,1).SpecialCells(21).Row
просто 1
19 Дикообразко
 
26.02.10
16:05
ИМХО
предположу что нет 21 колонки


КМК должно быть так:


  Для а = 2 По ФайлСтрок Цикл
20 dk
 
26.02.10
16:08
(19) это не колонка
21 Дикообразко
 
26.02.10
16:08
(20) а что?
22 dk
 
26.02.10
16:09
открой для себя справку по VBA )
23 Дикообразко
 
26.02.10
16:11
(22) XlCellType constants    Value
xlCellTypeAllFormatConditions. Cells of any format    -4172
xlCellTypeAllValidation. Cells having validation criteria    -4174
xlCellTypeBlanks. Empty cells    4
xlCellTypeComments. Cells containing notes    -4144
xlCellTypeConstants. Cells containing constants    2
xlCellTypeFormulas. Cells containing formulas    -4123
xlCellTypeLastCell. The last cell in the used range    11
xlCellTypeSameFormatConditions. Cells having the same format    -4173
xlCellTypeSameValidation. Cells having the same validation criteria    -4175
xlCellTypeVisible. All visible cells    12


ну и где там 21 ?
24 Дикообразко
 
26.02.10
16:11
может надо было указать 12 ?
xlCellTypeVisible. All visible cells    12
25 Дикообразко
 
26.02.10
16:11
или 4 ?
26 dk
 
26.02.10
16:12
а вообще (14) сильно корявый код хоть и рабочий частично
Книга = Excel.Workbooks.Open(ИмяФайла);
Лист = Книга.Sheets(НомерЛиста);
НовыйРеквизит = СокрЛП(Лист.Cells(а,НомерКолонкиНовогоРеквизита).Value);
ФайлКолонок = Лист.SpecialCells(11).Column;
и т.д. и т.п.
27 Дикообразко
 
26.02.10
16:12
(22) я смотрю ты открывать то умеешь, вот только пользоваться не очень
28 dk
 
26.02.10
16:13
(23) XlCellType <> номер колонки? ))
29 dk
 
26.02.10
16:15
))
30 Дикообразко
 
26.02.10
16:18
(28) да я вообще VBA в глаза не видел ....
раза 2 за 10 лет открывал, откуда мне знать? я просто предположил..
31 Дикообразко
 
26.02.10
16:18
и кстати угадал
32 dk
 
26.02.10
16:25
тебе виднее )