ОБСУЖДЕНИЕ

Отказывается читать таблицу Word при вертикальном объединении столбцов

25 ответов 14,5 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
Добрый день!
Стоит задача реализовать заполнение БД импортом по заполненным анкетам человеков.
Так вот шаблон анкеты (Word) совершенно не адаптирован под импорт, но, боюсь, задача стоит именно в том, чтобы безболезненно для клиента перейти на использование БД и оставить анкету неизменной.
В файле образец таблицы. Дело в том, что когда оставляешь небольшое количество последовательных ячеек, ошибок не появляется...
Обращаюсь я к ним след. образом:

Код:
Set vTable1 =docWord.Tables(1)
content =vTable1.Rows(14).Cells(2).Range.Text

Если в vTable1 есть объединения вертикальные, на 2 строчке примера он выдает ошибку. Есть ли с пособы работы с такими таблицами?
 

Вложения

совершенно не адаптирован под импорт
эх, за такие "шаблоны" стоило бы кое-что удалять у их создателей :rolleyes:

когда-то ещё на 5-ке не вышло у меня победить подобные табличные извращения, но там повезло - было немного заполненных файлов и я быстренько их вбил в красивые лотусиные доки...

здесь же, если не появилось мега-чего-то-там (кстати, мож как-то в xml вордовское файло выгрузить и потом затянуть?) порекомендовал бы оставить существующие анкеты как есть, а новые сразу заносить в базу уже...
 
Судя по куску кода, это ФИО нужно забрать? Есть вариант обратиться к ячейке следующим образом
Код:
content =vTable1.Cell(14, 2).Range.Text
Собственно таким же макаром можно попытаться и другие "поля" читать...
 
после "этого" я понял - почему апач не "довел" POI вордовый до всех фич ;)
там реально - ужос
 
В моем случае затык с объединением вертикальным. Т.е. если есть в таблице такое объединение, доступ к любой ячейке этой таблицы невозможен. Она не берется как объект. Я вижу два пути: отмена объединения - такого метода в объекте Table не нашла??? и последняя идея - копирование этой таблицы в новую созданную таблицу автоматом и работа уже с таблицей 2, где никаких объединений нет. Но не могу правильно выстроить код создания новой таблицы и копирование этой через, опять же, объект Table. Может быть, есть какие-то идеи по поводу копирования? Хотя это вопрос скорее к тем, кто ан VBA монстрит.
 
Да нет же, можно получить доступ. по ходу вы не пробовали/пропустили
<!--shcode--><pre><code class='auto vbscript'>content =vTable1.Cell(14, 2).Range.Text[/CODE]
У меня подобные конструкции отрабатывают четко на любых объединениях (хоть вертикальных, хоть горизонтальных), главное знать жесткие индексы ячейки, откуда берутся данные.
Объясню: в вашем коде вы пытаетесь обратиться к конкретной ячейке со стороны строки таблицы, взяв затем ее по порядковому номеру в этой строке. Разумеется, в таком случае будет ошибка, ибо строка включает в себя две объединенных. А нужно обращаться к ячейке напрямую, как советую - по четкому ее "адресу", не затрагивая строки/столбцы как сущность, тогда все пройдет на ура. Останутся тока грабли, если нужно перебирать ячейки в цикле - тогда нужно будет добавить нечто вроде обработчика ошибок
 
В моем случае затык с объединением вертикальным. Т.е. если есть в таблице такое объединение, доступ к любой ячейке этой таблицы невозможен. Она не берется как объект. Я вижу два пути: отмена объединения - такого метода в объекте Table не нашла??? и последняя идея - копирование этой таблицы в новую созданную таблицу автоматом и работа уже с таблицей 2, где никаких объединений нет. Но не могу правильно выстроить код создания новой таблицы и копирование этой через, опять же, объект Table. Может быть, есть какие-то идеи по поводу копирования? Хотя это вопрос скорее к тем, кто ан VBA монстрит.
Split Method работает с Cell и Cells, посмотрите хелп ВБА. Может, Вам поможет, только задание параметров имя:=значение лотус не поддерживает (имхо)
Смотрю, тема так и просится в ветку Visual Basic? :newconfus:

Добавлено: И проверьте пример amigolinx, может, вы просто индексом ошиблись?
вроде с объединением работало, доставали данные.
 
может, вы просто индексом ошиблись
здесь врядли ошибка при выборе индекса ячейки
кажется эт глюк толи лотоса то ли ворда



у меня тоже был такой случай
после того как сдеал вертикал мердж в таблице ворда
не смог доставать некоторые ячейки таблицы

выходило сообщ типа "не могу найти ячейку в семействе ячеек" что ли

замучился с этим
и передалал отчет по Ексел
:newconfus:
 
Народ, я ща буду плакать :newconfus:. Ну шо за игнор? Да попробуйте ж уже наконец что amigolinx тут распинается и советует :) Или пошлите его уже прямым текстом хотяб :)

Смотрю, тема так и просится в ветку Visual Basic?
И не токо - она еще и в РТФМ-ветку просится ;)
 
Мамма мия! Пошли танки в дело :newconfus: А всего-то требуется вытащить из жеско заданных ячеек (индексы которых мы знаем стопудова наперед) пускай и столь креативной таблицы. Мне это напоминает "Записки невесты программиста" Экслера - тот момент, где Серега пишет программулину для "быстрой" распечатки свадебных приглашений :)
 
lmike - в этой теме, думаю, говорить это бесполезно.
yerke
Lina
итак, VBA. если я Вас правильно поняла, мы вложенные таблицы не рассматриваем, простое объединение :newconfus:
Вот что я имела ввиду под "индексом ошиблись":
простой эксперимент, таблица в ворде: 3 столбца, 3 строки, объединяем ячейки - в 1м столбце 1-ю и 2-ю строку.
простой макрос:
Код:
Dim TBL As Table
Set TBL = ActiveDocument.Tables(1)
MsgBox TBL.Cell(1, 1).Range.Text ' тут OK - наша объединенная ячейка
MsgBox TBL.Cell(2, 1).Range.Text ' тут ошибка
Ячейка (2, 1) недоступна, к ней не обратишься (Запрашиваемый номер семейства не сущ-ет).
но текст объединенной ячейки получить можно из (1, 1) - левой верхней ячейки объединения.
 
OKEN
amigolinx
ведь велик человек пилит, причём с квадратными колесами, и из целого куска дерева :newconfus:
вляпается полностью, натиражирует форм и доков, а потом скажет - хочу на сервере исполнять и с чем-нить интегрить...
приложение на "одно боевое действие" - напрасная трата вемени и сил (учитывая и отсутствие навыков в "технологиях")

расширить кругозор, "застасвить" думать, вырабоать подход, выдвинуть и обсудить идею... - это форум

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

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

Золотые слова!
 
lmike, красиво излогаешь и под каждым твоим словом я с готовностью подпишусь. Но человек в данном случае не пилит велик - он на нем уже сидит, и судя по канве разговора пытается прикрутить к нему еще и камазовский бампер. Вот как в таком случае "заставить думать"? Только дать возможность проехаться и набить шишку, ибо свои шишки больнее, чем чужие - отсюда кмк и произрастет вопрос "а шо я не так делаю?", а это уже начало того "думать", о котором ты говоришь.
 
lmike прав. И если бы не он, тема уже бы плавно переехала в раздел VB (не увидела вовремя)
Но вот девушка что-то испугалась наших советов и убежала :)
Может, и задумается :newconfus:
 
Да нет же, можно получить доступ. по ходу вы не пробовали/пропустили
<!--shcode--><pre><code class='auto vbscript'>content =vTable1.Cell(14, 2).Range.Text[/CODE]
У меня подобные конструкции отрабатывают четко на любых объединениях (хоть вертикальных, хоть горизонтальных), главное знать жесткие индексы ячейки, откуда берутся данные.
Объясню: в вашем коде вы пытаетесь обратиться к конкретной ячейке со стороны строки таблицы, взяв затем ее по порядковому номеру в этой строке. Разумеется, в таком случае будет ошибка, ибо строка включает в себя две объединенных. А нужно обращаться к ячейке напрямую, как советую - по четкому ее "адресу", не затрагивая строки/столбцы как сущность, тогда все пройдет на ура. Останутся тока грабли, если нужно перебирать ячейки в цикле - тогда нужно будет добавить нечто вроде обработчика ошибок
Спасибо, милый человек!!! Вы совершенно правы, при таком подходе всё чудненько работает! Так что тысячу вам спасибо за ответ))))
А вот интересно, фотку можно как-то взятЬ из вордовской картинки?
 

Статистика тем

Создано
Lina,
Последний ответ от
amigolinx,
Ответы
25
Просмотры
14 504