Имя: Пароль:
1C
 
Загрузка из Excel: неправильно видит количество строчек в файле
0 Старуха Шапокляк
 
26.05.10
14:23
Загружаю данные из файла Excel в 1С. Файл состоит из одной строки. Смотрю через отладчик, т.к. очень долго. в результате вижу, что значение ФайлСтрок = 1184 (в строчке Для а = 2 по ФайлСтрок Цикл). В результате, после первого прохода Цикла, он опять возвращается в начало цикла! Подскажите, почему так происходит и откуда это число 1184?




//Номер листа в книге Excel для получения данных
НомерЛиста  = 1;

//Пытаемся подключиться к Excel
Попытка
   Excel = новый COMОбъект("Excel.Application");
Исключение
   Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.");
   Возврат;
КонецПопытки;

Excel.WorkBooks.close(); // закрываем файл - экселя  

//Подключились удачно, открываем файл
Excel.Workbooks.Open(ФайлЗагрузки);

//Открываем необходимый лист
Excel.Sheets(НомерЛиста).select();

//Получим количество строк и колонок.
//В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
Версия = Лев(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;  
Конецесли;

Excel.ScreenUpdating = false;
// Выбираем данные из файла
Для а = 2 по ФайлСтрок Цикл   //вот здесь показывает, что ФайлСтрок=1184
   ...
КонецЦикла;

Excel.ScreenUpdating = true;  

//Закрываем Excel
Excel.ActiveWorkbook.Close();
Excel.Application.Quit();

Excel = "";
ФайлЗагрузки = "";
НомерЛиста = "";
1 sapphire
 
26.05.10
14:26
Для особо одаренных Microsoft придумала свойство объекта Worksheet(Лист) с славным именем UsedRange(Используемый диапазон) типа Range(Диапазон или по-одинесному Область)
2 Старуха Шапокляк
 
26.05.10
14:27
(1) И как его использовать?
3 sapphire
 
26.05.10
14:29
//Номер листа в книге Excel для получения данных

НомерЛиста  = 1;

//Пытаемся подключиться к Excel

Попытка
   Excel = новый COMОбъект("Excel.Application");
Исключение
   Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.");
   Возврат;
КонецПопытки;

Excel.WorkBooks.close(); // закрываем файл - экселя  


//Подключились удачно, открываем файл

Excel.Workbooks.Open(ФайлЗагрузки);

//Открываем необходимый лист

Excel.Sheets(НомерЛиста).select();
Worksheet=Excel.Sheets(НомерЛиста);
//Получим количество строк и колонок.

//В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel

//Версия = Лев(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;  
//Конецесли;
UsedRange=Worksheet.UsedRange
Excel.ScreenUpdating = false;
// Выбираем данные из файла

//Для а = 2 по ФайлСтрок Цикл   //вот здесь показывает, что ФайлСтрок=1184
//
//    ...
//КонецЦикла;

For Each Row In UsedRange.Rows do
   // Перебираем строки в используемом диапазоне.
   
enddo;    

Excel.ScreenUpdating = true;  

//Закрываем Excel

Excel.ActiveWorkbook.Close();
Excel.Application.Quit();
4 sapphire
 
26.05.10
14:31
Ну и зачем Excel.Sheets(НомерЛиста).select(); ?
Можно вот так:
Worksheet=Excel.Sheets(НомерЛиста);
5 Старуха Шапокляк
 
26.05.10
14:55
(3), (4) спасибо, но у меня в цикле еще строчки есть, которые я в (0) не указала:

//определим по файлу в каких колонках необходимые данные
НомерКолонкиКлюч           = 1;
НомерКолонкиНазвание       = 2;
НомерКолонкиИНН            = 3;
НомерКолонкиКПП            = 4;

// Выбираем данные из файла
Для а = 2 по ФайлСтрок Цикл   //вот здесь показывает, что ФайлСтрок=1184
   Ключ         = СокрЛП(Excel.Cells(а,НомерКолонкиКлюч).Value);
   Название       = СокрЛП(Excel.Cells(а,НомерКолонкиНазвание).Value);
   ИНН            = СокрЛП(Excel.Cells(а,НомерКолонкиИНН).Value);
   КПП            = СокрЛП(Excel.Cells(а,НомерКолонкиКПП).Value);
   ...
КонецЦикла;



Вероятно из-за этого, когда я модифицировала свой код по вашему примеру в (3), то стал выдавать ошибку еще на этапе синтаксического контроля:

{Форма.Форма(121,39)}: Переменная не определена (а)
Ключ         = СокрЛП(Excel.Cells(<<?>>а,НомерКолонкиКлюч).Value);
{Форма.Форма(132,39)}: Переменная не определена (а)
Название       = СокрЛП(Excel.Cells(<<?>>а,НомерКолонкиНазвание).Value);
{Форма.Форма(135,39)}: Переменная не определена (а)
ИНН            = СокрЛП(Excel.Cells(<<?>>а,НомерКолонкиИНН).Value);
{Форма.Форма(138,39)}: Переменная не определена (а)
КПП            = СокрЛП(Excel.Cells(<<?>>а,НомерКолонкиКПП).Value);


Т.е. сейчас у меня вот такой код (исправленный как в (3)):


//Номер листа в книге Excel для получения данных
НомерЛиста  = 1;

//Пытаемся подключиться к Excel
Попытка
   Excel = новый COMОбъект("Excel.Application");
Исключение
   Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.");
   Возврат;
КонецПопытки;

Excel.WorkBooks.close(); // закрываем файл - экселя      

//Подключились удачно, открываем файл
Excel.Workbooks.Open(ФайлЗагрузки);

//Открываем необходимый лист
Excel.Sheets(НомерЛиста).select();
Worksheet=Excel.Sheets(НомерЛиста);    //+

UsedRange=Worksheet.UsedRange;  //+
Excel.ScreenUpdating = false;    

//определим по файлу в каких колонках необходимые данные
НомерКолонкиКлюч           = 1;
НомерКолонкиНазвание       = 2;
НомерКолонкиИНН            = 3;
НомерКолонкиКПП            = 4;

// Выбираем данные из файла
For Each Row In UsedRange.Rows do     //+
   Ключ         = СокрЛП(Excel.Cells(а,НомерКолонкиКлюч).Value);
   Название       = СокрЛП(Excel.Cells(а,НомерКолонкиНазвание).Value);
   ИНН            = СокрЛП(Excel.Cells(а,НомерКолонкиИНН).Value);
   КПП            = СокрЛП(Excel.Cells(а,НомерКолонкиКПП).Value);
   ...
enddo;    //+
6 Старуха Шапокляк
 
26.05.10
14:57
В (3) Вы пишите, что надо перебрать строки в используемом диапазоне. А как это сделать? Вероятно, что мой метод не подходит:

For Each Row In UsedRange.Rows do     //+
   Ключ         = СокрЛП(Excel.Cells(а,НомерКолонкиКлюч).Value);
   Название       = СокрЛП(Excel.Cells(а,НомерКолонкиНазвание).Value);
   ИНН            = СокрЛП(Excel.Cells(а,НомерКолонкиИНН).Value);
   КПП            = СокрЛП(Excel.Cells(а,НомерКолонкиКПП).Value);
   ...
enddo;    //+
7 dk
 
26.05.10
15:03
весь код корявый, где брала-то?
по usedrange есть ведь примеры. лень в поиск сходить?
----
Лист = Excel.Sheets(НомерЛиста);
...
For Row = 1 to Лист.UsedRange.Rows.Count do     //+
   Ключ           = СокрЛП(Лист.Cells(Row,НомерКолонкиКлюч).Value);
   Название       = СокрЛП(Лист.Cells(Row,НомерКолонкиНазвание).Value);
   ИНН            = СокрЛП(Лист.Cells(Row,НомерКолонкиИНН).Value);
   КПП            = СокрЛП(Лист.Cells(Row,НомерКолонкиКПП).Value);
   ...
enddo;
8 Старуха Шапокляк
 
26.05.10
15:35
(7) Выдает ошибку при синтаксич.контроле:

{Форма.Форма(121,28)}: Переменная не определена (Лист)
       Ключ          = СокрЛП(<<?>>Лист.Cells(Row,НомерКолонкиКлюч).Value);
и т.д.
9 Старуха Шапокляк
 
26.05.10
15:37
+(8) Еще выдает ошибку:

{Форма.Форма(115,20)}: Переменная не определена (Лист)
   For Row = 1 to <<?>>Лист.UsedRange.Rows.Count do
10 Старуха Шапокляк
 
26.05.10
15:50
up!
11 Boroda
 
26.05.10
16:00
Есть момент:  UsedRange.Rows.Count возвращает количество непустых строк. Т.е если в начале есть пустые строки, то операцией:
Для сч=1 по ...UsedRange.Rows.Count Цикл можешь недобрать строк столько, сколько пустых в начале...
12 Старуха Шапокляк
 
26.05.10
16:04
(11) Пустых строк впереди - нет. Файл состоит из одной строчки и 20-ти столбцов. Данные начинаются со второй строчки и первого столбца. Но суть в том, что пока даже на этапе СИНТАКСИЧЕСКОГО контроля не прохожу (после того, как текст стал как в (5)).
Хелп!!!
13 Старуха Шапокляк
 
26.05.10
16:05
Т.е. мне надо указать, что:
Данные располагаются на первом листе книги;
Обрабатываемые данные начинаются с первого столбца и со второй строчки.
14 Boroda
 
26.05.10
16:09
С 8-кой не работал. но вот для 7-ки один раз нашел и пользуюсь постоянно:
   ВходЭксель = СоздатьОбъект("Excel.Application");
   ВходЭксель.DisplayAlerts = 0;
   ВходЭксель.Workbooks.Open(СокрЛП(ФормИмяФайлаДанных));    
   
   КолЛистов = ВходЭксель.Worksheets().Count;
   
   Сообщить("Заполнение менеджером сравочника...","i");

   Для СчЛ = 1 По КолЛистов Цикл
       Лист = ВходЭксель.Worksheets(СчЛ);    
       ИмяЛиста = СокрЛП(Лист.Name);
       Сообщить("Имя листа   "+ИмяЛиста,"i");  
       Если Найти(нрег(ИмяЛиста),нрег(ИмяНашегоЛиста))=0 Тогда
           Сообщить(СимволТабуляции+"пропускаем...");          Продолжить;
       КонецЕсли;
       Лист = ВходЭксель.Worksheets(ИмяЛиста);
       ВсегоСтрок = Лист.UsedRange.Rows.Count;
       //ВсегоСтрок = ВходЭксель.ActiveSheet.UsedRange.Rows.Count;
       
       Т = СоздатьОбъект("Таблица");
       Т.ВывестиСекцию("Шапка");
       
       Для Сч = стрНачало По ВсегоСтрок Цикл                  
           
           
           КодФилиала = СокрЛП(Лист.Cells(сч,колКодФилиала).Value);  
           Если ПустоеЗначение(КодФилиала)=1 Тогда Продолжить;            КонецЕсли;
           Состояние("строка № "+Сч);
           Если СпрК.НайтиПоКоду(КодФилиала)=0 Тогда
               Сообщить("Не найден филиал с кодом  "+КодФилиала+".   Пропускаем...","!!!");
               Продолжить;
           КонецЕсли;
15 Старуха Шапокляк
 
26.05.10
16:10
(14) спасибо, но я с 8-кой тоже пока не особо "дружу"...
16 Старуха Шапокляк
 
26.05.10
16:26
Ап!
17 FN
 
26.05.10
16:34
офф:
(14) Если давно пользуешься то поправь:

КодФилиала = СокрЛП(Лист.UsedRange.Cells(сч,колКодФилиала).Value);

и пропускать пустые строки перестанет
18 Старуха Шапокляк
 
26.05.10
16:53
Пробую по другому, в отладчике все равно показывает ВсегоКоличестовСтрок = 1184. Ничего не понимаю, откуда такая цифра???
Вот код:


Попытка
       Ексель = новый COMОбъект("Excel.Application");
   Исключение
       Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.");
       Возврат;
   КонецПопытки;
   
   Ексель.WorkBooks.close();
   
   Попытка
       Ексель.Workbooks.Open(ФайлЗагрузки);
       Колонки =1;
       Строки  =2; //заголовок не берем
       КоличествоСтраниц = 1;
       Для ТекНомер = 1 По КоличествоСтраниц Цикл
           //сколько  непустых   строк
           ВсегоКоличестовСтрок  = Ексель.Sheets(ТекНомер).UsedRange.row + Ексель.Sheets(ТекНомер).UsedRange.Rows.Count - 1;
           для н= 1 по   ВсегоКоличестовСтрок -1 цикл
               Ключ           = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки).Value;
               Название       = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки +1).Value;
               ИНН            = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки +2).Value;
               КПП            = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки +3).Value;
               ...
               Строки = Строки +1;
           КонецЦикла;
       КонецЦикла;
   исключение
       Сообщить(ОписаниеОшибки());
       Ексель.ActiveWorkbook.Close();
       Ексель.Application.Quit();
   конецПопытки;



P.S. Может быть у меня структура файла не правильная? Сейчас строчка заполнена вся, но в ней некоторые колонки могут быть пустыми, например КПП - пусто:

Ключ   Наименование   ИНН         КПП     ЮрАдрес
10001   ООО Восток    7702158475          г.Ставрополь, ул.Лесная

Такой файл пойдет для загрузки из Эксель в 1С, или там хоть что-то должно быть, чтобы не было зацикливания???
19 FN
 
26.05.10
17:05
Сделай:
Сообщить(ксель.Sheets(ТекНомер).UsedRange.Rows.Count) - если покажет больше чем надо, то открой файлик в Екселе и нажми Ctrl-End - где курсор установится?
20 Старуха Шапокляк
 
26.05.10
17:11
(19) Вы были правы: при нажатии Ctrl+End в файле курсор остановился как раз на строчке под этим номером 1184. Из-за чего это происходит и как исправить???
21 FN
 
26.05.10
17:17
(20) Физически в файле удали строки с последней заполненной до 1184 и пересохрани файлик.
22 Старуха Шапокляк
 
26.05.10
17:29
(21) СПАСИБО! Буду пробовать!!!
23 Aswed
 
26.05.10
17:31
В файле нажимаешь Ctrl+End и смотришь куда переходит курсор. Вполне может быть в какой нить ячейке на 1184 строке какие о остаточные данные, не видимые для тебя.
24 Ковычки
 
26.05.10
17:58
весь код на помойку
25 Ковычки
 
26.05.10
17:59
(21) а форматирование коли нужно тоже удалять и так в 150-и файлах ?
пофих, есть правильный метод нахождения последней ячейки
26 Ковычки
 
26.05.10
18:00
(23) и это пофих