Понимание оператора ИЛИ в чужом макросе, который применяет регистр заголовка к тексту - PullRequest
0 голосов
/ 03 марта 2020

У меня есть макрос из курса по Microsoft Word VBA, который применяет регистр заглавия к тексту (т. Е. С заглавной буквы каждое слово, кроме слов типа "the", "to" и т. Д. c.) Я пытаюсь понять, как преподаватель рассуждения, но он обычно не отвечает на вопросы из того, что я вижу на форумах.

Я воспроизвел его код ниже. По сути, он создает массив слов, которые не должны быть написаны заглавными буквами, сравнивает каждое слово в выделении с этим массивом, устанавливает для blnOmit значение «True» (т. Е. Пропускает первую букву слова из заглавных букв), если есть совпадение, затем вводит заглавные буквы. слово "If blnOmit = False или i = 1 или i = Selection.Words.Count " (5-я строка снизу).

Я не понимаю эту строку кода, то есть с большой буквы слово, если "i = Selection.Words.Count". Я думал, что это сделало бы последнее слово в выделении всегда заглавными, даже если оно не должно быть заглавным. Но когда я запустил этот макрос, он отлично работает, то есть последнее слово не пишется с большой буквы, если его не нужно писать с большой буквы. И когда я удалил «i = Selection.Words.Count», макрос не работал вообще - ничего не было написано с заглавной буквы.

Может кто-нибудь объяснить, почему мои догадки были неверны, пожалуйста? И как i = Selection.Words.Count работает в этом макросе? Спасибо!

Sub TitleCase()
Const strOMIT As String = "a, about, above, across, after," 'omitted rest of string for his privacy
Dim astrOmit() As String
Dim rngWord As Range
Dim i As Integer
Dim j As Integer
Dim blnOmit As Boolean

' Create array of words which should not be capitalized
astrOmit = Split(Expression:=strOMIT, Delimiter:=", ")

' Process each word in selection
For i = 1 To Selection.Words.Count
    Set rngWord = Selection.Words(i)
    blnOmit = False

    ' Compare word to each word in array
    For j = LBound(astrOmit) To UBound(astrOmit)
        If LCase(Trim(rngWord.Text)) = LCase(astrOmit(j)) Then
            blnOmit = True
        End If
    Next j

    ' Capitalize word if necessary
    If blnOmit = False Or i = 1 Or i = Selection.Words.Count Then
        rngWord.Case = wdTitleWord
    End If
Next i
End Sub

1 Ответ

0 голосов
/ 03 марта 2020

Отчасти это мнение (которое не рекомендуется на этом сайте), но ...

"оно работает отлично, то есть последнее слово не пишется с большой буквы, если его не следует писать с заглавной буквы"

Скажем, последнее слово, которое вы можете увидеть в «Выборе», это «примерно». Однако, скажем, следующая вещь после «о» - это конец абзаца, и ваш выбор включает весь абзац. Тогда последний элемент в Selection.Words будет фактически знаком абзаца. Таким образом, слово «about» не является последним словом и не будет написано заглавными буквами.

Что касается причины, по которой автор решил поставить условие «Или я = Selection.Words.Count», это чисто предположение, но, возможно, если вы пишем заглавную букву, которую вы, возможно, захотите

История о чем-то

, но

Ничего особенного не о чем кричать.

В идеальном мире, что бы на самом деле случается так, что тот, кто определит функцию, будет точно прописывать, что она должна делать (и, возможно, почему). Да, это правда, что из кода видно, что есть особый случай, и вы можете понять, что он на самом деле делает. Но это не говорит вам о том, что должен сделать. Поэтому любой, кто пытался протестировать эту подпрограмму, не мог знать, ведет ли она себя как следует.

"И когда я удалил" i = Selection.Words.Count ", макрос вообще не работал - ничего не было написано с заглавной буквы "

Когда я сделал это здесь (удалив также предыдущее" И "), это также не удалось, за исключением того, что я понял, что ничего не выбрано. Как только я выбрал что-то, код заработал, как и ожидалось. Возможно, у вас была похожая проблема?

Не похоже, что целью данного конкретного кода было обсуждение «стиля кодирования», но лично я предпочитаю заключить отдельные термины в условие, например,

If (blnOmit = False) Or (i = 1) Or (i = Selection.Words.Count) Then

Если вы все время работаете с VBA и знаете все правила объединения операторов, правила приоритета и т. д. c., вам это может не понадобиться, но это полезно для всех кто должен погрузиться и поддержать код. Предположим, например, что кто-то случайно удалил немного больше, чем часть "Or I = Selection.Words.Count" ", и строка завершилась как

If blnOmit = False Or i Then

Интересно, сколько VBA-кодеров были бы уверены, что они поняли что это на самом деле означает без поиска правил. Это не синтаксическая ошибка!

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