rikomono
Интересующийся
Offline
|
|
« : 30-05-2011 16:50 » |
|
Помогите написать макрос. 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
Молодой специалист
Offline
|
|
« Ответ #1 : 31-05-2011 05:08 » |
|
примерно так, но, скажу сразу, макрос не работает придется доработать напильником 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
Интересующийся
Offline
|
|
« Ответ #2 : 31-05-2011 05:34 » |
|
примерно так, но, скажу сразу, макрос не работает придется доработать напильником Спасибо. Пойду искать напильник, если мозгов хватит Добавлено через 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
Интересующийся
Offline
|
|
« Ответ #3 : 31-05-2011 17:21 » |
|
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
Технический
Администратор
Offline
Пол:
|
|
« Ответ #4 : 31-05-2011 17:45 » |
|
rikomono, сразу видно, что ты даже не прочитал, что тебе написали... cn.ConnectionString = "тута строка подключения"
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
rikomono
Интересующийся
Offline
|
|
« Ответ #5 : 31-05-2011 18:38 » |
|
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 »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #6 : 31-05-2011 19:27 » |
|
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
rikomono
Интересующийся
Offline
|
|
« Ответ #7 : 01-06-2011 04:53 » |
|
Спасибо за информацию. Я почитал. Там для подключения к 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 filesThis 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:\myFolder\myExcel2007file.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 textUse 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:\myFolder\myExcel2007file.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 filesThis 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:\myFolder\myBinaryExcel2007file.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 filesThis 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:\myFolder\myExcel2007file.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) " or maybe use a single quota '. "HDR=Yes;" indicates that the first row contains columnnames, not data. "HDR=No;" indicates the opposite. Для моего случая наверно надо использовать первый вариант. Подскажите как правильно это сделать. Я пробовал у меня не получилось
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #8 : 01-06-2011 07:22 » |
|
1. MS Office 2007 у тебя стоит? 2. Что не получилось? Код в студию!
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
rikomono
Интересующийся
Offline
|
|
« Ответ #9 : 01-06-2011 15:27 » |
|
Да у меня 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
Технический
Администратор
Offline
Пол:
|
|
« Ответ #10 : 01-06-2011 17:13 » |
|
Гадать лучше всего на кофейной гуще. И бубен нужен настоящий, шаманский. Если пишешь на языке, то изучи сперва его синтаксис! Когда в текст нужно вставить двойную кавычку, ее следует удвоить. x = "aaaa""bbbb"""
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
rikomono
Интересующийся
Offline
|
|
« Ответ #11 : 01-06-2011 23:40 » |
|
Гадать лучше всего на кофейной гуще. И бубен нужен настоящий, шаманский.
Если пишешь на языке, то изучи сперва его синтаксис! Я не гадаю на кофейной гуще, я просто не знаю VBA, но мне очень нужен этот макрос. Я для дочери делаю фонетическое руководство. Вот и пришёл на форум программистов за помощью. Вот мне один хороший человек написал макрос он почти работает. А точнее он работает только если каждое слово на новой строке. Там он сказал происходит слияние двух баз затем разведка в базах что это оптимально потому что каждый раз не надо дёргать базы. При первом запросе надо открыть базу Exel при втором базу Access. http://narod.ru/disk/14767153001/%2B%2B%2B.rar.htmlМне действительно очень нужен этот макрос в нормальном рабочем состоянии, можно платно в разумных пределах.
|
|
« Последнее редактирование: 01-06-2011 23:52 от rikomono »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #12 : 02-06-2011 03:17 » |
|
rikomono, эх, вот воя строчка: cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\AAA.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES"";" Макрос твой хреновый и работать не будет. Тут еще горы несуразностей. 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"";" Set rs = New ADODB.Recordset ' ------- Почему-то данной строчки не было. 'бежим по всем словам в тексте 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:=rs!BBB, 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
Строчку 20, полагаю, надо пеместить на 15-ю позицию.
|
|
« Последнее редактирование: 02-06-2011 06:48 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #13 : 02-06-2011 04:14 » |
|
Строчку 20, полагаю, надо пеместить на 15-ю позицию. это точно скажу сразу, что не получилось цикл зацикливался после команды PhoneticGuide (но лучше проверить) возможно обойти эту проблему можно заменив For i = 1 To ThisDocument.Words.Count на обратный ход, но точной уверенности нет
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
rikomono
Интересующийся
Offline
|
|
« Ответ #14 : 02-06-2011 06:26 » |
|
Макрос твой хреновый и работать не будет. Тут еще горы несуразностей. Да Вы правы он не работает, но вот посмотрите вот этот он почти работает +++.rar,запустить макрос start при первом запросе надо открыть базу Exel при втором базу Access (он работает только если каждое слово на новой строке). Как бы сделать так, чтобы макрос start производил операцию (PhoneticGuide) в обычном тексте, а не когда каждое слово на отдельной строке.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #15 : 02-06-2011 06:54 » |
|
rikomono, трудно понять, читаешь ли ты, что мы тебе пишем. Короче, вот, что коллективный разум предложил: Public Sub test() Dim w As Range Dim i As Integer Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\AAA.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES"";" 'бежим по всем словам в тексте For i = ThisDocument.Words.Count To 1 Step -1 Set w = ThisDocument.Words.Item(i) 'ищем слово в БД rs.Open cn, "select BBB from Таблица where AAA = '" + w.Text + "'" 'Слово находящееся в ячейке поля "ВВВ" справа от слова в поле "ААА" было помещено на слово в исходном тексте с помощью PhoneticGuide If Not rs.EOF Then If Asc(w.Text) > 30 Then w.PhoneticGuide Text:=rs!BBB, 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
Мне только не понятен смысл " Asc(w.Text) > 30" в строке 17.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
rikomono
Интересующийся
Offline
|
|
« Ответ #16 : 02-06-2011 16:10 » |
|
RXL, у меня вопрос, а макрос который Вы предложили у Вас работает? У меня он не работает. Может я его как-то не так запускаю или у меня чего нибудь не установлено?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #17 : 02-06-2011 19:18 » |
|
Я его не проверял. Непонятное я указал постом выше - остальное очевидно.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #18 : 03-06-2011 04:37 » |
|
Мне только не понятен смысл "Asc(w.Text) > 30" в строке 17. а это чтобы он не обрабатывал спец символы они вроде как отдельное слово или я что-то путаю У меня он не работает он работает, только что проверил, но надо доработать напильником
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
Fedor
Новенький
Offline
|
|
« Ответ #19 : 02-02-2014 07:31 » |
|
Господа мне тоже нужен такой код! Последний из предложенных выдаёт ошибку User-defined type not defined и показывает на "cn As New ADODB.Connection" из четвертой строки. Прошу не ругаться если вопрос глупый, как исправить? и как должен называться файл базы данных excel (это имя в коде указано?)?
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #20 : 02-02-2014 08:50 » |
|
Fedor, надо подключить COM-объект. Как - не скажу, MSO давно уже под рукой нет.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #21 : 03-02-2014 04:20 » |
|
выдаёт ошибку 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!
|
|
|
|