Заполнение ячеек таблицы Word'a в VBA
От: kas1830 Россия  
Дата: 24.03.10 13:42
Оценка:
Всем привет!

Есть два документа *.doc с созданными в них двумя таблицами.
Необходимо данные из ячейки одной таблицы переписать в другую, причем
в одну ячейку первой таблицы попадают значения из нескольких ячеек другой, разделенные пробелами.

Делаю следующее:
'Ссылаюсь на уже созданную таблицу внутри исходного документа
Dim List As Table
Set List = ThisDocument.Tables(1)

'Ссылаюсь на второй документ и таблицу в нем
Dim oWord As Word.Document
Set oWord = Documents.Open("...\*.doc")
Dim newTable As Table
Set newTable = oWord.Tables(1)

'Резервирую строковые переменные и помещаю в них значения из каждой ячейки
Dim A, B, C as String
A = newTable.Cell(1, 2).Range.Text
B = newTable.Cell(2, 2).Range.Text
C = newTable.Cell(3, 2).Range.Text

'Заношу в ячейку первой таблицы три значения из ячеек второй таблицы
List.Cell(1, 1).Range.Text = A & B & C


Но в этом случае три значения выводятся не в одну строку, а в три, разделенные возвратом каретки.
Как склеить значения в одну строку?
Спасибо!
vba word table cell
Re: Заполнение ячеек таблицы Word'a в VBA
От: ZAMUNDA Земля для жалоб и предложений
Дата: 24.03.10 15:38
Оценка:
Здравствуйте, kas1830, Вы писали:

K>Но в этом случае три значения выводятся не в одну строку, а в три, разделенные возвратом каретки.

K>Как склеить значения в одну строку?
Очевидно, надо убрать возвраты каретки... :-)
'Ссылаюсь на уже созданную таблицу внутри исходного документа
Dim List As Table
Set List = ThisDocument.Tables(1)

'Ссылаюсь на второй документ и таблицу в нем
Dim oWord As Word.Document
Set oWord = Documents.Open("...\*.doc")
Dim newTable As Table
Set newTable = oWord.Tables(1)

'Резервирую строковые переменные и помещаю в них значения из каждой ячейки
Dim A, B, C as String
A = newTable.Cell(1, 2).Range.Text
B = newTable.Cell(2, 2).Range.Text
C = newTable.Cell(3, 2).Range.Text

' Убираю символы возврата каретки.
A = Left$(A, VBA.Len(A)-1)
B = Left$(B, VBA.Len(B)-1)
C = Left$(C, VBA.Len(C)-1)

'Заношу в ячейку первой таблицы три значения из ячеек второй таблицы
List.Cell(1, 1).Range.Text = A & B & C
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[2]: Заполнение ячеек таблицы Word'a в VBA
От: kas1830 Россия  
Дата: 25.03.10 07:14
Оценка:
Здравствуйте, ZAMUNDA, Вы писали:
ZAM>Очевидно, надо убрать возвраты каретки...

'Убираю символы возврата каретки.
A = Left$(A, VBA.Len(A)-1)
B = Left$(B, VBA.Len(B)-1)
C = Left$(C, VBA.Len(C)-1)


Спасибо. Но самое интересное в том, что необходимо вырезать не один последний символ, а два,
тогда склеивание строк в итоговой ячейке отрабатывается как надо. Дело в том, что в конце каждой ячейки присутствует
спецсимвол, который, вероятно, обозначает ее конец. Так что и его вырезать надо.
Re[3]: Заполнение ячеек таблицы Word'a в VBA
От: kas1830 Россия  
Дата: 25.03.10 10:04
Оценка:
И еще один вопрос вдогонку:
два файла находятся в одной директории. Как мне в коде сослаться на второй документ (в этой же директории) без указания полного пути?
В одной из САПР VBA поддерживал следующий тип записи —
".\имя файла"

точка и слеш указывали на то, что файл находится в той же директории. В VBA для Word я не нашел такого...
Re[4]: Заполнение ячеек таблицы Word'a в VBA
От: kas1830 Россия  
Дата: 25.03.10 14:39
Оценка:
И вот еще вопрос:
необходимо запустить процедуру из другого документа.
Пробую что-то типа

Application.Run "имя_файла!имя_процедуры"

но не прокатывает. Процедура находится в ThisDocument. Как до нее достучаться?
Re[4]: Заполнение ячеек таблицы Word'a в VBA
От: Vi2 Удмуртия http://www.adem.ru
Дата: 25.03.10 17:24
Оценка:
Здравствуйте, kas1830, Вы писали:

K>два файла находятся в одной директории. Как мне в коде сослаться на второй документ (в этой же директории) без указания полного пути?

K>В одной из САПР VBA поддерживал следующий тип записи —
K>".\имя файла"

K>точка и слеш указывали на то, что файл находится в той же директории. В VBA для Word я не нашел такого...

Он и сейчас это поддерживает, потому что это свойство файловой системы. Также есть функция CurDir() (и обратная к ней ChDir()), которая может дать ответ, где ищется файл. К тому же, код выполняется в некоем окружении, в котором также есть пути, например, ActiveDocument.Path или thisDocument.Path, и можено самому формировать путь к документу ActiveDocument.Path & "\" & ".\имя файла".
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[5]: Заполнение ячеек таблицы Word'a в VBA
От: kas1830 Россия  
Дата: 25.03.10 18:08
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Он и сейчас это поддерживает, потому что это свойство файловой системы. Также есть функция CurDir() (и обратная к ней ChDir()), которая может дать ответ, где ищется файл. К тому же, код выполняется в некоем окружении, в котором также есть пути, например, ActiveDocument.Path или thisDocument.Path, и можено самому формировать путь к документу ActiveDocument.Path & "\" & ".\имя файла".


Спасибо большое! Дельный совет.
А как насчет вопроса с использованием Application.Run...?
Re[3]: Заполнение ячеек таблицы Word'a в VBA
От: ZAMUNDA Земля для жалоб и предложений
Дата: 25.03.10 19:40
Оценка:
Здравствуйте, kas1830, Вы писали:

ZAM>>Очевидно, надо убрать возвраты каретки... :-)

K>Спасибо. Но самое интересное в том, что необходимо вырезать не один последний символ, а два,
K>тогда склеивание строк в итоговой ячейке отрабатывается как надо. Дело в том, что в конце каждой ячейки присутствует
K>спецсимвол, который, вероятно, обозначает ее конец. Так что и его вырезать надо.
Я знаю, я про это уже писал здесь
Автор: VladD2
Дата: 21.01.10
.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[5]: Заполнение ячеек таблицы Word'a в VBA
От: ZAMUNDA Земля для жалоб и предложений
Дата: 25.03.10 19:41
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>ActiveDocument.Path или thisDocument.Path,

Только не надо забывать, что это разные вещи! ActiveDocument это субстанция не постоянная, сделаешь Documents.Open и активным станет свежеоткрытый документ. А ThisDocument это ссылка на документ, в котором находится модуль макроса, т.е. если вызвать функцию из другого документа, то ThisDocument для этой функции уже будет свой.

Vi2>и можено самому формировать путь к документу ActiveDocument.Path & "\" & ".\имя файла".

ActiveDocument.Path & "\" & "имя файла"
:)
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[5]: Заполнение ячеек таблицы Word'a в VBA
От: ZAMUNDA Земля для жалоб и предложений
Дата: 25.03.10 19:54
Оценка:
Здравствуйте, kas1830, Вы писали:

K>И вот еще вопрос:

K>необходимо запустить процедуру из другого документа.
K>Пробую что-то типа

K>
K>Application.Run "имя_файла!имя_процедуры"
K>

Читай внимательнее помощь:

MacroName Required String. The name of the macro. Can be any combination of template, module, and macro name. For example, the following statements are all valid.

Application.Run "Normal.Module1.MAIN"
Application.Run "MyProject.MyModule.MyProcedure"
Application.Run "'My Document.doc'!ThisModule.ThisProcedure"

Т.е. кавычки и имя модуля ты забыл. И ещё не забывай чтоб процедура была Public. Например если в документ добавишь модуль MMain и напишешь в нём процедуру
Public Sub Test86123863()
    MsgBox "Привет из " & ThisDocument.Name
End Sub
а затем сохранишь документ с именем "Z:\test.doc"; то вызвать эту процедуру можно так:
Application.Run "'z:\test.doc'!MMain.Test86123863"

И не забывай, что Application.Run загрузит документ с вызываемым макросом (если надо), но по окончании своей работы не выгрузит его.

K>но не прокатывает. Процедура находится в ThisDocument. Как до нее достучаться?

ThisDocument.<имя процедуры>
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[6]: Заполнение ячеек таблицы Word'a в VBA
От: Vi2 Удмуртия http://www.adem.ru
Дата: 26.03.10 06:19
Оценка:
Здравствуйте, ZAMUNDA, Вы писали:

ZAM>ActiveDocument.Path & "\" & "имя файла"

ZAM>
ActiveDocument.Path & "\" & "имя файла" & "\..\имя другого файла там же"
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[7]: Заполнение ячеек таблицы Word'a в VBA
От: kas1830 Россия  
Дата: 26.03.10 07:58
Оценка:
Коллеги, всем спасибо за дельные советы!

Не получается только запустить указанную процедуру в стороннем файле
с помощью Application.Run(...)
Система выдает следующую ошибку:

-214735573 (80020003)
Unable to run the specified macro


Что может быть? Процедуру сделал типа Public
Re[8]: Заполнение ячеек таблицы Word'a в VBA
От: kas1830 Россия  
Дата: 26.03.10 08:13
Оценка:
Здравствуйте, kas1830, Вы писали:

K>-214735573 (80020003)

K>Unable to run the specified macro


Поторопился. Код ошибки 2147352573
Re[8]: Заполнение ячеек таблицы Word'a в VBA
От: ZAMUNDA Земля для жалоб и предложений
Дата: 26.03.10 11:42
Оценка:
Здравствуйте, kas1830, Вы писали:

K>-214735573 (80020003)

K>Unable to run the specified macro

Номер мне ничего не говорит. Есть вариант: проверь что в "Сервис->Макрос->Безопасность...", возможно там макросы отключены. Если не сработает, то папку с обеими doc'ами в архив, на файл-шару и ссылку сюда.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[9]: Заполнение ячеек таблицы Word'a в VBA
От: kas1830 Россия  
Дата: 26.03.10 11:53
Оценка: 5 (1)
Здравствуйте, ZAMUNDA, Вы писали:

ZAM>Номер мне ничего не говорит. Есть вариант: проверь что в "Сервис->Макрос->Безопасность...", возможно там макросы отключены. Если не сработает, то папку с обеими doc'ами в архив, на файл-шару и ссылку сюда.


Косяк нашел сам! Причем чисто случайно. Look:
Вот, что я писал вначале
    Dim oWord As Word.Document
    Set oWord = Documents.Open(ThisDocument.Path & "\" & "filename.doc")
    Application.Run "'путь к файлу\filename.doc'!ThisDocument.ModuleName"
    Documents(ThisDocument.Path & "\" & "filename.doc").Close


Ошибка в третьей строчке. Файл-то уже открыт! А я прописывал полный путь снова... Вот и вылетала ошибка
Удалил все в Application.Run, кроме ModuleName и вуаля!

Очередной раз убеждаюсь, что всегда необходимо экспериментировать с кодом и не бояться делать лишних телодвижений))
Re[10]: Заполнение ячеек таблицы Word'a в VBA
От: Vi2 Удмуртия http://www.adem.ru
Дата: 26.03.10 13:37
Оценка:
Здравствуйте, kas1830, Вы писали:

K>    Dim oWord As Word.Document
K>    Set oWord = Documents.Open(ThisDocument.Path & "\" & "filename.doc")
K>    Application.Run "'путь к файлу\filename.doc'!ThisDocument.ModuleName"
K>    Documents(ThisDocument.Path & "\" & "filename.doc").Close

"Documents(ThisDocument.Path & "\" & "filename.doc").Close" эквивалентно простому "oWord.Close".
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[10]: Заполнение ячеек таблицы Word'a в VBA
От: ZAMUNDA Земля для жалоб и предложений
Дата: 26.03.10 14:42
Оценка:
Здравствуйте, kas1830, Вы писали:

K>Здравствуйте, ZAMUNDA, Вы писали:


K>Косяк нашел сам! Причем чисто случайно. Look:

Садись пять! :)

K>Ошибка в третьей строчке. Файл-то уже открыт! А я прописывал полный путь снова... Вот и вылетала ошибка

K>Удалил все в Application.Run, кроме ModuleName и вуаля!
А я тебе даже больше скажу, если уж загрузил документ в переменную, то процедуру прописанную внутри ThisDocument можно вызвать как метод этого документа.
   Dim oWord As Word.Document
    Set oWord = Documents.Open(ThisDocument.Path & "\" & "filename.doc")
        
    ' Модуль ThisDocument: Public Sub test08492374234924()
    oWord.test08492374234924
    
    oWord.Close 'проще чем Documents(ThisDocument.Path & "\" & "filename.doc").Close
    Set oWord = Nothing
непомню, но и внутри простого модуля этого документа тоже можно как-то вызвать без App...Run

K>Очередной раз убеждаюсь, что всегда необходимо экспериментировать с кодом и не бояться делать лишних телодвижений))

вот и молодец, лови оценку для поднятия духа :)
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[11]: Заполнение ячеек таблицы Word'a в VBA
От: kas1830 Россия  
Дата: 26.03.10 14:53
Оценка:
Коллеги, поглядите плз эту строчку:

Application.Run "ThisDocument.Path & " \ " & "filename.doc"!ThisDocument.MacroName"

че-то ругается на синтаксис... с апострофами тоже пробовал
Спасибо!
Re[12]: Заполнение ячеек таблицы Word'a в VBA
От: ZAMUNDA Земля для жалоб и предложений
Дата: 26.03.10 21:00
Оценка:
Здравствуйте, kas1830, Вы писали:

K>Коллеги, поглядите плз эту строчку:


K>
K>Application.Run "ThisDocument.Path & " \ " & "filename.doc"!ThisDocument.MacroName"
K>

K>че-то ругается на синтаксис... с апострофами тоже пробовал
очевидно, т.е. видно по подсветке форума:
Application.Run "'" & ThisDocument.Path & " \ " & "filename.doc'!ThisDocument.MacroName"
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[13]: Заполнение ячеек таблицы Word'a в VBA
От: kas1830 Россия  
Дата: 26.03.10 23:02
Оценка:
Здравствуйте, ZAMUNDA, Вы писали:

ZAM>очевидно, т.е. видно по подсветке форума:

ZAM>
ZAM>Application.Run "'" & ThisDocument.Path & " \ " & "filename.doc'!ThisDocument.MacroName"
ZAM>


Вопрос даже в другом: могу ли запустить в Application.Run(...) какой-либо из макросов в стороннем файле, не указывая ссылку на файл?
Просто не хочу по десять раз открывать-ракрывать файл
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.