Есть ли подстановочный знак MS Word для частоты?

Я учусь использовать подстановочные знаки и коды Microsoft Word, чтобы помочь мне в моей должности медицинского редактора. Большая часть моей работы заключается в отправке рукописей в медицинские журналы для рецензирования, и каждый журнал предъявляет очень специфические требования.

Большинство журналов, в которые мы отправляем рукописи, требуют, чтобы медицинские термины/фразы сокращались только в том случае, если они используются три или более раз. Например, термин «Общая выживаемость» может быть сокращен до ОС, если этот термин упоминается в тексте не менее трех раз. Если в тексте «Общая выживаемость» упоминается только один или два раза, предпочтительно, чтобы этот термин оставался расширенным и не сокращался до ОС.

Мы использовали систему PerfectIt от Intelligent Editing. Этот виджет Word сканирует аббревиатуры, которые используются только один раз, и помечает их для нашего обзора, но не подбирает, если аббревиатура используется только дважды в выделенном тексте. Мы надеемся найти какое-то решение (я думал, что это будет своего рода поиск по шаблону или макрос), которое сможет определить, используется ли аббревиатура только один или два раза.

Я видел этот аналогичный пост в stackoverflow, но, похоже, это связано с кодом. Мне нужно, чтобы это было на компьютере компании, к которому у меня нет административного доступа, и, кроме того, я ничего не знаю о коде. Я ценю любую помощь, руководство или направления для дальнейших исследований!

Благодарю вас!

Редактировать: я мог бы использовать поиск по подстановочным знакам, чтобы выделить все две заглавные буквы с помощью ‹[A-Z]{2,}>, а затем отформатировать их как выделенные, если это поможет с какими-либо макросами.


person D. Drucker    schedule 06.03.2019    source источник


Ответы (2)


Для любой данной аббревиатуры вы можете использовать макрос, например:

Sub Demo()
Application.ScreenUpdating = False
Dim i As Long
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = InputBox("What is the Text to Find")
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchCase = True
    .MatchWholeWord = True
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    .Execute
  End With
  Do While .Find.Found
    i = i + 1
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
Application.ScreenUpdating = True
MsgBox i & " instances found."
End Sub

Инструкции по установке и использованию макросов для ПК см. по адресу: http://www.gmayor.com/installing_macro.htm< /а>

Инструкции по установке и использованию макросов Mac см. по адресу: https://wordmvp.com/Mac/InstallMacro.html< /а>

person macropod    schedule 06.03.2019
comment
Если вы можете использовать макросы, вы можете следовать подходу, аналогичному описанному выше, но использовать библиотеку регулярных выражений VBScript для поиска. Сценарий VB Regexp относительно прост в использовании, и одно из его преимуществ заключается в том, что он может возвращать количество совпадений для шаблона поиска. Содержат ли ваши статьи также глоссарий сокращений или они определяются в тексте при первом появлении, например. Общая выживаемость (ОС). - person freeflow; 07.03.2019
comment
Regex вряд ли сделает в этой ситуации что-то, что Word не может сделать с подстановочными знаками, плюс vbscript сам по себе будет намного медленнее, чем макрос в Word, просто из-за накладных расходов на автоматизацию. - person macropod; 07.03.2019
comment
Чаще всего они определяются при первом появлении, но время от времени нам требуется предоставить список сокращений. Я обязательно изучу этот макрос - самая большая проблема, которую я вижу, заключается в том, что мы часто не знаем всех сокращений, которые будут в документе, поэтому будет сложно искать их по одному (вот что кажется необходимым с этим макросом, пожалуйста, поправьте меня, если я ошибаюсь). Большое спасибо за ваше время и помощь! - person D. Drucker; 07.03.2019

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

Всемирная паутина (WWW)

Естественно, учитывая диапазон используемых акронимов, это не является надежным, и, если совпадение не найдено, предыдущее предложение (в терминах VBA) фиксируется, чтобы пользователь мог редактировать вывод. Затем в конце документа создается таблица, в которой затем выполняется поиск всех ссылок на аббревиатуру (кроме определения), а также количество и номера страниц, добавленные в таблицу.

Обратите внимание, что макрос не сообщит вам, сколько раз слово «Всемирная паутина» появляется в документе. В конце концов, учитывая ваши критерии, невозможно знать, какие термины должны были быть сокращены до аббревиатуры, но не были сокращены.

Sub AcronymLister()
Application.ScreenUpdating = False
Dim StrTmp As String, StrAcronyms As String, i As Long, j As Long, k As Long, Rng As Range, Tbl As Table
StrAcronyms = "Acronym" & vbTab & "Term" & vbTab & "Page" & vbTab & "Cross-Reference Count" & vbTab & "Cross-Reference Pages" & vbCr
With ActiveDocument
  With .Range
    With .Find
      .ClearFormatting
      .Replacement.ClearFormatting
      .MatchWildcards = True
      .Wrap = wdFindStop
      .Text = "\([A-Z0-9]{2,}\)"
      .Replacement.Text = ""
      .Execute
    End With
    Do While .Find.Found = True
      StrTmp = Replace(Replace(.Text, "(", ""), ")", "")
      If (InStr(1, StrAcronyms, .Text, vbBinaryCompare) = 0) And (Not IsNumeric(StrTmp)) Then
        If .Words.First.Previous.Previous.Words(1).Characters.First = Right(StrTmp, 1) Then
          For i = Len(StrTmp) To 1 Step -1
            .MoveStartUntil Mid(StrTmp, i, 1), wdBackward
            .Start = .Start - 1
            If InStr(.Text, vbCr) > 0 Then
              .MoveStartUntil vbCr, wdForward
              .Start = .Start + 1
            End If
            If .Sentences.Count > 1 Then .Start = .Sentences.Last.Start
            If .Characters.Last.Information(wdWithInTable) = False Then
              If .Characters.First.Information(wdWithInTable) = True Then
                .Start = .Cells(.Cells.Count).Range.End + 1
              End If
            ElseIf .Cells.Count > 1 Then
              .Start = .Cells(.Cells.Count).Range.Start
            End If
          Next
        End If
        StrTmp = Replace(Replace(Replace(.Text, " (", "("), "(", "|"), ")", "")
        StrAcronyms = StrAcronyms & Split(StrTmp, "|")(1) & vbTab & Split(StrTmp, "|")(0) & vbTab & .Information(wdActiveEndAdjustedPageNumber) & vbTab & vbTab & vbCr
      End If
      .Collapse wdCollapseEnd
      .Find.Execute
    Loop
    StrAcronyms = Replace(Replace(Replace(StrAcronyms, " (", "("), "(", vbTab), ")", "")
    Set Rng = .Characters.Last
    With Rng
      If .Characters.First.Previous <> vbCr Then .InsertAfter vbCr
      .InsertAfter Chr(12)
      .Collapse wdCollapseEnd
      .Style = "Normal"
      .Text = StrAcronyms
      Set Tbl = .ConvertToTable(Separator:=vbTab, NumRows:=.Paragraphs.Count, NumColumns:=5)
      With Tbl
        .Columns.AutoFit
        .Rows(1).HeadingFormat = True
        .Rows(1).Range.Style = "Strong"
        .Rows.Alignment = wdAlignRowCenter
      End With
      .Collapse wdCollapseStart
    End With
  End With
  Rng.Start = ActiveDocument.Range.Start
  For i = 2 To Tbl.Rows.Count
    StrTmp = "": j = 0: k = 0
    With .Range
      With .Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Format = False
        .Forward = True
        .Text = "[!\(]" & Split(Tbl.Cell(i, 1).Range.Text, vbCr)(0) & "[!\)]"
        .MatchWildcards = True 
        .Execute
      End With
      Do While .Find.Found
        If Not .InRange(Rng) Then Exit Do
        j = j + 1
        If k <> .Duplicate.Information(wdActiveEndAdjustedPageNumber) Then
          k = .Duplicate.Information(wdActiveEndAdjustedPageNumber)
          StrTmp = StrTmp & k & " "
        End If
        .Collapse wdCollapseEnd
        .Find.Execute
      Loop
    End With
    Tbl.Cell(i, 4).Range.Text = j
    StrTmp = Replace(Trim(StrTmp), " ", ",")
    If StrTmp <> "" Then
      'Add the current record to the output list (StrOut)
      StrTmp = Replace(Replace(ParseNumSeq(StrTmp, "&"), ",", ", "), "  ", " ")
    End If
    Tbl.Cell(i, 5).Range.Text = StrTmp
  Next
End With
Set Rng = Nothing: Set Tbl = Nothing
Application.ScreenUpdating = True
End Sub

Function ParseNumSeq(StrNums As String, Optional StrEnd As String)
'This function converts multiple sequences of 3 or more consecutive numbers in a
' list to a string consisting of the first & last numbers separated by a hyphen.
' The separator for the last sequence can be set via the StrEnd variable.
Dim ArrTmp(), i As Long, j As Long, k As Long
ReDim ArrTmp(UBound(Split(StrNums, ",")))
For i = 0 To UBound(Split(StrNums, ","))
  ArrTmp(i) = Split(StrNums, ",")(i)
Next
For i = 0 To UBound(ArrTmp) - 1
  If IsNumeric(ArrTmp(i)) Then
    k = 2
    For j = i + 2 To UBound(ArrTmp)
      If CInt(ArrTmp(i) + k) <> CInt(ArrTmp(j)) Then Exit For
      ArrTmp(j - 1) = ""
      k = k + 1
    Next
    i = j - 2
  End If
Next
StrNums = Join(ArrTmp, ",")
StrNums = Replace(Replace(Replace(StrNums, ",,", " "), ", ", " "), " ,", " ")
While InStr(StrNums, "  ")
  StrNums = Replace(StrNums, "  ", " ")
Wend
StrNums = Replace(Replace(StrNums, " ", "-"), ",", ", ")
If StrEnd <> "" Then
  i = InStrRev(StrNums, ",")
  If i > 0 Then
    StrNums = Left(StrNums, i - 1) & Replace(StrNums, ",", " " & Trim(StrEnd), i)
  End If
End If
ParseNumSeq = StrNums
End Function
person macropod    schedule 08.03.2019
comment
Большое спасибо, что нашли время, чтобы создать еще один макрос! Он работает отлично — единственное изменение, которое нам пришлось внести, заключалось в том, что он вставляет таблицу сразу после последней найденной аббревиатуры, поэтому мы добавляем термин Macro Table (MT) в конец рукописи, чтобы он вставлялся после этого. Ваша помощь очень ценится, спасибо!! - person D. Drucker; 08.03.2019