Vba word базы данных

Сейчас мы с Вами рассмотрим пример реализации того, как можно выполнить слияние данных Word с данными Microsoft SQL Server, при этом данный процесс будет автоматизирован средствами VBA Access 2003.

Слияние Word с SQL Server

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

Однажды у меня встала задача автоматизировать слияние некого шаблона Word с данными расположенными на SQL сервере, при этом все это необходимо было внедрить в программу, разработанную в Access 2003 (ADP проект). И сегодня я покажу пример решения данной задачи.

Содержание

  1. Исходные данные
  2. Создаем файл подключения к источнику данных MS SQL Server
  3. Создаем шаблон Word для слияния
  4. Код VBA Access 2003 для слияния документа Word с источником данных MS SQL Server

Исходные данные

И для начала давайте разберем исходные данные, т.е. что мы имеем.

Итак, в качестве клиента, как я уже сказал, у нас будет выступать ADP проект Access 2003. В качестве источника данных для примера будет выступать SQL Server 2012 Express. На компьютере установлен Microsoft Office 2013 (и Access 2003).

Создадим на сервере тестовую таблицу и заполним ее данными (допустим в базе данных Test). Для этого Вы можете запустить следующую SQL инструкцию.

Заметка! Начинающим программистам рекомендую почитать книгу «SQL код», с помощью которой Вы научитесь работать с языком SQL во всех популярных системах управления базами данных.

   
   CREATE TABLE dbo.TestTable(
        ID INT IDENTITY(1,1) NOT NULL,
        ProductName VARCHAR(50) NOT NULL,
        Price MONEY NULL,
   CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED (ID ASC)
   )
   GO
   INSERT INTO dbo.TestTable(ProductName, Price)
     VALUES ('Компьютер', 500)
   GO
   INSERT INTO dbo.TestTable(ProductName, Price)
     VALUES ('Монитор', 400)
   GO
   INSERT INTO dbo.TestTable(ProductName, Price)
     VALUES ('Телефон', 200)
   GO
   INSERT INTO dbo.TestTable(ProductName, Price)
     VALUES ('Планшет', 300)
   GO      
   INSERT INTO dbo.TestTable(ProductName, Price)
     VALUES ('Принтер', 250)
   GO
   SELECT * FROM TestTable

Скриншот 1

Заметка! Если Вы не знаете, что делает вышеуказанная инструкция, рекомендую посмотреть мой видеокурс «T-SQL. Путь программиста от новичка к профессионалу. Уровень 1 – Новичок», который предназначен для начинающих. В нем подробно рассмотрены все базовые конструкции языка SQL, включая все вышеперечисленные.

Теперь давайте создадим файл подключения (ODC) к нашему источнику данных. Данный файл будет выступать своего рода «шаблоном файла подключения», так как впоследствии мы можем, и будем переопределять и базу данных и сам SQL запрос.

Для создания файла подключения к SQL серверу давайте откроем Word и стандартным способом создадим данный файл, т.е. с помощью функционала «Рассылки». (Кстати пример создания подключения к SQL серверу из Excel мы с Вами уже рассматривали в материале – Excel — Подключение и получение данных с SQL сервера).

Переходим на вкладку рассылки и в меню «Выбрать получателей» выбираем «Использовать существующий список».

Скриншот 2

Затем в окне выбора источника данных нажимаем кнопку «Создать».

Скриншот 3

Далее выбираем тип источника данных, т.е. Microsoft SQL Server. Жмем «Далее».

Скриншот 4

Курс по SQL для начинающих

Потом вводим адрес сервера и нажимаем «Далее».

Скриншот 5

Затем выбираем базу данных и таблицу для подключения, еще раз напомню, это всего лишь шаблон, все эти параметры мы будем переопределять, жмем «Далее».

Скриншот 6

И в заключение вводим понятное название файла подключения, а также мы можем сразу его сохранить в нужный нам каталог путем кнопки «Обзор», по умолчанию он сохраняется в «C:UsersИмя_ПользователяDocumentsМои источники данных». Нажимаем «Готово».

Скриншот 7

Все, файл создан, Word можем закрыть без сохранения.

Создаем шаблон Word для слияния

Теперь давайте подготовим шаблон Word, т.е. это тот документ, в который мы будем подставлять данные из базы данных SQL сервера.

Вся подготовка сводится к тому, что нам необходимо вставить поля слияния там, где это нам нужно. Это делается следующим образом. Вкладка «Вставка -> Экспресс-блоки -> Поле».

Скриншот 8

Ищем поле MERGEFIELD и вводим название поля, которое будет соответствовать полю в источнике данных (в моем случае это ProductName и Price). Жмем «ОК».

Скриншот 9

Так как у меня это тестовый шаблон в нем текста практически не будет, и выводить я буду всего два поля, у Вас скорей всего будет много текста и много полей слияния.

Скриншот 10

Код VBA Access 2003 для слияния документа Word с источником данных MS SQL Server

Осталось написать код VBA, который будет осуществлять слияние. Для примера давайте добавим на форму кнопку StartMerge и поле Price для фильтрации данных. Затем в редакторе Visual Basic напишем процедуру для слияния, допустим с названием MergeWord, и в обработчик события кнопки StartMerge (нажатие кнопки) вставляем код вызова этой процедуры. Весь код будет выглядеть следующим образом (я его прокомментировал). Сразу поясню, что шаблон Word и файл ODC у меня лежат в каталоге D:Test.

   
   'Процедура для запуска слияния
   Private Sub MergeWord(TemplateWord As String, QuerySQL As String)
   'Первый параметр - Путь к шаблону Word
   'Второй параметр - Строка запроса к БД
   On Error GoTo Err1
   Dim ConnectString As String, PathOdc As String
   Dim WordApp As Object
   Dim WordDoc As Object
   'Шаблон файла ODC для подключения к данным
   PathOdc = "D:TestTestSourceData.odc"
   If TemplateWord <> "" Then
    'Создаем документ Word
    Set WordDoc = CreateObject("Word.document")
    Set WordDoc = GetObject(TemplateWord)
    Set WordApp = WordDoc.Parent
    'Создаём подключение к источнику данных (MS SQL Server)
    'Некоторые данные берём из текущего подключения ADP проекта
    ConnectString="Provider=SQLOLEDB.1;  " & _
                  "Integrated Security=SSPI;" & _
                  "Persist Security Info=True; " & _
                  "Initial Catalog=" & CurrentProject.Connection.Properties("Initial Catalog") & "; " & _
                  "Data Source=" & CurrentProject.Connection.Properties("Data Source") & "; " & _
                  "Use Procedure for Prepare=1;" & _
                  "Auto Translate=True;" & _
                  "Packet Size=4096;" & _
                  "Use Encryption for Data=False;"
    'Задаем источник данных
    WordDoc.MailMerge.OpenDataSource NAME:=PathOdc, _
                                     Connection:=ConnectString, _
                                     SQLStatement:=QuerySQL
    'Делаем видимым Word
    WordApp.Visible = True
    WordApp.Activate
    'Начинаем слияние
    With WordDoc.MailMerge
                .Destination = wdSendToNewDocument
                .SuppressBlankLines = True
                .Execute Pause:=False
    End With
    'Закрываем шаблон без сохранения
    WordDoc.close (wddonotsavechanges)
    Set WordDoc = Nothing
    Set WordApp = Nothing
   Else
    MsgBox "Не указан шаблон для слияния", vbCritical, "Ошибка"
   End If
   Ex1:
    Exit Sub
   Err1:
    MsgBox Err.Description
    WordDoc.close (wddonotsavechanges)
    WordApp.Quit
    Set WordDoc = Nothing
    Set WordApp = Nothing
    Resume Ex1
   End Sub

   Private Sub StartMerge_Click()
   Dim Filter As String
   Filter = ""
   'Условие
   If Nz(Me.Price, "") <> "" Then
    Filter = "WHERE Price >= " & Me.Price
   End If
   'Вызов процедуры слияния
   Call MergeWord("D:TestШаблон.docx", "SELECT * FROM ""TestTable"" " & Filter & " ")
   End Sub

Сохраняем и проверяем работу.

После нажатия на кнопку (StartMerge) запустится Word, в котором уже все данные заполнены и документов будет столько, сколько строк в источнике.

Скриншот 11

Как видим, все работает. На этом у меня все, надеюсь, материал был полезен. Пока!

Спасибо, я попробую

Добавлено через 1 час 13 минут
Попробовал не получилось

Добавлено через 1 час 58 минут
Помогитеее!!!!

Добавлено через 10 часов 5 минут
Я на сайте connectionstrings.com нашёл следующие варианты подключения к Exel 2007 (ACE OLEDB 12.0).
Для моего случая наверно надо использовать первый вариант. Подскажите как правильно это сделать. Я пробовал у меня не получилось.

Connection strings for Excel 2007 (ACE OLEDB 12.0)
Type: OLE DB Provider
Usage: Provider=Microsoft.ACE.OLEDB.12.0

Xlsx files
This one is for connecting to Excel 2007 files with the Xlsx file extension. That is the Office Open XML

format with macros disabled.

Код

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:myFoldermyExcel2007file.xlsx;Extended 

Properties="Excel 12.0 Xml;HDR=YES";

«HDR=Yes;» indicates that the first row contains columnnames, not data. «HDR=No;» indicates the opposite.

Treating data as text
Use this one when you want to treat all data in the file as text, overriding Excels column type

«General» to guess what type of data is in the column.

Код

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:myFoldermyExcel2007file.xlsx;Extended 

Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";

If you want to read the column headers into the result set (using HDR=NO even though there is a header) and

the column data is numeric, use IMEX=1 to avoid crash.

To always use IMEX=1 is a safer way to retrieve data for mixed data columns. Consider the scenario that one

Excel file might work fine cause that file’s data causes the driver to guess one data type while another

file, containing other data, causes the driver to guess another data type. This can cause your app to

crash.

Xlsb files
This one is for connecting to Excel 2007 files with the Xlsb file extension. That is the Office Open XML

format saved in a binary format. I e the structure is similar but it’s not saved in a text readable format

as the Xlsx files and can improve performance if the file contains a lot of data.

Код

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:myFoldermyBinaryExcel2007file.xlsb;Extended 

Properties="Excel 12.0;HDR=YES";

You can also use this connection string to connect to older 97-2003 Excel workbooks.

«HDR=Yes;» indicates that the first row contains columnnames, not data. «HDR=No;» indicates the opposite.
Xlsm files
This one is for connecting to Excel 2007 files with the Xlsm file extension. That is the Office Open XML

format with macros enabled.

Код

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:myFoldermyExcel2007file.xlsm;Extended 

Properties="Excel 12.0 Macro;HDR=YES";

Important note!
The quota » in the string needs to be escaped using your language specific escape syntax.
c#, c++ «
VB6, VBScript «»
xml (web.config etc) &quot;
or maybe use a single quota ‘.

«HDR=Yes;» indicates that the first row contains columnnames, not data. «HDR=No;» indicates the opposite.

rikomono

Интересующийся

ru
Offline Offline


Помогите написать макрос.
1)   Имеется текст в редакторе Word
2)   Нужно чтобы по каждому слову был сделан запрос к базе данных или к книги Exel
3)   Это слово там найдено.
4)   Слово находящееся в ячейке  справа было помещено на слово в исходном тексте с помощью (PhoneticGuide)
5)   А если слова нет в базе данных, то слово в тексте заключалось  бы в такие скобки <слово>

 Добавлено через 1 час, 14 минут и 59 секунд:
У меня есть такой макрос.
Я его переделал из другого насколько хватило мозгов. Но как сделать чтобы происходило обращение к базе данных Access или книги Exel, а не просто помещения текста между кавычками на слово слева?

(click to show)

Sub Trans()
Dim s As String
Do
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = ChrW(12298) & «*» & ChrW(12299)
        .Replacement.Text = «»
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute
    s = Selection.Text
    If Len(s) < 2 Then Exit Sub ‘нет искомого текста, конец работы
    s = Mid(s, 2, Len(s) — 2)   ‘удалить первый и последний символ
    Selection.Cut
    Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdExtend
    Selection.Range.PhoneticGuide Text:=s, _
        Alignment:=wdPhoneticGuideAlignmentOneTwoOne, Raise:=14, FontSize:=10 _
        , FontName:=»Lucida Sans Unicode»
Loop
End Sub

Добавлено через 10 минут и 16 секунд:
Немного поправлю свой вопрос.
1)   Имеется текст в редакторе Word
2)   Нужно чтобы по каждому слову был сделан запрос к базе данных Access или к книги Exel
3)   Поиск слова в поле «ААА».
4)   Слово находящееся в ячейке поля «ВВВ»  справа от слова в поле «ААА» было помещено на слово в исходном тексте с помощью (PhoneticGuide)
5)   А если слова нет в базе данных, то слово в тексте заключалось  бы в такие скобки <слово>
 Скромно так...

« Последнее редактирование: 30-05-2011 18:05 от rikomono »
Записан
HandKot

Молодой специалист

ru
Offline Offline


примерно так, но, скажу сразу, макрос не работает
придется доработать напильником  Внимание! Говорит и показывает...

Public Sub test()
    Dim w As Range
    Dim i As Integer
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset

        ‘открываем соединение к БД
    Set cn = New ADODB.Connection
    cn.ConnectionString = «тута строка подключения»

        ‘бежим по всем словам в тексте
    For i = 1 To ThisDocument.Words.Count
        ‘ищем слово в БД
        rs.Open cn, «select BBB from Таблица where AAA = ‘» + w.Text + «‘»

                ‘Слово находящееся в ячейке поля «ВВВ»  справа от слова в поле «ААА» было помещено на слово в исходном тексте с помощью (PhoneticGuide
        If Not rs.EOF Then
            Set w = ThisDocument.Words.Item(i)
            If Asc(w.Text) > 30 Then w.PhoneticGuide Text:=»qqq», Alignment:=wdPhoneticGuideAlignmentOneTwoOne, Raise:=14, FontSize:=10, FontName:=»Lucida Sans Unicode»

                ‘ А если слова нет в базе данных, то слово в тексте заключалось  бы в такие скобки <слово>
        Else
             w.Text = «<» + w.Text + «>»
        End If
        rs.Close
    Next

        Set rs = Nothing
    cn.Close
    Set cn = Nothing
End Sub


Записан

I Have Nine Lives You Have One Only
THINK!

rikomono

Интересующийся

ru
Offline Offline


примерно так, но, скажу сразу, макрос не работает
придется доработать напильником  Внимание! Говорит и показывает...

Спасибо. Пойду искать напильник, если мозгов хватит  Улыбаюсь

Добавлено через 11 часов, 21 минуту и 9 секунд:

примерно так, но, скажу сразу, макрос не работает

Мне помогли, написали вот такой макрос, но он тоже не работает http://narod.ru/disk/14632215001/%D0%90%D0%90%D0%90.rar.html
Там нужно как я понял две базы одна в Exel, а другая в Access и ещё вставить кусок кода?

« Последнее редактирование: 31-05-2011 16:55 от rikomono »
Записан
rikomono

Интересующийся

ru
Offline Offline


Public Sub test()
    Dim w As Range
    Dim i As Integer
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset

        ‘открываем соединение к БД
    Set cn = New ADODB.Connection
    cn.ConnectionString = «тута строка подключения»

        ‘бежим по всем словам в тексте
    For i = 1 To ThisDocument.Words.Count
        ‘ищем слово в БД
        rs.Open cn, «select BBB from Таблица where AAA = ‘» + w.Text + «‘»

                ‘Слово находящееся в ячейке поля «ВВВ»  справа от слова в поле «ААА» было помещено на слово в исходном тексте с помощью (PhoneticGuide
        If Not rs.EOF Then
            Set w = ThisDocument.Words.Item(i)
            If Asc(w.Text) > 30 Then w.PhoneticGuide Text:=»qqq», Alignment:=wdPhoneticGuideAlignmentOneTwoOne, Raise:=14, FontSize:=10, FontName:=»Lucida Sans Unicode»

                ‘ А если слова нет в базе данных, то слово в тексте заключалось  бы в такие скобки <слово>
        Else
             w.Text = «<» + w.Text + «>»
        End If
        rs.Close
    Next

        Set rs = Nothing
    cn.Close
    Set cn = Nothing
End Sub

Мне сказали, что в последнем куске кода не указана строка подключения к базе данных. А ещё для работоспособности указанного куска кода необходимо подключить к проекту VBA одну из версий библиотеки Microsoft ActiveX Data Objects. Определись, в каком формате база данных, где она находится (путь к файлу базы данных).


Записан
RXL

Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW


rikomono, сразу видно, что ты даже не прочитал, что тебе написали…

cn.ConnectionString = «тута строка подключения»


Записан

… мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

rikomono

Интересующийся

ru
Offline Offline


rikomono, сразу видно, что ты даже не прочитал, что тебе написали…

cn.ConnectionString = «тута строка подключения»

Нет я прочитал вписал туда адрес базы. Вписывал туда адрес документа Ехеl затем вписывал адрес базы Access, так и так не работает. Вылетает ошибка (Compile error: User-defined type not defined)

(click to show)

Public Sub test()
    Dim w As Range
    Dim i As Integer
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset

        ‘открываем соединение к БД
    Set cn = New ADODB.Connection
    cn.ConnectionString = «C:DataB1.accdb»

        ‘бежим по всем словам в тексте
    For i = 1 To ThisDocument.Words.Count
        ‘ищем слово в БД
        rs.Open cn, «select BBB from Таблица where AAA = ‘» + w.Text + «‘»

                ‘Слово находящееся в ячейке поля «ВВВ»  справа от слова в поле «ААА» было помещено на слово в исходном тексте с помощью (PhoneticGuide
        If Not rs.EOF Then
            Set w = ThisDocument.Words.Item(i)
            If Asc(w.Text) > 30 Then w.PhoneticGuide Text:=»qqq», Alignment:=wdPhoneticGuideAlignmentOneTwoOne, Raise:=14, FontSize:=10, FontName:=»Lucida Sans Unicode»

                ‘ А если слова нет в базе данных, то слово в тексте заключалось  бы в такие скобки <слово>
        Else
             w.Text = «<» + w.Text + «>»
        End If
        rs.Close
    Next

        Set rs = Nothing
    cn.Close
    Set cn = Nothing
End Sub

и пробовал вот так

(click to show)

Public Sub test()
    Dim w As Range
    Dim i As Integer
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset

        ‘открываем соединение к БД
    Set cn = New ADODB.Connection
    cn.ConnectionString = «C:AAA.xlsx»

        ‘бежим по всем словам в тексте
    For i = 1 To ThisDocument.Words.Count
        ‘ищем слово в БД
        rs.Open cn, «select BBB from Таблица where AAA = ‘» + w.Text + «‘»

                ‘Слово находящееся в ячейке поля «ВВВ»  справа от слова в поле «ААА» было помещено на слово в исходном тексте с помощью (PhoneticGuide
        If Not rs.EOF Then
            Set w = ThisDocument.Words.Item(i)
            If Asc(w.Text) > 30 Then w.PhoneticGuide Text:=»qqq», Alignment:=wdPhoneticGuideAlignmentOneTwoOne, Raise:=14, FontSize:=10, FontName:=»Lucida Sans Unicode»

                ‘ А если слова нет в базе данных, то слово в тексте заключалось  бы в такие скобки <слово>
        Else
             w.Text = «<» + w.Text + «>»
        End If
        rs.Close
    Next

        Set rs = Nothing
    cn.Close
    Set cn = Nothing
End Sub

Добавлено через 41 минуту и 53 секунды:
Помогите, пожалуйста, очень нужен макрос, а я к сожалению плохо разбираюсь в VBA Краснею

« Последнее редактирование: 31-05-2011 19:20 от rikomono »
Записан
rikomono

Интересующийся

ru
Offline Offline


Спасибо за информацию. Я почитал.
Там для подключения к Exel 2007 (ACE OLEDB 12.0) даны следующие варианты.

(click to show)

Connection strings for Excel 2007 (ACE OLEDB 12.0)
Type:    OLE DB Provider
Usage:  Provider=Microsoft.ACE.OLEDB.12.0

Xlsx files
This one is for connecting to Excel 2007 files with the Xlsx file extension. That is the Office Open XML format with macros disabled.

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:myFoldermyExcel2007file.xlsx;Extended Properties=»Excel 12.0 Xml;HDR=YES»;

«HDR=Yes;» indicates that the first row contains columnnames, not data. «HDR=No;» indicates the opposite.

Treating data as text
Use this one when you want to treat all data in the file as text, overriding Excels column type «General» to guess what type of data is in the column.

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:myFoldermyExcel2007file.xlsx;Extended Properties=»Excel 12.0 Xml;HDR=YES;IMEX=1″;

If you want to read the column headers into the result set (using HDR=NO even though there is a header) and the column data is numeric, use IMEX=1 to avoid crash.

To always use IMEX=1 is a safer way to retrieve data for mixed data columns. Consider the scenario that one Excel file might work fine cause that file’s data causes the driver to guess one data type while another file, containing other data, causes the driver to guess another data type. This can cause your app to crash.

Xlsb files
This one is for connecting to Excel 2007 files with the Xlsb file extension. That is the Office Open XML format saved in a binary format. I e the structure is similar but it’s not saved in a text readable format as the Xlsx files and can improve performance if the file contains a lot of data.

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:myFoldermyBinaryExcel2007file.xlsb;Extended Properties=»Excel 12.0;HDR=YES»;

You can also use this connection string to connect to older 97-2003 Excel workbooks.

«HDR=Yes;» indicates that the first row contains columnnames, not data. «HDR=No;» indicates the opposite.
Xlsm files
This one is for connecting to Excel 2007 files with the Xlsm file extension. That is the Office Open XML format with macros enabled.

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:myFoldermyExcel2007file.xlsm;Extended Properties=»Excel 12.0 Macro;HDR=YES»;

Important note!
The quota » in the string needs to be escaped using your language specific escape syntax.
c#, c++   «
VB6, VBScript   «»
xml (web.config etc)   &quot;
or maybe use a single quota ‘.

«HDR=Yes;» indicates that the first row contains columnnames, not data. «HDR=No;» indicates the opposite.

Для моего случая наверно надо использовать первый вариант. Подскажите как правильно это сделать. Я пробовал у меня не получилось


Записан
RXL

Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW


1. MS Office 2007 у тебя стоит?
2. Что  не получилось? Код в студию!


Записан

… мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

rikomono

Интересующийся

ru
Offline Offline


Да у меня MS Office 2007.
Вот код.

(click to show)

Public Sub test()
    Dim w As Range
    Dim i As Integer
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset

        ‘открываем соединение к БД
    Set cn = New ADODB.Connection
    cn.ConnectionString = «Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:AAA.xlsx;Extended Properties=»Excel 12.0 Xml;HDR=YES»;»

        ‘бежим по всем словам в тексте
    For i = 1 To ThisDocument.Words.Count
        ‘ищем слово в БД
        rs.Open cn, «select BBB from Таблица where AAA = ‘» + w.Text + «‘»

                ‘Слово находящееся в ячейке поля «ВВВ»  справа от слова в поле «ААА» было помещено на слово в исходном тексте с помощью (PhoneticGuide
        If Not rs.EOF Then
            Set w = ThisDocument.Words.Item(i)
            If Asc(w.Text) > 30 Then w.PhoneticGuide Text:=»qqq», Alignment:=wdPhoneticGuideAlignmentOneTwoOne, Raise:=14, FontSize:=10, FontName:=»Lucida Sans Unicode»

                ‘ А если слова нет в базе данных, то слово в тексте заключалось  бы в такие скобки <слово>
        Else
             w.Text = «<» + w.Text + «>»
        End If
        rs.Close
    Next

        Set rs = Nothing
    cn.Close
    Set cn = Nothing

И ещё наверно вот в  этом месте

If Asc(w.Text) > 30 Then w.PhoneticGuide Text:=»qqq», Alignment:=wdPhoneticGuideAlignmentOneTwoOne, Raise:=14, FontSize:=10, FontName:=»Lucida Sans Unicode»

Вместо «qqq» должно стоять » + w.Text + »  наверно?


Записан
RXL

Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW


Гадать лучше всего на кофейной гуще. И бубен нужен настоящий, шаманский.

Если пишешь на языке, то изучи сперва его синтаксис! Когда в текст нужно вставить двойную кавычку, ее следует удвоить.

x = «aaaa»«bbbb»«»


Записан

… мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

rikomono

Интересующийся

ru
Offline Offline


Гадать лучше всего на кофейной гуще. И бубен нужен настоящий, шаманский.

Если пишешь на языке, то изучи сперва его синтаксис!

Я не гадаю на кофейной гуще, я просто не знаю VBA, но мне очень нужен этот макрос. Я для дочери делаю фонетическое руководство. Вот и пришёл на форум программистов за помощью.
Вот мне один хороший человек написал макрос он почти работает. А точнее он работает только если каждое слово на новой строке. Там он сказал происходит слияние двух баз затем разведка в базах что это оптимально потому что каждый раз не надо дёргать базы. При первом запросе надо открыть базу Exel при втором базу Access. http://narod.ru/disk/14767153001/%2B%2B%2B.rar.html
Мне действительно очень нужен этот макрос в нормальном рабочем состоянии, можно платно в разумных пределах.

« Последнее редактирование: 01-06-2011 23:52 от rikomono »
Записан
RXL

Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW


rikomono, эх, вот воя строчка:

cn.ConnectionString = «Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:AAA.xlsx;Extended Properties=»»Excel 12.0 Xml;HDR=YES»»;»

Макрос твой хреновый и работать не будет. Тут еще горы несуразностей.

  1. Public Sub test()

  2. Dim w As Range

  3. Dim i As Integer

  4. Dim cn As ADODB.Connection

  5. Dim rs As ADODB.Recordset

  6. ‘открываем соединение к БД

  7. Set cn = New ADODB.Connection

  8.     cn.ConnectionString = «Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:AAA.xlsx;Extended Properties=»«Excel 12.0 Xml;HDR=YES»«;»

  9. Set rs = New ADODB.Recordset ‘ ——- Почему-то данной строчки не было.

  10. ‘бежим по всем словам в тексте

  11. For i = 1 To ThisDocument.Words.Count

  12. ‘ищем слово в БД  ——- Какое слово? Откуда оно взялось?

  13.        rs.Open cn, «select BBB from Таблица where AAA = ‘» + w.Text + «‘»

  14. ‘Слово находящееся в ячейке поля «ВВВ»  справа от слова в поле «ААА» было помещено на слово в исходном тексте с помощью (PhoneticGuide

  15. If Not rs.EOF Then

  16. Set w = ThisDocument.Words.Item(i)

  17. If Asc(w.Text) > 30 Then w.PhoneticGuide Text:=rs!BBB, Alignment:=wdPhoneticGuideAlignmentOneTwoOne, Raise:=14, FontSize:=10, FontName:=«Lucida Sans Unicode»

  18. ‘ А если слова нет в базе данных, то слово в тексте заключалось  бы в такие скобки <слово>

  19. Else

  20.              w.Text = «<« + w.Text + «>»

  21. End If

  22.         rs.Close

  23. Next

  24. Set rs = Nothing

  25.     cn.Close

  26. Set cn = Nothing

Строчку 20, полагаю, надо пеместить на 15-ю позицию.

« Последнее редактирование: 02-06-2011 06:48 от RXL »
Записан

… мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

HandKot

Молодой специалист

ru
Offline Offline


Строчку 20, полагаю, надо пеместить на 15-ю позицию.

это точно

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

For i = 1 To ThisDocument.Words.Count

на обратный ход, но точной уверенности нет


Записан

I Have Nine Lives You Have One Only
THINK!

rikomono

Интересующийся

ru
Offline Offline


Макрос твой хреновый и работать не будет. Тут еще горы несуразностей.

Да Вы правы он не работает, но вот посмотрите вот этот он почти работает +++.rar,запустить макрос start при первом запросе надо открыть базу Exel при втором базу Access (он работает только если каждое слово на новой строке).

Как бы сделать так, чтобы макрос start производил операцию (PhoneticGuide) в обычном тексте, а не когда каждое слово на отдельной строке.


Записан
RXL

Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW


rikomono, трудно понять, читаешь ли ты, что мы тебе пишем.

Короче, вот, что коллективный разум предложил:

  1. Public Sub test()

  2. Dim w As Range

  3. Dim i As Integer

  4. Dim cn As New ADODB.Connection

  5. Dim rs As New ADODB.Recordset

  6.     cn.ConnectionString = «Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:AAA.xlsx;Extended Properties=»«Excel 12.0 Xml;HDR=YES»«;»

  7. ‘бежим по всем словам в тексте

  8. For i = ThisDocument.Words.Count To 1 Step -1

  9. Set w = ThisDocument.Words.Item(i)

  10. ‘ищем слово в БД

  11.        rs.Open cn, «select BBB from Таблица where AAA = ‘» + w.Text + «‘»

  12. ‘Слово находящееся в ячейке поля «ВВВ»  справа от слова в поле «ААА» было помещено на слово в исходном тексте с помощью PhoneticGuide

  13. If Not rs.EOF Then

  14. If Asc(w.Text) > 30 Then w.PhoneticGuide Text:=rs!BBB, Alignment:=wdPhoneticGuideAlignmentOneTwoOne, Raise:=14, FontSize:=10, FontName:=«Lucida Sans Unicode»

  15. ‘ А если слова нет в базе данных, то слово в тексте заключалось  бы в такие скобки <слово>

  16. Else

  17.              w.Text = «<« + w.Text + «>»

  18. End If

  19.         rs.Close

  20. Next

  21. Set rs = Nothing

  22.     cn.Close

  23. Set cn = Nothing

  24. End Sub

Мне только не понятен смысл «

Asc(w.Text) > 30

» в строке 17.


Записан

… мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

rikomono

Интересующийся

ru
Offline Offline


RXL, у меня вопрос, а макрос который Вы предложили у Вас работает?
У меня он не работает. Может я его как-то  не так запускаю или у меня чего нибудь не установлено?


Записан
RXL

Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW


Я его не проверял. Непонятное я указал постом выше — остальное очевидно.


Записан

… мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

HandKot

Молодой специалист

ru
Offline Offline


Мне только не понятен смысл «Asc(w.Text) > 30» в строке 17.

а это чтобы он не обрабатывал спец символы они вроде как отдельное слово или я что-то путаю Улыбаюсь

У меня он не работает

он работает, только что проверил, но надо доработать напильником


Записан

I Have Nine Lives You Have One Only
THINK!

Fedor

Новенький

ru
Offline Offline


Господа мне тоже нужен такой код!
Последний из предложенных выдаёт ошибку User-defined type not defined и показывает на «cn As New ADODB.Connection» из четвертой строки. Прошу не ругаться если вопрос глупый, как исправить? и как должен называться файл базы данных excel (это имя в коде указано?)?


Записан
Dimka

Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской


Fedor, надо подключить COM-объект. Как — не скажу, MSO давно уже под рукой нет.


Записан

Программировать — значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)

HandKot

Молодой специалист

ru
Offline Offline


выдаёт ошибку User-defined type not defined и показывает на «cn As New ADODB.Connection» из четвертой строки.

либо подключите библиотеку Microsoft ActiveX Data Objects x.x  Library
либо замените эту строку на две

Dim cn As Object
Set cn = CreateObject(«ADODB.Connection»)


Записан

I Have Nine Lives You Have One Only
THINK!

Like this post? Please share to your friends:
  • Vba word абзац это
  • Vba word with end with
  • Vba word view type
  • Vba word this document tables
  • Vba word text font