Есть два документа *.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
Но в этом случае три значения выводятся не в одну строку, а в три, разделенные возвратом каретки.
Как склеить значения в одну строку?
Спасибо!
Здравствуйте, 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) Козьма Прутков
Здравствуйте, ZAMUNDA, Вы писали: ZAM>Очевидно, надо убрать возвраты каретки...
'Убираю символы возврата каретки.
A = Left$(A, VBA.Len(A)-1)
B = Left$(B, VBA.Len(B)-1)
C = Left$(C, VBA.Len(C)-1)
Спасибо. Но самое интересное в том, что необходимо вырезать не один последний символ, а два,
тогда склеивание строк в итоговой ячейке отрабатывается как надо. Дело в том, что в конце каждой ячейки присутствует
спецсимвол, который, вероятно, обозначает ее конец. Так что и его вырезать надо.
И еще один вопрос вдогонку:
два файла находятся в одной директории. Как мне в коде сослаться на второй документ (в этой же директории) без указания полного пути?
В одной из САПР VBA поддерживал следующий тип записи —
".\имя файла"
точка и слеш указывали на то, что файл находится в той же директории. В VBA для Word я не нашел такого...
Здравствуйте, kas1830, Вы писали:
K>два файла находятся в одной директории. Как мне в коде сослаться на второй документ (в этой же директории) без указания полного пути? K>В одной из САПР VBA поддерживал следующий тип записи —
K>".\имя файла"
K>точка и слеш указывали на то, что файл находится в той же директории. В VBA для Word я не нашел такого...
Он и сейчас это поддерживает, потому что это свойство файловой системы. Также есть функция CurDir() (и обратная к ней ChDir()), которая может дать ответ, где ищется файл. К тому же, код выполняется в некоем окружении, в котором также есть пути, например, ActiveDocument.Path или thisDocument.Path, и можено самому формировать путь к документу ActiveDocument.Path & "\" & ".\имя файла".
Здравствуйте, Vi2, Вы писали:
Vi2>Он и сейчас это поддерживает, потому что это свойство файловой системы. Также есть функция CurDir() (и обратная к ней ChDir()), которая может дать ответ, где ищется файл. К тому же, код выполняется в некоем окружении, в котором также есть пути, например, ActiveDocument.Path или thisDocument.Path, и можено самому формировать путь к документу ActiveDocument.Path & "\" & ".\имя файла".
Спасибо большое! Дельный совет.
А как насчет вопроса с использованием Application.Run...?
Здравствуйте, kas1830, Вы писали:
ZAM>>Очевидно, надо убрать возвраты каретки... :-) K>Спасибо. Но самое интересное в том, что необходимо вырезать не один последний символ, а два, K>тогда склеивание строк в итоговой ячейке отрабатывается как надо. Дело в том, что в конце каждой ячейки присутствует K>спецсимвол, который, вероятно, обозначает ее конец. Так что и его вырезать надо.
Я знаю, я про это уже писал здесь
Здравствуйте, Vi2, Вы писали:
Vi2>ActiveDocument.Path или thisDocument.Path,
Только не надо забывать, что это разные вещи! ActiveDocument это субстанция не постоянная, сделаешь Documents.Open и активным станет свежеоткрытый документ. А ThisDocument это ссылка на документ, в котором находится модуль макроса, т.е. если вызвать функцию из другого документа, то ThisDocument для этой функции уже будет свой.
Vi2>и можено самому формировать путь к документу ActiveDocument.Path & "\" & ".\имя файла".
ActiveDocument.Path & "\" & "имя файла"
:)
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Здравствуйте, 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.
Т.е. кавычки и имя модуля ты забыл. И ещё не забывай чтоб процедура была Public. Например если в документ добавишь модуль MMain и напишешь в нём процедуру
Public Sub Test86123863()
MsgBox"Привет из " & ThisDocument.Name
End Sub
а затем сохранишь документ с именем "Z:\test.doc"; то вызвать эту процедуру можно так:
И не забывай, что Application.Run загрузит документ с вызываемым макросом (если надо), но по окончании своей работы не выгрузит его.
K>но не прокатывает. Процедура находится в ThisDocument. Как до нее достучаться?
ThisDocument.<имя процедуры>
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Здравствуйте, kas1830, Вы писали:
K>-214735573 (80020003) K>Unable to run the specified macro
Номер мне ничего не говорит. Есть вариант: проверь что в "Сервис->Макрос->Безопасность...", возможно там макросы отключены. Если не сработает, то папку с обеими doc'ами в архив, на файл-шару и ссылку сюда.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Здравствуйте, 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 и вуаля!
Очередной раз убеждаюсь, что всегда необходимо экспериментировать с кодом и не бояться делать лишних телодвижений))
Здравствуйте, 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").CloseSet oWord = Nothing
непомню, но и внутри простого модуля этого документа тоже можно как-то вызвать без App...Run
K>Очередной раз убеждаюсь, что всегда необходимо экспериментировать с кодом и не бояться делать лишних телодвижений))
вот и молодец, лови оценку для поднятия духа :)
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Вопрос даже в другом: могу ли запустить в Application.Run(...) какой-либо из макросов в стороннем файле, не указывая ссылку на файл?
Просто не хочу по десять раз открывать-ракрывать файл