Semenalidery.com

IT Новости из мира ПК
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba word tables

Vba word tables

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

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

Здравствуйте, ZAMUNDA, Вы писали:
ZAM>Очевидно, надо убрать возвраты каретки.

Спасибо. Но самое интересное в том, что необходимо вырезать не один последний символ, а два,
тогда склеивание строк в итоговой ячейке отрабатывается как надо. Дело в том, что в конце каждой ячейки присутствует
спецсимвол, который, вероятно, обозначает ее конец. Так что и его вырезать надо.

И еще один вопрос вдогонку:
два файла находятся в одной директории. Как мне в коде сослаться на второй документ (в этой же директории) без указания полного пути?
В одной из САПР VBA поддерживал следующий тип записи —

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

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

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

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

K>два файла находятся в одной директории. Как мне в коде сослаться на второй документ (в этой же директории) без указания полного пути?
K>В одной из САПР VBA поддерживал следующий тип записи —

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 & «» & «имя файла»
🙂

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

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

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 и напишешь в нём процедуру а затем сохранишь документ с именем «Z:test.doc»; то вызвать эту процедуру можно так:
И не забывай, что Application.Run загрузит документ с вызываемым макросом (если надо), но по окончании своей работы не выгрузит его.

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

Vba word tables

Некоторые «фокусы» при работе стаблицами в VBA for MS Word

Предисловие
В настоящее время основная часть документооборота происходит в документах MS Word и многие из них содержат таблицы. Иногда просто необходимо представить данные из удаленной базы данных (MS SQLServer, DB2, Oracle и т.д.), в связи с чем приходится решать проблемы скорости импортирования данных из БД в документы MS Word.

Постановка задачи

Сформулируем задачу: необходимо импортировать данные, находящиеся на MS SQLServer 6.5, в документ MSWord, и будем использовать Visual Basic for Application для решения данной проблемы. Многие знают, что данную операцию можно выполнить средствами MSWord, не прибегая к помощи VBA (если вызвать панель базы данных и самим создавать источники базы данных и, используя средства MSQuery, строить запросы к БД), но не многие пользователи обладают достаточными знаниями для настроек источников БД (Data Source) и, конечно, не многие знают, какую необходимо вызвать хранимую процедуру (Stored Procеdure) и какие указать параметры для получения необходимой информации. В связи с этим программистам приходится решать эти проблемы с помощью VBA. Будем считать, что у нас на сервере инсталлирован MS SQLServer 6.5, на котором находится некоторая БД, и на машине клиента установлен ODBC. Клиент имеет свой Login на сервере (авторизация происходит на уровне сервера), и для него настроены все права (permissions) для доступа к данным (таблицам, хранимым процедурами т.д.).

«Общие приготовления»

В MicroSoft Visual Basic создадим форму UserForm для ввода некоторых параметров и сделаем так, что она будет сразу вызываться при запуске макроса:
Sub mine()
UserForm.Show
End Sub

Допустим, форма имеет следующий вид:

Как видно, форма имеет поля редактирования для ввода имени и пароля клиента (эти данные будут использоваться для подключения к серверу БД через ODBC) и возможность ввода и выбора реквизитов, которые будут использоваться как параметры вызываемой хранимой процедуры. Таким образом, мы будем вызывать хранимую процедуру на сервере с указанием необходимых параметров (но так как вызов хранимой процедуры осуществляется посредством обычного SQL, то возможно также исполнение SELECT-конструкций).

Первый «страшный» подход

Попробуем решить проблему, не зная досконально VBA for MSWord, и первым делом приходит в голову идея создать таблицу, выполнить запрос и после получения данных заполнить каждую ячейку таблицы (конечно же, используя циклы). Вот код исполнения данного «замысла»:
Задаем строку для подключения к БД, где:
ODBC — указывает на то, что подключение к серверу будет производиться через ODBC, а не через ядро Microsoft Jet
DSN — имя DataSource добавленного в ODBC Manager
UID — имя пользователя
PWD — пароль
Database — имя БД на сервере

connstring = «ODBC;DSN=mssql;UID=» + strUID + «;PWD=» + strPassword + «;Database=budget»

Dim dbs As Database
Dim qdf As QueryDef
Dim rst As Recordset

Открываем БД на сервере
Set dbs = OpenDatabase(«mssql», _
dbDriverNoPrompt, True, _
connstring)

Set qdf = dbs.CreateQueryDef(«»)

Задаем параметры объекта RecordSet (sqlstring — SQL-конструкция типа «EXEC sp_p_returndata» либо «SELECT * from . «)
With qdf
.Connect = connstring
.Sql = sqlstring
Set rst =.OpenRecordset()
If rst.RecordCount = 0 Then
MsgBox («Данные отсутствуют»)
GoTo Error
End If
End With

ActiveDocument.PageSetup.Orientation = wdOrientLandscape
Set myrange = ActiveDocument.Range(Start:=0, End:=0)

Создаем таблицу в документе (заранее известно, что в таблице будет 23 колонки — параметр NumColumns)

ActiveDocument.Tables.Add Range:=myrange, NumRows:=rst.RecordCount + 1, NumColumns:=23

Двигаясь по всем ячейкам, заносим данные из RecordSet в таблицу
For I = 2 To rst.RecordCount + 1
For K = 0 To 22
ActiveDocument.Tables(1).Cell(I, K + 1).Range = rst.Fields(K).Value
Next K
rst.MoveNext
Next I

В результате получаем таблицу, заполненную необходимыми данными, где все прекрасно работает, изумительно отформатированную, содержащую точные данные. Но такие мысли греют душу программиста до того момента, пока запрос возвращает не более 100 строк. Но все эти восхищения выполненной работой проходят после того, как вы пытаетесь выполнить запрос, который возвращает 1500 строк (в БД больших предприятий это просто мизерный набор данных). И после того как вы прождете полдня и ничего не увидите, вы поймете, что здесь что-то не так. Тогда программисту остается либо обучать всех пользователей работе с БД в MSWord, что является сущим наказанием, либо искать другие варианты решения проблемы, либо переходить из «программистов в пользователи». Конечно же, существует оптимальное решение проблемы.

Второй «приятный» подход

Теперь обратим взор к Excel. В Excel проблема решена тем, что в нем существует возможность импортирования данных через Range (которая по сравнению с Word показывает рекорд по времени, что логично, так как Excel изначально и разработан для работы с табличными данными). И не верится, что Microsoft «обидела» Word данной возможностью. Теперь приведем текст, который выполняет импорт данных из БД другим методом:

Читать еще:  Как объединить документы word в один

Задаем строку для подключения к БД
connstring = «ODBC;DSN=mssql;UID=» + strUID + «;PWD=» + strPassword + «;Database=budget»

Dim dbs As Database
Dim qdf As QueryDef
Dim rst As Recordset

Открываем БД на сервере
Set dbs = OpenDatabase(«mssql», _
dbDriverNoPrompt, True, _
connstring)

Импортируем данные из БД
With Selection
.Collapse Direction:=wdCollapseEnd
.Range.InsertDatabase Format:=wdTableFormatSimple2, Style:=16, _
LinkToSource:=False,Connection:=connstring, SQLStatement:=sqlstring
End With

Как видно, исходный текст уже стал намного короче (чем же не улучшение?). Уже отсутствует «явное» создание таблицы в документе, нет никаких циклов. Если сравнить быстродействие первого примера и второго, то скорость второго просто поражает.
Конечно, интересно, за счет чего это достигается, но пока Microsoft не открыла свои исходные тексты программ, это остается загадкой. Если посмотреть на параметры последнего оператора, то интересным является параметр Style, который позволяет изначально задавать стиль форматирования таблицы, которая получается в результате его выполнения, т.е. нет никакой потребности в вызове оператора ActiveDocument. Tables(1).AutoFormat (a в MS Word этот оператор выполняется довольно долго), что, конечно же, влияет на скорость.

Заключение

Как становится видно, нет пределов совершенствования исходных текстов и применения оптимизации. Но все еще нет совершенства в работе с таблицами в MS Word, и будем надеяться, что в скором времени мы все сможем наслаждаться прекрасными возможностями в работе с таблицами.

Особенности таблицы Word и ее связь с кодом VBA

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Сообщений [ 7 ]

1 Тема от aap77 07.02.2014 18:13:48

  • aap77
  • генерал-полковник
  • Неактивен
  • Зарегистрирован: 12.09.2011
  • Сообщений: 925
  • Поблагодарили: 242

Тема: Особенности таблицы Word и ее связь с кодом VBA

Здесь я рассказываю об особенностях таблицы Word, как объекта VBA.
1-я особенность: Многие пользователи часто сравнивают таблицу Word с таблицей Excel. Отчасти это верно, и там, и там у них общие основные свойства. Общая схема обеих таблиц в порядке подчинения выглядит так:
Таблица —> Строка (Столбец) —> Ячейка
Дальше начинаются разногласия, в основном из-за разного свойства Range (Область) в объектных моделей программ.
1. В Excel в объект Range может входить набор ячеек, которые не соседствуют между собой, как по горизонтали, так и по вертикали. А в Word это непрерывный поток данных.
Например, условновно мы имеем таблицу, состоящую из 1 строки и 3 столбцов (A1, B1, C1), то при выделении ячеек A1 и C1, Excel включит в объект Range 2-е ячейки A1 и C1, а Word — только A1, т.к. между ними есть разрыв ячека B1.
2. В Excel и в Word есть понятие Cell (Ячейка) и Cells (Ячейки).
В Word Cell и Cells представляются одноименными классами с отдельными свойствами и методами, а в Excel они представлены объектом Range, что дает намного больше преймуществ.
3. Разница получения данных из ячеек.

В Excel мы обращаемся к одному свойству Value и получаем чистый результат. Например, если в ячейке стоит 2, то для дальнейшего использования мы имеем [переменную] = 2, как число, если ячейка имеет общий или числовой формат.

В Word таже ячейка (как и любая ячейка Word) представляет собой текстовую строку с двумя лишними знаками «¶» и «¤»

Пишите мне в эту тему с отдельными вопросами связанными с данной темой. Постепенно буду здесь расмещать более развернутые вопросы.

2 Ответ от Зульфия 14.12.2016 18:11:37

  • Зульфия
  • рядовой
  • Неактивен
  • Зарегистрирован: 14.12.2016
  • Сообщений: 2

Re: Особенности таблицы Word и ее связь с кодом VBA

Добрый день! Буквально два дня изучаю макросы и пытаюсь создать макрос для таблиц. Необходимо применить ко всем таблицам стиль, задать стиль текста, стиль шапки и копирование её на следующих страницах, задать стиль подписи к таблице. Последний пункт вызывает трудности, с остальными более-менее справилась.

3 Ответ от Зульфия 14.12.2016 19:12:10

  • Зульфия
  • рядовой
  • Неактивен
  • Зарегистрирован: 14.12.2016
  • Сообщений: 2

Re: Особенности таблицы Word и ее связь с кодом VBA

Добрый день! Буквально два дня изучаю макросы и пытаюсь создать макрос для таблиц. Необходимо применить ко всем таблицам стиль, задать стиль текста, стиль шапки и копирование её на следующих страницах, задать стиль подписи к таблице. Последний пункт вызывает трудности, с остальными более-менее справилась.

Уточнение, работа идет с Word.

4 Ответ от Boris_R 21.12.2016 09:44:08

  • Boris_R
  • полковник
  • Неактивен
  • Зарегистрирован: 07.08.2012
  • Сообщений: 233
  • Поблагодарили: 110

Re: Особенности таблицы Word и ее связь с кодом VBA

Необходимо применить ко всем таблицам стиль, задать стиль текста, стиль шапки и копирование её на следующих страницах, задать стиль подписи к таблице. Последний пункт вызывает трудности, с остальными более-менее справилась.

Уточнение, работа идет с Word.

По последнему пункту — смотрите в Справке свойства и методы объектов CaptionLabel и CaptionLabels.

5 Ответ от Fck_This 28.12.2016 16:33:24

  • Fck_This
  • генерал-полковник
  • Неактивен
  • Откуда: Минск, Беларусь
  • Зарегистрирован: 13.07.2016
  • Сообщений: 648
  • Поблагодарили: 97

Re: Особенности таблицы Word и ее связь с кодом VBA

Буду признателен, если поделитесь своими знаниями в отношении объединённых ячеек таблицы по вертикали и горизонтали.

6 Ответ от aequit 02.03.2017 15:54:30

  • aequit
  • сержант
  • Неактивен
  • Зарегистрирован: 31.03.2015
  • Сообщений: 12

Re: Особенности таблицы Word и ее связь с кодом VBA

Здравствуйте!
Подскажите, можно ли занести значение в ячейку таблицы Word одной командой, вместо двух:

7 Ответ от yshindin 02.03.2017 16:10:10

  • yshindin
  • генерал-полковник
  • Активен
  • Откуда: Москва
  • Зарегистрирован: 12.05.2012
  • Сообщений: 446
  • Поблагодарили: 170
  • За сообщение: 1

Re: Особенности таблицы Word и ее связь с кодом VBA

Здравствуйте!
Подскажите, можно ли занести значение в ячейку таблицы Word одной командой, вместо двух:

Сообщений [ 7 ]

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Вы можете помочь в развитии сайта, сделав пожертвование:

Или помочь сайту популярной криптовалютой:

BTC Адрес: 1Pi3a4c6sJPbfF2sSYR2noy61DMBkncSTQ

ETH Адрес: 0x7d046a6eaa1bd712f7a6937b042e9eee4998f634

LTC Адрес: LUyT9HtGjtDyLDyEbLJZ8WZWGYUr537qbZ

DOGE Адрес: DENN2ncxBc6CcgY8SbcHGpAF87siBVq4tU

BAT Адрес: 0x7d046a6eaa1bd712f7a6937b042e9eee4998f634

XRP Адрес: rEb8TK3gBgk5auZkwc6sHnwrGVJH8DuaLh Депозит Tag: 105314946

USDT (ERC-20) Адрес: 0x7d046a6eaa1bd712f7a6937b042e9eee4998f634

Яндекс Деньги: 410013576807538

Вебмани (R ещё работает): R140551758553 или Z216149053852

А тут весь список наших разных крипто адресов, может какой добрый человек пожертвует немного монет или токенов — получит плюсик в карму от нас 🙂 Благо Дарим, за любую помощь!

Похожие темы

Особенности таблицы Word и ее связь с кодом VBA

Любую работу можно сделать несколькими различными способами. В силах человека выбрать наиболее удобный для себя, оптимальный и рациональный. На портале о Microsoft Office Word вы узнаете про: как расставить нумерацию страниц в ворде с рамкой на 15. Если говорить о работе с текстами: написании рефератов, дипломов, статей, редактировании различных документов и оформлении презентаций, то Microsoft Word дает массу возможностей для этого. Наш сайт о Microsoft Office Word даст ответ про: как поместить таблицу на одной странице.

Познакомиться с ними, расширить свои познания о программе или поделиться секретами и хитростями с другими пользователями вы можете на форуме Ворд Эксперт. На портале о Microsoft Office Word вы узнаете про: сохранить документ автоматически.

Читать еще:  Способы создания таблиц в word

Здесь собрана основная информация и ответы на наиболее популярные вопросы по работе с приложением. Например, о создании макросов, о колонтитулах, удалении лишних пробелов. На портале о Microsoft Office Word вы узнаете про: как бруть непечатаемые символы в word 2010.

В основных разделах можно обсудить настройки самого Ворда и способы работы с текстом в различных версиях программы. На портале о Microsoft Office Word вы узнаете про: изменить лист на альбомный ворд 2010. Подфорум «Автоматизация» предлагает освоить технику создания макросов и задания шаблонов для различных операций и функций. На портале о Microsoft Office Word вы узнаете про: как расположить страницу альбомно.

Здесь же на форуме можно найти готовые решения, разнообразные шаблоны, макросы для редактирования таблиц, оглавлений и многое другое. На портале о Microsoft Office Word вы узнаете про: преобразование презентации в word. Возможно и оставить заявку, описав свою проблему в соответствующем подразделе. Если у вас есть какие –то оригинальные идеи и решения – форум лучшее место поделиться ими с другими пользователями Ворда. Наш сайт о Microsoft Office Word даст ответ про: антоним к слову уважаемым.

Vba word работа с таблицами

Объект Word.Table, программная работа с таблицами в документе Word из VBA, автосуммирование

Если в вашем предложении нужно вывести какой-то стандартный документ по утвержденной форме (платежка, кассовый ордер, командировочный отчет и т.п.), то, скорее всего, для форматирования вы будете использовать таблицу. Таблица во многих ситуациях позволяет гарантировать правильное расположение данных в форме относительно друг друга. Многие программисты изначально используют таблицу даже форм, которые на таблицы походи мало (сетку таблицы всегда можно скрыть, а ячейки — слить между собой).

Создание таблицы начинается с того, что в коллекцию Tables (она предусмотрена для объектов Document, Selection и Range) добавляется новый объект Table (в данном случае — с тремя строками и четырьмя столбцами):

Set Range1 = ThisDocument.Range(Start:=0, End:=0)

Dim Table1 As Table

Set Table1 = ThisDocument.Tables.Add(Range1, 3, 4)

Затем можно настроить свойства таблицы, например, воспользовавшись методом AutoFormat() (возможности у него — те же, что доступны через меню Таблица -> Автоформат):

Table1.AutoFormat wdTableFormatGrid 5

Чаще всего в итоге нам нужно ввести какие-либо данные в ячейку таблицы. Мы можем добраться до нужной ячейки через объекты Columns и Rows, Selection и Range, однако удобнее всего сделать так:

Мы ввели во первую строку первого столбца значение 10, во вторую строку первого столбца — значение 15, а в третьей строке мы просуммировали значения по всему столбцу. Таблицы Word — это, конечно, не Excel, но при помощи метода Formula() для объекта Cell в таблицу можно вставлять достаточно сложные вычисляемые значения.

Если вы используете Word для самой распространенной цели — вывода данных, полученных из другого приложения или базы данных, то, вполне возможно, заниматься программированием таблиц вам вообще не будет нужно. Достаточно будет создать и оформить таблицу в шаблоне на графическом экране и пометить места ввода данных при помощи закладок.

В этом разделе представлены примеры Visual Basic, связанные с задачами, указанными в следующих разделах. This topic includes Visual Basic examples related to the tasks identified in the following sections.

Создание таблицы, вставка текста и применение форматирования Creating a table, inserting text, and applying formatting

В следующем примере в начало активного документа вставляется таблица из трех строк и трех столбцов. The following example inserts a four-column, three-row table at the beginning of the active document. Параметр For Each. Следующая структура используется для пошагового перехода по каждой ячейке в таблице. The For Each. Next structure is used to step through each cell in the table. В разделе For Each. Next Structure метод InsertAfter объекта Range используется для добавления текста в ячейки таблицы (ячейка 1, ячейка 2 и т. д.). Within the For Each. Next structure, the InsertAfter method of the Range object is used to add text to the table cells (Cell 1, Cell 2, and so on).

Вставка текста в ячейку таблицы Inserting text into a table cell

В примере ниже показано, как вставить текст в первую ячейку первой таблицы в активном документе. The following example inserts text into the first cell of the first table in the active document. Метод Cell возвращает один объект Cell . The Cell method returns a single Cell object. Свойство Range возвращает объект Range . The Range property returns a Range object. Метод Delete используется для удаления существующего текста, а метод InsertAfter вставляет текст «Cell 1, 1». The Delete method is used to delete the existing text and the InsertAfter method inserts the «Cell 1,1» text.

Возвращение текста из ячейки таблицы без возвращения маркера конца ячейки Returning text from a table cell without returning the end of cell marker

В следующем примере показано возвращение и отображение содержимого каждой ячейки в первой строке первой таблицы документа. The following example returns and displays the contents of each cell in the first row of the first document table.

Преобразование существующего текста в таблицу Converting existing text to a table

В примере ниже показано, как вставить текст с разделителями табуляцией в начало активного документа, а затем преобразовать текст в таблицу. The following example inserts tab-delimited text at the beginning of the active document and then converts the text to a table.

Возвращение содержимого каждой ячейки таблицы Returning the contents of each table cell

В следующем примере определяется массив, равный количеству ячеек в первой таблице документа (при условии, что параметр Base 1). The following example defines an array equal to the number of cells in the first document table (assuming Option Base 1). Параметр For Each. Следующая структура используется для возвращения содержимого каждой ячейки таблицы и назначения текста соответствующему элементу массива. The For Each. Next structure is used to return the contents of each table cell and assign the text to the corresponding array element.

Копирование всех таблиц в активном документе в новый документ Copying all tables in the active document into a new document

В этом примере показано, как скопировать таблицы из текущего документа в новый документ. This example copies the tables from the current document into a new document.

Поддержка и обратная связь Support and feedback

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Have questions or feedback about Office VBA or this documentation? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь. Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

Предисловие
В настоящее время основная часть документооборота происходит в документах MS Word и многие из них содержат таблицы. Иногда просто необходимо представить данные из удаленной базы данных (MS SQLServer, DB2, Oracle и т.д.), в связи с чем приходится решать проблемы скорости импортирования данных из БД в документы MS Word.

Постановка задачи

Сформулируем задачу: необходимо импортировать данные, находящиеся на MS SQLServer 6.5, в документ MSWord, и будем использовать Visual Basic for Application для решения данной проблемы. Многие знают, что данную операцию можно выполнить средствами MSWord, не прибегая к помощи VBA (если вызвать панель базы данных и самим создавать источники базы данных и, используя средства MSQuery, строить запросы к БД), но не многие пользователи обладают достаточными знаниями для настроек источников БД (Data Source) и, конечно, не многие знают, какую необходимо вызвать хранимую процедуру (Stored Procеdure) и какие указать параметры для получения необходимой информации. В связи с этим программистам приходится решать эти проблемы с помощью VBA. Будем считать, что у нас на сервере инсталлирован MS SQLServer 6.5, на котором находится некоторая БД, и на машине клиента установлен ODBC. Клиент имеет свой Login на сервере (авторизация происходит на уровне сервера), и для него настроены все права (permissions) для доступа к данным (таблицам, хранимым процедурами т.д.).

«Общие приготовления»

В MicroSoft Visual Basic создадим форму UserForm для ввода некоторых параметров и сделаем так, что она будет сразу вызываться при запуске макроса:
Sub mine()
UserForm.Show
End Sub

Читать еще:  Как перенести строчку в excel

Допустим, форма имеет следующий вид:

Как видно, форма имеет поля редактирования для ввода имени и пароля клиента (эти данные будут использоваться для подключения к серверу БД через ODBC) и возможность ввода и выбора реквизитов, которые будут использоваться как параметры вызываемой хранимой процедуры. Таким образом, мы будем вызывать хранимую процедуру на сервере с указанием необходимых параметров (но так как вызов хранимой процедуры осуществляется посредством обычного SQL, то возможно также исполнение SELECT-конструкций).

Первый «страшный» подход

Попробуем решить проблему, не зная досконально VBA for MSWord, и первым делом приходит в голову идея создать таблицу, выполнить запрос и после получения данных заполнить каждую ячейку таблицы (конечно же, используя циклы). Вот код исполнения данного «замысла»:
Задаем строку для подключения к БД, где:
ODBC — указывает на то, что подключение к серверу будет производиться через ODBC, а не через ядро Microsoft Jet
DSN — имя DataSource добавленного в ODBC Manager
UID — имя пользователя
PWD — пароль
Database — имя БД на сервере

Dim dbs As Database
Dim qdf As QueryDef
Dim rst As Recordset

Открываем БД на сервере
Set dbs = OpenDatabase(«mssql», _
dbDriverNoPrompt, True, _
connstring)

Set qdf = dbs.CreateQueryDef(«»)

Задаем параметры объекта RecordSet (sqlstring — SQL-конструкция типа «EXEC sp_p_returndata» либо «SELECT * from . «)
With qdf
.Connect = connstring
.Sql = sqlstring
Set rst =.OpenRecordset()
If rst.RecordCount = 0 Then
MsgBox («Данные отсутствуют»)
GoTo Error
End If
End With

ActiveDocument.PageSetup.Orientation = wdOrientLandscape
Set myrange = ActiveDocument.Range(Start:=0, End:=0)

Создаем таблицу в документе (заранее известно, что в таблице будет 23 колонки — параметр NumColumns)

ActiveDocument.Tables.Add Range:=myrange, NumRows:=rst.RecordCount + 1, NumColumns:=23

Двигаясь по всем ячейкам, заносим данные из RecordSet в таблицу
For I = 2 To rst.RecordCount + 1
For K = 0 To 22
ActiveDocument.Tables(1).Cell(I, K + 1).Range = rst.Fields(K).Value
Next K
rst.MoveNext
Next I

В результате получаем таблицу, заполненную необходимыми данными, где все прекрасно работает, изумительно отформатированную, содержащую точные данные. Но такие мысли греют душу программиста до того момента, пока запрос возвращает не более 100 строк. Но все эти восхищения выполненной работой проходят после того, как вы пытаетесь выполнить запрос, который возвращает 1500 строк (в БД больших предприятий это просто мизерный набор данных). И после того как вы прождете полдня и ничего не увидите, вы поймете, что здесь что-то не так. Тогда программисту остается либо обучать всех пользователей работе с БД в MSWord, что является сущим наказанием, либо искать другие варианты решения проблемы, либо переходить из «программистов в пользователи». Конечно же, существует оптимальное решение проблемы.

Второй «приятный» подход

Теперь обратим взор к Excel. В Excel проблема решена тем, что в нем существует возможность импортирования данных через Range (которая по сравнению с Word показывает рекорд по времени, что логично, так как Excel изначально и разработан для работы с табличными данными). И не верится, что Microsoft «обидела» Word данной возможностью. Теперь приведем текст, который выполняет импорт данных из БД другим методом:

Задаем строку для подключения к БД
connstring = «ODBC;DSN=mssql;U

Dim dbs As Database
Dim qdf As QueryDef
Dim rst As Recordset

Открываем БД на сервере
Set dbs = OpenDatabase(«mssql», _
dbDriverNoPrompt, True, _
connstring)

Импортируем данные из БД
With Selection
.Collapse Direction:=wdCollapseEnd
.Range.InsertDatabase Format:=wdTableFormatSimple2, Style:=16, _
LinkToSource:=False,Connection:=connstring, SQLStatement:=sqlstring
End With

Как видно, исходный текст уже стал намного короче (чем же не улучшение?). Уже отсутствует «явное» создание таблицы в документе, нет никаких циклов. Если сравнить быстродействие первого примера и второго, то скорость второго просто поражает.
Конечно, интересно, за счет чего это достигается, но пока Microsoft не открыла свои исходные тексты программ, это остается загадкой. Если посмотреть на параметры последнего оператора, то интересным является параметр Style, который позволяет изначально задавать стиль форматирования таблицы, которая получается в результате его выполнения, т.е. нет никакой потребности в вызове оператора ActiveDocument. Tables(1).AutoFormat (a в MS Word этот оператор выполняется довольно долго), что, конечно же, влияет на скорость.

Заключение

Как становится видно, нет пределов совершенствования исходных текстов и применения оптимизации. Но все еще нет совершенства в работе с таблицами в MS Word, и будем надеяться, что в скором времени мы все сможем наслаждаться прекрасными возможностями в работе с таблицами.

создание таблиц в MS Word с использованием VBA

Какие существуют коды для создания таблицы в MS Word?

Я использовал функцию записи для макроса, чтобы увидеть, как он записывается, и я понятия не имею, как это интерпретировать.

а можно ли не рисовать таблицы во время записи макроса? Он сереет из функции «draw table».

Мне нужно сделать тальбе, в котором есть несколько объединенных ячеек внутри таблицы — было бы проще, если бы я мог нарисовать таблицу и записать ее с помощью макроса, но, похоже, я не могу этого сделать.

Я использовал функцию draw, чтобы нарисовать таблицу follow, но я не могу ее записать.

3 Ответа

Это должно помочь вам начать работу.

основная команда для создания таблицы-это

а также для разделения / слияния ячеек:

Вы можете создать таблицу и затем сохранить ее как автотекст (выберите table — ALT+F3 — имя автотекста). Затем, когда вам понадобится таблица в документе, просто введите имя, которое вы ей дали, и нажмите F3.

Похожие вопросы:

У меня есть модуль VBA в MS-Access, который должен загружать данные из базы данных в поля формы в документе MS-Word. Я думал, что он работает нормально, но он кажется непоследовательным. Иногда это.

Я испытываю странную проблему в MS Word 2010 VBA. Я добавил команду ленты, вызывающую следующий код Selection.InsertSymbol Шрифт:=Wingdings 3, CharacterNumber:=-4028, Юникод: = True После открытия.

Я получаю тип не определен ошибка для XlEnableCancelKey при попытке использовать ShellAndWait С MS Word VBA. Xl часть XlEnableCancelKey выглядит так, как будто это, возможно, тип MS Excel. Также.

У меня есть скрипт Perl, который может определять и писать MS Word VBA в соответствии с вводом пользователя. Как я могу сделать скрипт Perl открытым Word и добавить код VBA в свою базу данных кода?

Используя MS Project 2003, я хочу экспортировать View | Gantt Chart в MS Word (2000) с помощью VBA. Как я могу этого достичь?

Я хочу вставить или отредактировать уравнения Mathtype с макросом VBA в MS-Word . Иногда мы имеем несколько уравнений в документе MS-word и должны отредактировать их с помощью макроса VBA. Например.

VBA-это язык программирования, поэтому я предполагаю, что этот вопрос в порядке на SO. Какие вызовы API и другие методы я могу использовать для извлечения определенных таблиц из документа MS-Word.

Я работаю над программой, которая может генерировать файлы MS Word, содержащие таблицы. Я хочу создать макрос, который будет принимать данные в таблицах, содержащихся в файле MS Word, и создавать из.

экспорт документов MS word с использованием codeigniter любая идея или учебник о том, как кодировать? спасибо

Я хочу проверить версию окна на другом компьютере, чтобы выполнить другую задачу на MS word 2007 vba. я попробовал этот код, который я применил на ms excel 2007 vba и работает, но не на MS word 2007.

Ссылка на основную публикацию
Adblock
detector