2012-05-31 4 views
1

Я пытаюсь создать макрос, который создаст метку местоположения в месте и имя выбранного текста. Это то, что у меня есть, и говорит, что имя закладки плохо. В любом случае, чтобы установить имя закладки как переменную на основе выделенного текста?Создать закладку через выделенный текст?

Sub AddBookMark() 

Dim sText As String 
sText = Application.Selection.Text 
sText = Replace(sText, vbCrLf, "") 
sText = Replace(sText, Chr(10), " ") 
sText = Replace(sText, Chr(182), " ") 

With ActiveDocument.Bookmarks 
    .Add Range:=Selection.Range, Name:=sText 
    .DefaultSorting = wdSortByName 
    .ShowHidden = False 
End With 
End Sub 
+0

Похоже, что это работает, но если вы выберете текст, который имеет пустой пробел, он добавит этот символ □ к переменной, и, похоже, он не работает. , как я могу обрезать это? – MBlackburn

ответ

2

Попробуйте

Испытано его со строкой, как "@ # $ 1_qwerty @ # @! # _1234". CleanText функция изменит его «qwerty_1234»

Закладка Name примет a-z/A-Z как 1-го символа и a-z/A-Z/0-1/_, как и остальные.

Option Explicit 

Sub AddBookMark() 
    Dim sText As String 

    sText = CleanText(Application.Selection.Text) 

    If sText = "" Then 
     MsgBox "Invalid Name" 
     Exit Sub 
    End If 

    With ActiveDocument.Bookmarks 
     .Add Range:=Selection.Range, Name:=sText 
     .DefaultSorting = wdSortByName 
     .ShowHidden = False 
    End With 
End Sub 

Function CleanText(strInput As String) As String 
    Dim i As Long, strTemp As String 

    strInput = Trim(strInput) 

    Do Until (Asc(Left(strInput, 1)) > 65 And Asc(Left(strInput, 1)) < 90) Or _ 
    (Asc(Left(strInput, 1)) > 97 And Asc(Left(strInput, 1)) < 122) Or Len(strInput) = 0 
     Select Case Asc(Left(strInput, 1)) 
      Case 65 To 90, 97 To 122 
      Case Else: strInput = Mid(strInput, 2) 
     End Select 
    Loop 

    strTemp = Left(strInput, 1) 

    For i = 2 To Len(strInput) 
     Select Case Asc(Mid(strInput, i, 1)) 
      Case 65 To 90, 97 To 122, 95, 48 To 57 
       strTemp = strTemp & Mid(strInput, i, 1) 
     End Select 
    Next 
ExitF: 
    CleanText = strTemp 
End Function 
+0

Не работает. Он добавляет/преобразует знак абзаца ¶ в квадратный символ □ к переменной, и это то, что его останавливает. Я обновил свой код выше, где я попытался отключить метку абзаца и crlf, если они найдены в строке безрезультатно. – MBlackburn

+0

в любом случае, чтобы обрезать метки абзаца и любые CRLF или просто проверить, является ли последний символ буквой A/a-z/Z, а если нет, то обрезка -1? – MBlackburn

+0

Мы можем это сделать, но тогда нам придется подумать, что мы не делаем '-1', а' - Actual', а также удаляем ненужные символы из всей строки. Позвольте привести пример. –

Смежные вопросы