Таблица word vba
Таблицы в VBA
Введение:
Вэтой статье мы будем создавать программукоторая будет вставлять в документ Wordтаблицу. Ты конечно же скажешь: —Зачем мне нужна эта программа, если естьстандартная, ничем не хуже этой?, и будешькак всегда не прав. Ведь из этой статьи ты не только пополнишь знания в VBA, но и научишьсяписать и применять на практике ActiveXкомпоненты.
Еслиты совсем не знаком с программированием наVBA, то можешь прочитать мою статью «ИспользованиеUserForm в VBA». В ней дается краткоеописание языка, проводится параллель междуVBA и VB, их сходства и различия.
СозданиеActiveX компонента
Ура. Настала пора писать свой ActiveX компонент.Писать его мы будем на VisualBasic»e. И так,начнем. Запускаем Бейсик, перед вами появляется окно New Project, выбираем в нем»ActiveX Control». Перед вами должна появитсятакая форма:
Она похожа на обычнуюформу у которой свойство BorderStyle = 0 — None. Нуладно, идем дальше. Кидаем сюда текстовоеполе, свойство Text = 1, свойство Locked = True (чтобынельзя было ввести текст в это текстовоеполе). Нижеего ставим две кнопки. Свойство Caption 1 кнопки= » «. Подгоняем размер User Control»a под наши кнопки итекстовое поле. Теперь надопереименовать наш проект и User Control . Дадим имя проекту Mein, UserContol»y»Spin». Ваш ActiveX долженвыглядеть примерно так:
Насталовремя писать программный код. Для началаобъявим переменную в разделе глобальныхобъявлений ActiveX контрола (это послестроки Option Explicit).
После того как мы ее объявили переходим ксобытию Initialize User Control»a, и вводим тудаследующий код:
Private Sub UserControl_Initialize()
Number = 1
End Sub
Здесьмы присваиваем переменной Number значение1. Теперь переходим к событию Click первойкнопки и вводим туда такой код:
Private Sub Command1_Click()
If Number > 1 Then
Number = Number — 1
Text1.Text = Number
End If
End Sub
Принажатии на нее мы проверяем переменную Number,если она больше 1 вычитаем из нее 1, втекстовое поле вставляем значение этойпеременной. В событие Click второй кнопкивставляем код:
Private Sub Command2_Click()
If Number Components > Browse. , открыть папку в которойнаходится нужный OCX и кликнуть по нему 2раза.
Созданиепрограммы для WORD»A
Насталовремя писать программу для Word»a. И так, запустим MsWord, после того как он откроетсяжмем Alt + F11 (или Сервис > Макрос > РедакторVisual Basic). Создаем новую форму (Insert > UserForm илина аналогичный значок в инструментах).Присваиваем ей имя (свойство Name) frmTables,выставляем свойство Сaption = «Созданиетаблицы» Теперь нам надо извлечь нашранее написанный ActiveX компонент и поместитьна нашу форму. Для этого в окне Toolbox на какой ни будьиз вкладок (обычно это вкладка Controls)нажимаем правой кнопкой мыши и выбираемAdditional Controls. перед вами должно открытьсяокно со всеми зарегистрированными всистеме ActiveX компонентами, в нем выбираем нашОСХ»сик (если вы все сделали как написановыше он должен называться Mein.Spin) и жмемкнопку OK. После этого в окне Toolbox долженпоявиться новый инструмент, и выглядеть ондолжен так(я его выделил красным цветом):
Кидаемдва таких инструмента на нашу форму, одинпод другим, слева от них ставим лейблы, вверхней метке свойство Caption = «Числостолбцов», в нижней «Число строк».Ниже всего этого ставим две кнопки, уверхней свойство Name = cmdNewTables, свойство Caption = «Создать таблицу», у нижнейсоответственно Name = «cmdCancel», Caption = «Отмена». С права можно поместить лейблс описанием программы. У вас должнополучится примерно так:
Синтерфейсом программы разобрались, а это,поверь мне читатель, совсем не мало.Приступаем к завершающей стадии нашейстатьи, пишем программный код нашейпрограммы. Он совсем не сложный благодарятому что мы используем ActiveX компоненты. Итак, начнем, перед этим слегка закатимрукава, так на всякий случай, чтобы немешали :))). Кликаем два раза по кнопке cmdNewTables и вносим туда такой код:
Private Sub cmdNewTables_Click()
Dim myrange
Set myrange = ActiveDocument.range(0, 0)
Selection.Tables.Add range:=myrange, NumRows:=Spin2.Number,_ NumColumns:=Spin1.Number
Selection.Collapse Direction:=wdCollapseEnd
Unload Me «выгружае наше окно
End Sub
Ондостаточно прост и я не буду заострятьвнимание на каждой строке программы (еслиты что-то не понятно можешь посмотретьсправку, в ней все подробно описано), а лишьобъясню подключение нашего ActiveX компонента,вернее двух его экземпляров.
Дляэтого еще раз всмотритесь в строку Selection.Tables.Addrange:=myrange, NumRows:=Spin2.Number, NumColumns:=Spin1.Number .Вспомните переменную Number которую мыобъявляли в области глобальных объявленийнашего ActiveX компонента. Когда мывставляем таблицу в документ намнеобходимо указать количество строк (NumRows) иколичество столбцов (NumColumns) в создаваемойтаблице, для этого мы использовали значениепеременной Number. Теперь напишем кодкнопки cmdCancel, он очень прост:
Private Sub cmdCancel_Click()
Unload Me «выгрузить это окно
End Sub
Осталсяпоследний штрих — вынести нашу программу напанель инструментов MS Word»а. Для этогосоздаем новый модуль(он создаетсяаналогично форме, даем ему имя modTables. Ивписываем в него следующий код:
Послечего закрываем редактор VBA и переходим вокно Word»a. Заходим в Сервис>Настройка>переходим в раздел «Команды» в окне «Категории»находим «Макросы» и в окне «Команды»находим (если вы все сделали как былонаписано выше) Normal.modTables.modTablesCount . Щелкаем поэтой надписи и не отпуская левой кнопкимыши тащим ее на удобную для вас панельинструментов и отпускаем. Получившуюсякнопку можно отредактировать, поменять вней надпись, использовать картинку. Дляэтого достаточно нажать правую кнопку мыши,над нашей кнопкой, главное чтобы при этойоперации было открыто окно «Настройка»иначе ничего не получится.
Послередактирования кнопки закрываем окно «Настройка»и жмем по новой кнопке. Если все сделалиправильно, должно открыться окно которое мыделали выше.
Таблица word vba
Здравствуйте, 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таблицу. Ты конечно же скажешь: —Зачем мне нужна эта программа, если естьстандартная, ничем не хуже этой?, и будешькак всегда не прав. Ведь из этой статьи ты не только пополнишь знания в VBA, но и научишьсяписать и применять на практике ActiveXкомпоненты.
Еслиты совсем не знаком с программированием наVBA, то можешь прочитать мою статью «ИспользованиеUserForm в VBA». В ней дается краткоеописание языка, проводится параллель междуVBA и VB, их сходства и различия.
СозданиеActiveX компонента
Ура. Настала пора писать свой ActiveX компонент.Писать его мы будем на VisualBasic»e. И так,начнем. Запускаем Бейсик, перед вами появляется окно New Project, выбираем в нем»ActiveX Control». Перед вами должна появитсятакая форма:
Она похожа на обычнуюформу у которой свойство BorderStyle = 0 — None. Нуладно, идем дальше. Кидаем сюда текстовоеполе, свойство Text = 1, свойство Locked = True (чтобынельзя было ввести текст в это текстовоеполе). Нижеего ставим две кнопки. Свойство Caption 1 кнопки= » «. Подгоняем размер User Control»a под наши кнопки итекстовое поле. Теперь надопереименовать наш проект и User Control . Дадим имя проекту Mein, UserContol»y»Spin». Ваш ActiveX долженвыглядеть примерно так:
Насталовремя писать программный код. Для началаобъявим переменную в разделе глобальныхобъявлений ActiveX контрола (это послестроки Option Explicit).
После того как мы ее объявили переходим ксобытию Initialize User Control»a, и вводим тудаследующий код:
Private Sub UserControl_Initialize()
Number = 1
End Sub
Здесьмы присваиваем переменной Number значение1. Теперь переходим к событию Click первойкнопки и вводим туда такой код:
Private Sub Command1_Click()
If Number > 1 Then
Number = Number — 1
Text1.Text = Number
End If
End Sub
Принажатии на нее мы проверяем переменную Number,если она больше 1 вычитаем из нее 1, втекстовое поле вставляем значение этойпеременной. В событие Click второй кнопкивставляем код:
Private Sub Command2_Click()
If Number Components > Browse. , открыть папку в которойнаходится нужный OCX и кликнуть по нему 2раза.
Созданиепрограммы для WORD»A
Насталовремя писать программу для Word»a. И так, запустим MsWord, после того как он откроетсяжмем Alt + F11 (или Сервис > Макрос > РедакторVisual Basic). Создаем новую форму (Insert > UserForm илина аналогичный значок в инструментах).Присваиваем ей имя (свойство Name) frmTables,выставляем свойство Сaption = «Созданиетаблицы» Теперь нам надо извлечь нашранее написанный ActiveX компонент и поместитьна нашу форму. Для этого в окне Toolbox на какой ни будьиз вкладок (обычно это вкладка Controls)нажимаем правой кнопкой мыши и выбираемAdditional Controls. перед вами должно открытьсяокно со всеми зарегистрированными всистеме ActiveX компонентами, в нем выбираем нашОСХ»сик (если вы все сделали как написановыше он должен называться Mein.Spin) и жмемкнопку OK. После этого в окне Toolbox долженпоявиться новый инструмент, и выглядеть ондолжен так(я его выделил красным цветом):
Кидаемдва таких инструмента на нашу форму, одинпод другим, слева от них ставим лейблы, вверхней метке свойство Caption = «Числостолбцов», в нижней «Число строк».Ниже всего этого ставим две кнопки, уверхней свойство Name = cmdNewTables, свойство Caption = «Создать таблицу», у нижнейсоответственно Name = «cmdCancel», Caption = «Отмена». С права можно поместить лейблс описанием программы. У вас должнополучится примерно так:
Синтерфейсом программы разобрались, а это,поверь мне читатель, совсем не мало.Приступаем к завершающей стадии нашейстатьи, пишем программный код нашейпрограммы. Он совсем не сложный благодарятому что мы используем ActiveX компоненты. Итак, начнем, перед этим слегка закатимрукава, так на всякий случай, чтобы немешали :))). Кликаем два раза по кнопке cmdNewTables и вносим туда такой код:
Private Sub cmdNewTables_Click()
Dim myrange
Set myrange = ActiveDocument.range(0, 0)
Selection.Tables.Add range:=myrange, NumRows:=Spin2.Number,_ NumColumns:=Spin1.Number
Selection.Collapse Direction:=wdCollapseEnd
Unload Me «выгружае наше окно
End Sub
Ондостаточно прост и я не буду заострятьвнимание на каждой строке программы (еслиты что-то не понятно можешь посмотретьсправку, в ней все подробно описано), а лишьобъясню подключение нашего ActiveX компонента,вернее двух его экземпляров.
Дляэтого еще раз всмотритесь в строку Selection.Tables.Addrange:=myrange, NumRows:=Spin2.Number, NumColumns:=Spin1.Number .Вспомните переменную Number которую мыобъявляли в области глобальных объявленийнашего ActiveX компонента. Когда мывставляем таблицу в документ намнеобходимо указать количество строк (NumRows) иколичество столбцов (NumColumns) в создаваемойтаблице, для этого мы использовали значениепеременной Number. Теперь напишем кодкнопки cmdCancel, он очень прост:
Private Sub cmdCancel_Click()
Unload Me «выгрузить это окно
End Sub
Осталсяпоследний штрих — вынести нашу программу напанель инструментов MS Word»а. Для этогосоздаем новый модуль(он создаетсяаналогично форме, даем ему имя modTables. Ивписываем в него следующий код:
Послечего закрываем редактор VBA и переходим вокно Word»a. Заходим в Сервис>Настройка>переходим в раздел «Команды» в окне «Категории»находим «Макросы» и в окне «Команды»находим (если вы все сделали как былонаписано выше) Normal.modTables.modTablesCount . Щелкаем поэтой надписи и не отпуская левой кнопкимыши тащим ее на удобную для вас панельинструментов и отпускаем. Получившуюсякнопку можно отредактировать, поменять вней надпись, использовать картинку. Дляэтого достаточно нажать правую кнопку мыши,над нашей кнопкой, главное чтобы при этойоперации было открыто окно «Настройка»иначе ничего не получится.
Послередактирования кнопки закрываем окно «Настройка»и жмем по новой кнопке. Если все сделалиправильно, должно открыться окно которое мыделали выше.
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
Допустим, форма имеет следующий вид:
Как видно, форма имеет поля редактирования для ввода имени и пароля клиента (эти данные будут использоваться для подключения к серверу БД через 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, и будем надеяться, что в скором времени мы все сможем наслаждаться прекрасными возможностями в работе с таблицами.
Особенности таблицы 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 вы узнаете про: сохранить документ автоматически.
Здесь собрана основная информация и ответы на наиболее популярные вопросы по работе с приложением. Например, о создании макросов, о колонтитулах, удалении лишних пробелов. На портале о Microsoft Office Word вы узнаете про: как бруть непечатаемые символы в word 2010.
В основных разделах можно обсудить настройки самого Ворда и способы работы с текстом в различных версиях программы. На портале о Microsoft Office Word вы узнаете про: изменить лист на альбомный ворд 2010. Подфорум «Автоматизация» предлагает освоить технику создания макросов и задания шаблонов для различных операций и функций. На портале о Microsoft Office Word вы узнаете про: как расположить страницу альбомно.
Здесь же на форуме можно найти готовые решения, разнообразные шаблоны, макросы для редактирования таблиц, оглавлений и многое другое. На портале о Microsoft Office Word вы узнаете про: преобразование презентации в word. Возможно и оставить заявку, описав свою проблему в соответствующем подразделе. Если у вас есть какие –то оригинальные идеи и решения – форум лучшее место поделиться ими с другими пользователями Ворда. Наш сайт о Microsoft Office Word даст ответ про: антоним к слову уважаемым.