Вход | Регистрация



Номер последнего столбца в Экселе

Номер последнего столбца в Экселе
Я
   Злопчинский
 
05.07.18 - 18:10
77, читаем эксель
определяем границы читаемых данных
Строк    = Excel.Cells.SpecialCells(11).Row;    // строка последней ячейки

Столбцов= Excel.Cells.SpecialCells(11).Column;// столбец последней ячейки  
.
получается криво. В частности, количество столбцов определяется неверно, так как присутсвует столбец. который по всей "высоте" не заполнен данными, и после этого пустого столбца тоже есть столбцы с данными.

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

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

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

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

Нынче 21 век и пора уже использовать json или хотя бы xml и специальные системы для создания/редактирования/просмотра структурированных упорядоченных данных.
   Злопчинский
 
12 - 06.07.18 - 00:10
(11) Скажи это бюджету и всяким тендерам. Работаем с тем, что получаем, а получаем сотни ТОРГ12 и/или ТТН в виде экселевских файлов это и есть максимальный вариант автоматизации для участника цепочки передачи тмц.
   mistеr
 
13 - 06.07.18 - 00:12
(12) VBA скриптом внутри Экселя разобрать всю сотню и слить в один текстовый. Потом с спокойно, с комфортом загрузить.
   blutang
 
14 - 06.07.18 - 00:29
SpecialCells(11).Address даёт букву на самом деле последнего столбца.
   Злопчинский
 
15 - 06.07.18 - 00:44
(13) Я тут в одной ветке (ибо сам не спец) попросил файл порезать на части (кстати, не забыть оплатить надо) - ну да, режет скрипт на части. только GUI серверный лег (Разрезать большой Excel-файл с кучей типовых ТОРГ12 по одной). Спеца для написания на ВБА дольше будет найти чем тупо по 1С-ному сделать все..
   blutang
 
16 - 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 столбца?
   blutang
 
18 - 06.07.18 - 00:45
да, сам проверил и удивился
   Злопчинский
 
19 - 06.07.18 - 06:37
(18) однако... надо будет проверить...
и потом буквы столбца преобразовывать в число столбца.
а если включить в экселе настройку вывода адреса столбцов в виде чисел, а не букв, интересно что будет...
   Кирпич
 
20 - 06.07.18 - 09:49
(15) Такая делилка делается за полчаса на Lazarus. Рекомендую. Там есть хорошая либа для excel. Неделю уже страдаешь из за такой ерунды.
   patapum
 
21 - 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) да сделано уже давно. но перфекционизм не дает спать спокойно.. встаю ночью.. брожу.. руки текладу просят... ;-)
   blutang
 
25 - 06.07.18 - 11:02
(19) в (16) уже всё преобразовано :) А настройка вывода ничего не изменит: Address всё равно в буквах столбцы выдаст.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует