1

Тема: Обрамление выделенного фрагмента скобками

Уважаемые гуру,
помогите, пожалуйста, со следующим скриптом.
По умолчанию, при нажатии клавиши скобки, выделенный фрагмент, слово или фраза, заменяется на скобку, хотя очень удобно было бы, если бы этот фрагмент оставался и всего лишь обрамлялся скобками. При отсутствии выделения просто вставляется скобка. Это реально?

2

Re: Обрамление выделенного фрагмента скобками

Пожалуйста, небольшой макрос:

Sub GetBrackets()
    If Selection.End - Selection.Start <> 0 Then
        Selection.TypeText Text:="(" & Selection.Text & ")"
    End If
End Sub

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

Внимание! В выделении должен быть только текст (никаких объектов)!

Макрос можно "привязать" к какому-нибудь сочетанию клавиш.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

3

Re: Обрамление выделенного фрагмента скобками

Желательно, конечно, было бы сделать так:
- установить курсор на позицию Selection.Start;
- вставить там символ открывающейся скобки;
- затем установить курсор на позицию Selection.End;
- и вставить там символ закрывающейся скобки.

Коллеги, не подскажете, имеется ли возможность переходить на позиции Selection.Start и Selection.End (что-то вроде метода Offset в Excel)?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

4

Re: Обрамление выделенного фрагмента скобками

Спасибо большое.
Такой вопрос. Назначить Shift+9, который на клавиатуре соответствует скобке, на запуск макроса не удается. Можно ли сделать этот макрос автоматическим, чтобы он отслеживал нажатие скобки?

5

Re: Обрамление выделенного фрагмента скобками

sylvio пишет:

Спасибо большое.
Такой вопрос. Назначить Shift+9, который на клавиатуре соответствует скобке, на запуск макроса не удается. Можно ли сделать этот макрос автоматическим, чтобы он отслеживал нажатие скобки?

Обычно макрос назначается специальным сочетаниям клавиш. К сожалению, я не уверен, что можно назначить макрос сочетанию клавиш Shift+9.
Может быть, можно как-то это сделать через Автозамену?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

6

Re: Обрамление выделенного фрагмента скобками

Вот более безопасный код (не изменяющий текст выделения):

Sub GetBrackets()
    Dim intStart As Integer
    Dim intEnd As Integer
    intStart = Selection.Start
    intEnd = Selection.End
    If Selection.End - Selection.Start <> 0 Then
    'индексы конца и начала выделения
    'если выделения нет, то индексы конца и начала выделения равны 
         Selection.MoveLeft Unit:=wdCharacter, Count:=1
         Selection.TypeText Text:="("
         Selection.MoveRight Unit:=wdCharacter, Count:=intEnd - intStart
         Selection.TypeText Text:=")"
    End If
End Sub

В этом случае в выделении может быть не только текст, но и объекты.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

7

Re: Обрамление выделенного фрагмента скобками

sylvio пишет:

Спасибо большое.
Такой вопрос. Назначить Shift+9, который на клавиатуре соответствует скобке, на запуск макроса не удается. Можно ли сделать этот макрос автоматическим, чтобы он отслеживал нажатие скобки?

Свободна, например, комбинация клавиш Ctrl+9. Ее можно назначить макросу.

Немного изменил макрос, чтобы при отсутствии выделения печаталась открывающаяся скобка:

Sub GetBrackets()
    Dim intStart As Integer
    Dim intEnd As Integer
    intStart = Selection.Start
    intEnd = Selection.End
    If Selection.End - Selection.Start <> 0 Then
    'индексы конца и начала выделения
    'если выделения нет, то индексы конца и начала выделения равны 
         Selection.MoveLeft Unit:=wdCharacter, Count:=1
         Selection.TypeText Text:="("
         Selection.MoveRight Unit:=wdCharacter, Count:=intEnd - intStart
         Selection.TypeText Text:=")"
    Else
         'при отсутствии выделения печатается открывающаяся скобка
         Selection.TypeText Text:="("
    End If
End Sub
Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

8

Re: Обрамление выделенного фрагмента скобками

В надстройке Disser реализована автоматическая замена одинарной скобки на двойную. Но я в макросописании не силен, не могу разобраться как это реализовано. Надеюсь, это не будет каким-либо нарушением, если я вставлю в это сообщение код из макроса, который, к слову сказать, никак не запаролирован. Вот он:

Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Declare Function GetKeyboardLayout Lib "user32" (ByVal pThread As Long) As Long
Declare Function WinHelpA Lib "user32" (ByVal hwnd As Long, ByVal lpHelpFile As String, ByVal wCommand As Long, ByVal dwData As Long) As Long
Const EN = 67699721
Sub SetupAddit()
frmSetup.Show
End Sub
Sub AutoExec()
On Error GoTo 1
Application.Caption = GetSetting("Disser", "Ïàðàìåòðû", "Çàãîëîâîê", "")
WordBasic.DisableAutoMacros GetSetting("Disser", "Ïàðàìåòðû", "DisableAutoMacros", "Íåò") <> "Íåò"
If GetSetting("Disser", "Ïàðàìåòðû", "SaveDeskTop", "Íåò") <> "Íåò" Then
MySettings = GetAllSettings("Disser", "SaveDeskTop")
For intSettings = LBound(MySettings) To UBound(MySettings)
Documents.Open MySettings(intSettings, 0), Revert:=False
Application.GoBack
Next intSettings
End If
1
End Sub
Sub AutoNew()
On Error Resume Next
If GetSetting("Disser", "Ïàðàìåòðû", "InformBlocks", "Íåò") <> "Íåò" Then
ActiveDocument.Variables.Add "AdditOptions", Chr(32 Or IIf(GetSetting("Disser", "Ïàðàìåòðû", "InformBlocks", "Íåò") <> "Íåò", 1, 0) Or IIf(GetSetting("Disser", "Ïàðàìåòðû", "ExcludeDouble", "Íåò") <> "Íåò", 2, 0))
End If
End Sub
Sub AutoExit()
On Error Resume Next
If GetSetting("Disser", "Ïàðàìåòðû", "SaveDeskTop", "Íåò") <> "Íåò" Then
DeleteSetting "Disser", "SaveDeskTop"
For Each Doc In Application.Documents
Doc.Activate
SaveSetting "Disser", "SaveDeskTop", Doc.FullName, ""
Next Doc
End If
End Sub
Sub HelpAddit()
On Error Resume Next
WinHelpA 0, "Disser.hlp", 1, 1
End Sub
Sub TipsAndTricks()
On Error Resume Next
WinHelpA 0, "Disser.hlp", 1, 15
End Sub
Sub ShowMetodic()
On Error Resume Next
Documents.Open GetSetting("Disser", "Ïàðàìåòðû", "Ðàñïîëîæåíèå", "c:\program files\ÏÊ") & "\ìåòîäè÷êà.doc"
End Sub
Sub ShiftSave()
On Error Resume Next
If GetAsyncKeyState(&H10) Then Documents.Save Else ActiveDocument.Save
End Sub
Sub RoundBrackets()
On Error Resume Next
Selection.TypeText "()"
Selection.MoveLeft
End Sub
Sub FrenchQuatationMarks()
On Error Resume Next
If GetKeyboardLayout(0) <> EN Then
Selection.TypeText "«»": Selection.MoveLeft
Else
Selection.TypeText "@"
End If
End Sub
Sub GermQuatationMarks()
On Error Resume Next
Selection.TypeText "„“"
Selection.MoveLeft
End Sub
Sub Brackets()
On Error Resume Next
If GetKeyboardLayout(0) <> EN Then
If Application.CapsLock Then Selection.TypeText "Õ" Else Selection.TypeText "õ"
Else
Selection.TypeText "[]": Selection.MoveLeft
End If
End Sub
Sub CurveBrackets()
On Error Resume Next
If GetKeyboardLayout(0) <> EN Then
If Application.CapsLock Then Selection.TypeText "õ" Else Selection.TypeText "Õ"
Else
Selection.TypeText "{}": Selection.MoveLeft
End If
End Sub
Sub InsertCaption()
On Error Resume Next
ExecDialog wdDialogInsertCaption
End Sub
Sub ToolsEnvelopesAndLabels()
On Error Resume Next
ExecDialog wdDialogToolsEnvelopesAndLabels
End Sub
Sub ExecDialog(D As Long)
Dim Brackets As Boolean, AutoMark As Boolean
On Error GoTo 1
A$ = KeyBindings.Key(313).Command
Brackets = True
KeyBindings.Key(306).Clear: KeyBindings.Key(313).Clear
KeyBindings.Key(562).Clear: KeyBindings.Key(219).Clear
KeyBindings.Key(475).Clear
1
On Error GoTo 2
A$ = KeyBindings.Key(wdKeyReturn).Command
AutoMark = True
KeyBindings.Key(wdKeyReturn).Clear
2
On Error Resume Next
Dialogs(D).Show
If Brackets Then
KeyBindings.Add wdKeyCategoryMacro, "MainM.FrenchQuatationMarks", 306
KeyBindings.Add wdKeyCategoryMacro, "MainM.GermQuatationMarks", 562
KeyBindings.Add wdKeyCategoryMacro, "MainM.RoundBrackets", 313
KeyBindings.Add wdKeyCategoryMacro, "MainM.Brackets", 219
KeyBindings.Add wdKeyCategoryMacro, "MainM.CurveBrackets", 475
End If
If AutoMark Then KeyBindings.Add wdKeyCategoryMacro, "Refer.VVV", wdKeyReturn
End Sub

Похоже, этот код отвечает за замену:

Sub RoundBrackets()
On Error Resume Next
Selection.TypeText "()"
Selection.MoveLeft
End Sub

Это она и есть, автоматическая замена?

9

Re: Обрамление выделенного фрагмента скобками

Хотелось бы объеденить функцию из Disser. При нажатии Shift+9 вставка двойных скобок с переходом между ними при отсутствии выделения или обрамление скобками в случае выделения, причем, с учетом возможного пробела  в конце выделения (а Word при выделении захватывает и пробел, будь то слово или выделенные подряд несколько слов). На этот случай макрос есть:

Sub InsRoundBrackets()
 
If Right(Selection.Text, 1) = Chr(32) Or _
   Right(Selection.Text, 1) = Chr(13) Then
   Selection.MoveLeft wdCharacter, 1, wdExtend
End If
With Selection
   .InsertBefore "("
   .InsertAfter ")"
End With
End Sub

10

Re: Обрамление выделенного фрагмента скобками

Разобрался;)

В макросе Disser вместо блока

Sub RoundBrackets()
On Error Resume Next
Selection.TypeText "()"
Selection.MoveLeft
End Sub

нужно вставить этот

Sub RoundBrackets()
On Error Resume Next
    Dim intStart As Integer
    Dim intEnd As Integer
    intStart = Selection.Start
    intEnd = Selection.End
    If Selection.End - Selection.Start <> 0 Then
    If Right(Selection.Text, 1) = Chr(32) Or _
    Right(Selection.Text, 1) = Chr(13) Then
    Selection.MoveLeft wdCharacter, 1, wdExtend
End If
With Selection
   .InsertBefore "("
   .InsertAfter ")"
End With
    Else
    Selection.TypeText Text:="()"
    Selection.MoveLeft
    End If
End Sub

То же самое делается в блоках для скобок типа {} [] и кавычек