Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Макрос для работы с текстом в Word

9.9K
25 сентября 2006 года
MoM
46 / / 12.03.2006
Помогите сделать макрос:

Дан текст (одна строка) в Word. Изменить порядок слов в этом тексте на обратный и расположить преобразованный текст на следующей строке.

С VBA столкнулся впервые, поэтому только начал изучать! Проблема в том, что не знаю как считать текст в переменную и изменить порядок слов!
Страницы:
309
26 сентября 2006 года
el scorpio
1.1K / / 19.09.2006
Чтение выделенного на экране текста производится через глобальный объект Selection.Обращение к отдельным словам производится через свойство Words (как ни странно :) ).
275
26 сентября 2006 года
pashulka
985 / / 19.09.2004
Если абстрагироваться от об'ектной модели MS Word, то в "чистом" виде Ваша программа может выглядить так :

 
Код:
Private Sub Test() 'VB6 (Word 2000)
    iText$ = "Макрос для работы с текстом"
    iMassiv = Split(iText$, " ")
    For iCount% = UBound(iMassiv) To LBound(iMassiv) Step -1
        iNewText$ = iNewText$ & " " & iMassiv(iCount%)
    Next
    MsgBox "Старый текст : " & iText$ & _
    vbNewLine & "Новый текст : " & iNewText$, vbOKOnly, ""
End Sub


Надеюсь, что теперь количество составляющих в Вашей задаче уменьшится.
9.9K
26 сентября 2006 года
MoM
46 / / 12.03.2006
Спасибо за помощь!
9.9K
02 октября 2006 года
MoM
46 / / 12.03.2006
Дополнительное задание:

В тексте с изменённым порядком слов первая буква должна быть большой, а последняя маленькой!
275
02 октября 2006 года
pashulka
985 / / 19.09.2004
Можно например так (но строка должна содержать не менее двух символов) :

 
Код:
iText$ = "новый ТексТ"

iNewText$ = UCase(Left(iText$, 1)) & Mid(iText$, 2, Len(iText$) - 2) & LCase(Right(iText$, 1))
9.9K
03 октября 2006 года
MoM
46 / / 12.03.2006
Цитата:
Можно например так (но строка должна содержать не менее двух символов) :


При использовании это команды получается, что изменённый текст принимает свой исходный вид! А мне нужно чтобы в первом слове текста с изменённым порядком слов первая буква была большой, а не маленькой, а последняя буква в последнем слове была маленькой, а не большой!

275
03 октября 2006 года
pashulka
985 / / 19.09.2004
Это шутка ? Если да, то неудачная, если нет, то что мешает просто посмотреть значение переменной iNewText$, а затем разобраться с именами переменных.
9.9K
09 октября 2006 года
MoM
46 / / 12.03.2006
Ну вот делаю так:

Код:
Sub WordsRevers()


    iText$ = "Макрос для работы с текстом"
    iMassiv = Split(iText$, " ")
   
    For iCount% = UBound(iMassiv) To LBound(iMassiv) Step -1
     iNewText$ = iNewText$ & " " & iMassiv(iCount%)
    Next
   
    iNewText1$ = UCase(Left(iNewText$, 1)) & Mid(iNewText$, 2, Len(iNewText$) - 2) & LCase(Right(iNewText$, 1))

    MsgBox "Старый текст : " & iText$ & _
    vbNewLine & "Новый текст : " & iNewText1$, vbOKOnly, ""


End Sub


Текст меняет порядок слов, но первая буква остается маленькой!

А можно этот код переделать для текста, который уже введён в ворде, а не задаётся в самом коде макроса?
275
09 октября 2006 года
pashulka
985 / / 19.09.2004
Не совсем так, после выполнения первого макроса самым первым символом идёт пробел, отсюда и эффект. Кстати, когда я говорил о именах, то подразумевал, что можно было сначала проверить работоспособность инструкции на моём примере, впрочем, сейчас это уже не важно.

Код:
Private Sub WordsRevers() 'VB6 (Word 2000)
    iText$ = "Макрос для работы с текстом"
    iMassiv = Split(iText$, " ")
   
    For iCount% = UBound(iMassiv) To LBound(iMassiv) Step -1
        iNewText$ = iNewText$ & " " & iMassiv(iCount%)
    Next
   
    iNewText$ = Trim(iNewText$) 'можно LTrim
    iNewText$ = UCase(Left(iNewText$, 1)) & Mid(iNewText$, 2, Len(iNewText$) - 2) & LCase(Right(iNewText$, 1))

    MsgBox "Старый текст : " & iText$ & _
    vbNewLine & "Новый текст : " & iNewText$, vbOKOnly, ""
End Sub


Переделать конечно же можно, но для этого нужно знать об’ектную модель MS Word, которую я не шибко хорошо знаю.
9.9K
10 октября 2006 года
MoM
46 / / 12.03.2006
pashulka
Спасибо большое!
9.9K
10 октября 2006 года
MoM
46 / / 12.03.2006
Цитата:
Переделать конечно же можно, но для этого нужно знать об’ектную модель MS Word, которую я не шибко хорошо знаю.


А никто здесь не сможет помочь это сделать?

309
10 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Я знаю :D , правда, методом тыка научного сие изучал...
Selection - выделенный текст как фрагмент документа.
Application - приложение MS Word
ActiveDocument - активный документ (а вы что подумали :) )
И так далее.

Кстати, чтобы считывать фрагмент документа по словам, можно использовать свойство Words (как ни странно...)
9.9K
17 ноября 2006 года
MoM
46 / / 12.03.2006
А как реализовать следующее:

Макрос в Word вызывает файл F.xls, в котором находится заранее записанный макрос и передаёт ему управление. Этот макрос получает строчку, меняет слова местами и выводит каждое слово в ячейке.

Вот, что сделал я:
в макросе, который выполянется в Word для выделенного текста следующий код:

Dim e As Object
Dim s As String

s = Selection.Range.Text

Set e = CreateObject("Excel.Application")
e.workbooks.Open ("D:\F.xls")
e.Visible = True
e.Run "WordRevers", s
Set e = Nothing

Т.е. он открывает файл F.xls и запускает макрос WordRevers. А что теперь прописать в этом макросе для того чтобы он изменил порядок слов выделенного текста в Word и вставил каждое слово текста с изменённым порядком слов в отдельную ячейку?
267
17 ноября 2006 года
Cutty Sark
1.2K / / 17.10.2002
Подробнее, на каком листе, в какие ячейки и.т.п.

А вообще-то удовольствия мало - жонглировать макросами в разных приложениях. Ты можешь прямо из Ворда не только открыть файл в Экселе, но и менять там ячейки сколько угодно. Вообще почти всё, что ты можешь сделать в Экселевском макросе, ты можешь сделать из Ворда, и наоборот.
9.9K
19 ноября 2006 года
MoM
46 / / 12.03.2006
Цитата:
Подробнее, на каком листе, в какие ячейки и.т.п.


На первом листе в первых верхних ячейках (не столбцом, а в строчку)!

267
19 ноября 2006 года
Cutty Sark
1.2K / / 17.10.2002
А тебе так важно, чтобы кусочек макроса находился в Экселе? Давай сделаем, что он весь будет находится в Ворде. Так будет понятней и надёжней.
9.9K
21 ноября 2006 года
MoM
46 / / 12.03.2006
Да, важно, в этом-то и проблема!
267
21 ноября 2006 года
Cutty Sark
1.2K / / 17.10.2002
А что именно у тебя вызывает сложность? Перестановка слов или размещение слов по ячейкам?
267
21 ноября 2006 года
Cutty Sark
1.2K / / 17.10.2002
Сбой. Сообщение продублировалось.
2.1K
21 ноября 2006 года
Tever
87 / / 05.08.2003
Вот решение вашей проблемы
Код:
Sub Macro8()
'
' Macro8 Macro
' Macro recorded þ21/11/2006 by *
'
Dim word1, word2, word3 As String
Dim xx1, xx2, xx3 As Integer
Selection.HomeKey Unit:=wdLine
ActiveDocument.Paragraphs(1).Range.Select
xx1 = InStr(1, Trim(ActiveDocument.Paragraphs(1)), " ")
word3 = Mid(Trim(ActiveDocument.Paragraphs(1)), 1, xx1 - 1)
'MsgBox word3
xx2 = InStr(xx1 + 1, Trim(ActiveDocument.Paragraphs(1)), " ")
word2 = Mid(Trim(ActiveDocument.Paragraphs(1)), xx1 + 1, (xx2) - (xx1 + 1))
'MsgBox word2
xx3 = Len(Trim(ActiveDocument.Paragraphs(1)))
word1 = Mid(Trim(ActiveDocument.Paragraphs(1)), xx2 + 1, (xx3) - (xx2 + 1))
'MsgBox word1
Selection.EndKey Unit:=wdLine
Selection.TypeParagraph
Selection.TypeText (word1 & " " & word2 & " " & word3)
End Sub
267
21 ноября 2006 года
Cutty Sark
1.2K / / 17.10.2002
Ну, уважаемый Tever, Вы невнимательно читали предыдущие посты.

А я всё пытаюсь раскрутить товарища MoMa на нормальное общение. А то он пишет по две строчки в неделю.
2.1K
21 ноября 2006 года
Tever
87 / / 05.08.2003
Я прочитал первый пост и выполнил все требования :)
2.1K
21 ноября 2006 года
Tever
87 / / 05.08.2003
Версия исправленная и дополненая для Worda
Код:
Sub Macro8()
'
' Macro8 Macro
' Macro recorded ю21/11/2006 by *
'
Dim word1, word2, word3 As String
Dim xx1, xx2, xx3 As Integer
Selection.HomeKey Unit:=wdLine
ActiveDocument.Paragraphs(1).Range.Select
xx1 = InStr(1, Trim(ActiveDocument.Paragraphs(1)), " ")
word3 = Mid(Trim(ActiveDocument.Paragraphs(1)), 1, xx1 - 1)
'MsgBox word3
xx2 = InStr(xx1 + 1, Trim(ActiveDocument.Paragraphs(1)), " ")
word2 = Mid(Trim(ActiveDocument.Paragraphs(1)), xx1 + 1, (xx2) - (xx1 + 1))
'MsgBox word2
xx3 = Len(Trim(ActiveDocument.Paragraphs(1)))
word1 = Mid(Trim(ActiveDocument.Paragraphs(1)), xx2 + 1, (xx3) - (xx2 + 1))
word1 = UCase(Left(word1, 1)) & Mid(word1, 2, Len(word1) - 1)

'MsgBox word1
Selection.EndKey Unit:=wdLine
Selection.TypeParagraph
Selection.TypeText (word1 & " " & LCase(word2) & " " & LCase(word3))
' Если необходимо второе и третье слова оставить в прежнем регистре надо убрать
'функцию LCase вот так:
'Selection.TypeText (word1 & " " & word2 & " " & word3)

End Sub
9.9K
21 ноября 2006 года
MoM
46 / / 12.03.2006
Цитата:
что именно у тебя вызывает сложность? Перестановка слов или размещение слов по ячейкам?


Сложность вызывает перестановка слов. Не знаю, что в цикле прописать.
Следующий код для перестановки слов я использовал в вордовском макросе:

 
Код:
For i = Selection.Range.Words.Count To 1 Step -1                    
 s = s & " " & Selection.Range.Words(i).Text                      
 s = Trim(s)                                                      
Next


А вот как его переделать под екселевский макрос?..

[quote=Tever]Вот решение вашей проблемы[/quote]
Спасибо, конечно, но первое задание я уже сделал! А сейчас мне нужна помощь в решении этого задания:
Цитата:
А как реализовать следующее:

Макрос в Word вызывает файл F.xls, в котором находится заранее записанный макрос и передаёт ему управление. Этот макрос получает строчку, меняет слова местами и выводит каждое слово в ячейке.

Вот, что сделал я:
в макросе, который выполянется в Word для выделенного текста следующий код:

Dim e As Object
Dim s As String

s = Selection.Range.Text

Set e = CreateObject("Excel.Application")
e.workbooks.Open ("D:\F.xls")
e.Visible = True
e.Run "WordRevers", s
Set e = Nothing

Т.е. он открывает файл F.xls и запускает макрос WordRevers. А что теперь прописать в этом макросе для того чтобы он изменил порядок слов выделенного текста в Word и вставил каждое слово текста с изменённым порядком слов в отдельную ячейку?

267
21 ноября 2006 года
Cutty Sark
1.2K / / 17.10.2002
Маленький вопросик: а что, если слов не три?
9.9K
21 ноября 2006 года
MoM
46 / / 12.03.2006
А их не три, их сколько введёшь, столько и будет!
2.1K
21 ноября 2006 года
Tever
87 / / 05.08.2003
Некорректная постановка задачи!!!
Сформулируйте, пожалуйста вашу задачу заново
9.9K
21 ноября 2006 года
MoM
46 / / 12.03.2006
А что именно?
2.1K
21 ноября 2006 года
Tever
87 / / 05.08.2003
Я все перечитал и, как мне кажется, понял.
Надеюсь в ближайшие дни дать ответ
2.1K
22 ноября 2006 года
Tever
87 / / 05.08.2003
Это макрос для Word'a
Код:
Sub Macro9()
Dim e As Object
Dim s As String

s = Selection.Range.Text
z = Selection.Range.Words.Count
If Asc(Right(s, 1)) = 13 Then
s = Left(s, Len(s) - 1)
z = Selection.Range.Words.Count - 1
End If
Set e = CreateObject("Excel.Application")
e.workbooks.Open ("D:\F.xls")
e.Visible = True
x = e.Run("WordReverts", Trim(s), z)
Set e = Nothing
End Sub


Это макрос для Excel'a
Код:
Sub WordReverts(sss, zzz)
xx1 = 1
For i = 1 To zzz
If i = zzz Then
xx2 = Len(Trim(sss))
word3 = Mid(Trim(sss), xx1, xx2 - xx1)
word3 = UCase(Left(word3, 1)) & Mid(word3, 2, Len(word3) - 1)
Else
xx2 = InStr(xx1, Trim(sss), " ")
word3 = Mid(Trim(sss), xx1, xx2 - xx1)
End If
xx1 = xx2 + 1
If Trim(word3) > 0 Then
Cells(1, zzz - i + 1).Select
ActiveCell.FormulaR1C1 = word3
End If
Next
End Sub

У меня все работает
9.9K
25 ноября 2006 года
MoM
46 / / 12.03.2006
Tever
Огромнейшее спасибо Вам за помощь!
9.9K
01 декабря 2006 года
MoM
46 / / 12.03.2006
А как теперь сделать тоже самое задание, только текст введён не в ворде, а в Delphi? Т.е. весь код содержится в макросе Excel_я, а работать нужно с тектсом, который введён в Delphi.
9.9K
04 декабря 2006 года
MoM
46 / / 12.03.2006
Никто не знает?
88K
07 февраля 2014 года
NeOgAt
6 / / 07.02.2014
Здравствуйте форумчане нужна помощь, кто шарит в макросах.
Нужно создать макрос, чтобы при открытия ворда выскакивало окно с вводам пароля и макрос этим паролем активировался, помогите)
275
07 февраля 2014 года
pashulka
985 / / 19.09.2004
NeOgAt, Откройте нужный документ и в модуле ThisDocument пропишите и сохраните нижеприведённый вариант, разумеется, указав свой пароль и макрос.

 
Код:
Private Sub Document_Open()
    If InputBox("Введите пароль", "") = "Ваш_пароль" Then Имя_Макроса
End Sub

'Private Sub Document_Open()
'    If InputBox("Введите пароль", "") = "Ваш_пароль" Then Application.Run "Имя_Макроса"
'End Sub
88K
08 февраля 2014 года
NeOgAt
6 / / 07.02.2014
А можете весь код написать, задача состоит в следующем: нужно написать пять штук макросов, при заходе в документ должно выскакивать поле для ввода пароля, и чтобы каждый пароль активировал свой макрос. А если пароль введен не верно то вылезало соответственное окно что пароль не верный. Опишите все поподробнее).Для ворда.
275
08 февраля 2014 года
pashulka
985 / / 19.09.2004
Я, собственно, весь код и написал, просто в случае с пятью паролями имеет смысл использовать Select Case ... т.е.

 
Код:
Private Sub Document_Open()
    Select Case InputBox("Введите пароль", "")
        Case "Пароль1": Имя_Макроса1
        Case "Пароль2": Имя_Макроса2
        Case "Пароль3": Имя_Макроса3
        Case "Пароль4": Имя_Макроса4
        Case "Пароль5": Имя_Макроса5
        Case Else: MsgBox "Неверно введён пароль", vbCritical, ""
    End Select
End Sub
88K
09 февраля 2014 года
NeOgAt
6 / / 07.02.2014
Спасибо вам огромное, нужно еще кое-что: если пароль введен не верно окно вылазит, что пароль не верен и пользователь щелкая на ок, документ закрывался автоматически). И еще необходимо поставить пароль на редактирование документа, чтобы он толь читался ну и все вот это выполнялось и другой пользователь не мог посмотреть код программы.
275
09 февраля 2014 года
pashulka
985 / / 19.09.2004
1) Для того, чтобы закрыть документ без изменений, достаточно после функции MsgBox добавить метод .Close об'екта Document, т.е.

 
Код:
MsgBox "Неверно введён пароль", vbCritical, "": Me.Close wdDoNotSaveChanges
или

 
Код:
MsgBox "Неверно введён пароль", vbCritical, "": ThisDocument.Close wdDoNotSaveChanges
2) Word97-2003 Попробуйте использовать меню Сервис, команда Установить защиту и второй или третий переключатель.

3) Word97-2003 ALT+F11 - Tools - Normal Properties - Protection - Lock Project for viewing - Password - Confirm password

P.S. Правда существуют программы, которые определяют офисные пароли, так что говорить о сурьёзной защите кода макроса, не приходится :(
88K
09 февраля 2014 года
NeOgAt
6 / / 07.02.2014
Спасибо, теперь получилось, но остался последний штрих другой пользователь не должен видеть макросов т.е. когда он заходит во вкладку вид, макросы-макросы, он не должен видеть эти все макросы там. Ворд 2010
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог