Имя: Пароль:
1C
 
Номер последнего столбца в Экселе
0 Злопчинский
 
05.07.18
18:10
77, читаем эксель
определяем границы читаемых данных
Строк    = Excel.Cells.SpecialCells(11).Row;    // строка последней ячейки
Столбцов= Excel.Cells.SpecialCells(11).Column; // столбец последней ячейки  
.
получается криво. В частности, количество столбцов определяется неверно, так как присутсвует столбец. который по всей "высоте" не заполнен данными, и после этого пустого столбца тоже есть столбцы с данными.

Вышеприведенное определение последнего столбца дает номер последнего заполненного столбца ПЕРЕД пустым столбцом, а это явно не все данные -

вопрос: как правильно определить самый поледний правый столбец с данными?
1 Базис
 
naïve
05.07.18
18:34
То есть у тебя в первых строках 3 столбца заполнено, а ниже
- сотня?

2 варианта попробуй:

1. Пересохранить файл, вдруг МС пересчитывает SpecialCells.
2. Функцию на VBA, цикл по строкам, цикл по столбцам.

Критерием конца цикла по строкам я брал пустые подряд 20 строк. Но этот код был на 1Сике.
2 Злопчинский
 
05.07.18
18:54
(1) ТТН в виде эксельного файла. куча столбцов/ячеек. читаю - как выше - до 85 столбца и все. хотя есть справа еще столбцы и нужная ячейка в 91 столбце. оказалось 86 столбец по всей высоте - пустой. СпешалЦелс выдавал 85 столбцов.
3 Злопчинский
 
05.07.18
18:55
1. не пойдет, сильно много файлов и вообще противоречит моему чувству прекрасного.
2. бяка.
4 Злопчинский
 
05.07.18
19:15
как-то вот так типа наверное

Excel_Лист = Excel.Worksheets(i);//просмотрим ячейки одного листа
первИспСтрока = Excel_Лист.UsedRange.Row;
ВсегоСтрок = первИспСтрока + Excel_Лист.UsedRange.Rows.Count -1;
первИспСтолбец = Excel_Лист.UsedRange.Column;
ВсегоСтолбцов = первИспСтолбец + Excel_Лист.UsedRange.Columns.Count -1;

Excel: метод SpecialCells неверно определяет последний столбец. Помогите!!!
5 Базис
 
naïve
05.07.18
19:15
(2) Если у тебя постоянный формат, то храни ширину как параметр прямо в коде или рядом. Используй функцию "АНеТТНЛиВыМнеПодсунули"
6 Злопчинский
 
05.07.18
19:19
(5) это понятно, но некузяво (примерно так и сделал в параметрах функции).
7 Злопчинский
 
05.07.18
19:20
.. и как максимально быстро считать Эксель в ТЗ..? поячеечное чтение из экселя - очень долго...
8 Базис
 
naïve
05.07.18
20:06
(6) Шум на входе приводит к шуму на выходе.

Более того, пользователь (нет, тот кто несёт вред вместо пользы - это вредзователь) сможет создать достаточно кривой бланк xls, который читать можно будет только полным перебором ячеек.
(7) Забыл. Именно с семёркой я работал с неприлично большими файлами. Что-то брал у УжасБухгалтера и быстренько допиливал.
9 Fragster
 
гуру
05.07.18
20:16
UsedRange()?
А вообще бывает так, что область данных в файле принудительно задают вместо автомата, но не помню, где это менять.
10 mistеr
 
05.07.18
23:55
(7) Через ADO, если структура регулярная и плоская.
11 Garykom
 
гуру
06.07.18
00:06
(0) Самый лучший вариант знаешь какой?

Выкинуть эксель нафик и файлы его формата тоже.

Нынче 21 век и пора уже использовать json или хотя бы xml и специальные системы для создания/редактирования/просмотра структурированных упорядоченных данных.
12 Злопчинский
 
06.07.18
00:10
(11) Скажи это бюджету и всяким тендерам. Работаем с тем, что получаем, а получаем сотни ТОРГ12 и/или ТТН в виде экселевских файлов это и есть максимальный вариант автоматизации для участника цепочки передачи тмц.
13 mistеr
 
06.07.18
00:12
(12) VBA скриптом внутри Экселя разобрать всю сотню и слить в один текстовый. Потом с спокойно, с комфортом загрузить.
14 blutang
 
06.07.18
00:29
SpecialCells(11).Address даёт букву на самом деле последнего столбца.
15 Злопчинский
 
06.07.18
00:44
(13) Я тут в одной ветке (ибо сам не спец) попросил файл порезать на части (кстати, не забыть оплатить надо) - ну да, режет скрипт на части. только GUI серверный лег (Разрезать большой Excel-файл с кучей типовых ТОРГ12 по одной). Спеца для написания на ВБА дольше будет найти чем тупо по 1С-ному сделать все..
16 blutang
 
06.07.18
00:45
LastCellAddress = Cells.SpecialCells(11).Address
LastColumnName = Mid(LastCellAddress, 2, InStr(1, LastCellAddress, "$"))
LastColumnNumber = Columns(LastColumnName).Column
17 Злопчинский
 
06.07.18
00:45
(14) то есть SpecialCells(11) вернет 85 столбец, а SpecialCells(11).Address - даст букву 115 столбца?
18 blutang
 
06.07.18
00:45
да, сам проверил и удивился
19 Злопчинский
 
06.07.18
06:37
(18) однако... надо будет проверить...
и потом буквы столбца преобразовывать в число столбца.
а если включить в экселе настройку вывода адреса столбцов в виде чисел, а не букв, интересно что будет...
20 Кирпич
 
06.07.18
09:49
(15) Такая делилка делается за полчаса на Lazarus. Рекомендую. Там есть хорошая либа для excel. Неделю уже страдаешь из за такой ерунды.
21 patapum
 
06.07.18
10:07
(0) попробовал записать макрос нажатия Ctrl+End
дало: ActiveCell.SpecialCells(xlLastCell).Select
возможно, xlLastCell тебя спасет?
22 Вафель
 
06.07.18
10:13
xlLastCell = 11
23 Вафель
 
06.07.18
10:15
можно и другие попробовать варианты
https://msdn.microsoft.com/en-us/vba/excel-vba/articles/range-specialcells-method-excel
24 Злопчинский
 
06.07.18
10:22
(20) да сделано уже давно. но перфекционизм не дает спать спокойно.. встаю ночью.. брожу.. руки текладу просят... ;-)
25 blutang
 
06.07.18
11:02
(19) в (16) уже всё преобразовано :) А настройка вывода ничего не изменит: Address всё равно в буквах столбцы выдаст.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.