|
Номер последнего столбца в Экселе | ☑ | ||
---|---|---|---|---|
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 всё равно в буквах столбцы выдаст.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |