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

  • Автор темы Lina
  • Дата начала
L

Lina

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

Код:
Set vTable1 =docWord.Tables(1)
content =vTable1.Rows(14).Cells(2).Range.Text
Если в vTable1 есть объединения вертикальные, на 2 строчке примера он выдает ошибку. Есть ли с пособы работы с такими таблицами?
 

Вложения

K

Klido

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

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

здесь же, если не появилось мега-чего-то-там (кстати, мож как-то в xml вордовское файло выгрузить и потом затянуть?) порекомендовал бы оставить существующие анкеты как есть, а новые сразу заносить в базу уже...
 
A

amigolinx

#3
Судя по куску кода, это ФИО нужно забрать? Есть вариант обратиться к ячейке следующим образом
Код:
content =vTable1.Cell(14, 2).Range.Text
Собственно таким же макаром можно попытаться и другие "поля" читать...
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#6
после "этого" я понял - почему апач не "довел" POI вордовый до всех фич ;)
там реально - ужос
 
L

Lina

#7
В моем случае затык с объединением вертикальным. Т.е. если есть в таблице такое объединение, доступ к любой ячейке этой таблицы невозможен. Она не берется как объект. Я вижу два пути: отмена объединения - такого метода в объекте Table не нашла??? и последняя идея - копирование этой таблицы в новую созданную таблицу автоматом и работа уже с таблицей 2, где никаких объединений нет. Но не могу правильно выстроить код создания новой таблицы и копирование этой через, опять же, объект Table. Может быть, есть какие-то идеи по поводу копирования? Хотя это вопрос скорее к тем, кто ан VBA монстрит.
 
A

amigolinx

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

hosm

* so what *
18.05.2009
2 442
6
#10
В моем случае затык с объединением вертикальным. Т.е. если есть в таблице такое объединение, доступ к любой ячейке этой таблицы невозможен. Она не берется как объект. Я вижу два пути: отмена объединения - такого метода в объекте Table не нашла??? и последняя идея - копирование этой таблицы в новую созданную таблицу автоматом и работа уже с таблицей 2, где никаких объединений нет. Но не могу правильно выстроить код создания новой таблицы и копирование этой через, опять же, объект Table. Может быть, есть какие-то идеи по поводу копирования? Хотя это вопрос скорее к тем, кто ан VBA монстрит.
Split Method работает с Cell и Cells, посмотрите хелп ВБА. Может, Вам поможет, только задание параметров имя:=значение лотус не поддерживает (имхо)
Смотрю, тема так и просится в ветку Visual Basic? :newconfus:

Добавлено: И проверьте пример amigolinx, может, вы просто индексом ошиблись?
вроде с объединением работало, доставали данные.
 

yerke

Well-known member
28.08.2007
392
0
#11
может, вы просто индексом ошиблись
здесь врядли ошибка при выборе индекса ячейки
кажется эт глюк толи лотоса то ли ворда



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

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

замучился с этим
и передалал отчет по Ексел
:newconfus:
 
A

amigolinx

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

Смотрю, тема так и просится в ветку Visual Basic?
И не токо - она еще и в РТФМ-ветку просится ;)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#13
A

amigolinx

#14
Мамма мия! Пошли танки в дело :newconfus: А всего-то требуется вытащить из жеско заданных ячеек (индексы которых мы знаем стопудова наперед) пускай и столь креативной таблицы. Мне это напоминает "Записки невесты программиста" Экслера - тот момент, где Серега пишет программулину для "быстрой" распечатки свадебных приглашений :)
 

hosm

* so what *
18.05.2009
2 442
6
#15
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) - левой верхней ячейки объединения.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#16
OKEN
amigolinx
ведь велик человек пилит, причём с квадратными колесами, и из целого куска дерева :newconfus:
вляпается полностью, натиражирует форм и доков, а потом скажет - хочу на сервере исполнять и с чем-нить интегрить...
приложение на "одно боевое действие" - напрасная трата вемени и сил (учитывая и отсутствие навыков в "технологиях")

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

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

nvyush

Lotus team
22.04.2009
2 317
0
#17
расширить кругозор, "застасвить" думать, вырабоать подход, выдвинуть и обсудить идею... - это форум

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

amigolinx

#18
lmike, красиво излогаешь и под каждым твоим словом я с готовностью подпишусь. Но человек в данном случае не пилит велик - он на нем уже сидит, и судя по канве разговора пытается прикрутить к нему еще и камазовский бампер. Вот как в таком случае "заставить думать"? Только дать возможность проехаться и набить шишку, ибо свои шишки больнее, чем чужие - отсюда кмк и произрастет вопрос "а шо я не так делаю?", а это уже начало того "думать", о котором ты говоришь.
 

hosm

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