Изменить цвет текста ячейки: непоследовательное поведение макроса - PullRequest
0 голосов
/ 25 марта 2019

Я работаю над учебником, созданным с использованием Excel (давайте не будем обсуждать недостатки использования Excel для этого, я хорошо их знаю), и у меня есть список предложений с выделенным только одним словом - т.е. в другой цвет. По некоторым причинам некоторые из невыделенных слов оказались черными (# 000), а другие - темно-серыми (# 333). Чтобы это исправить, и поскольку у нас есть буквально более 1000 предложений, я попытался создать макрос. Некоторый поиск в Google привел меня к следующему коду:

Sub FixG2Colors()
'
'
   Dim xOut As String
   Dim xValue As String
   Dim i As Long
   Dim LastRow As Long

   LastRow = Cells(Rows.Count, "C").End(xlUp).Row

   Do Until ActiveCell.Row > LastRow

   xValue = ActiveCell.Text

   For i = 1 To Len(xValue)
       If (Not ActiveCell.Characters(i, 1).Font.Color = RGB(153, 102, 255)) Then
           ActiveCell.Characters(i, 1).Font.Color = vbBlack
       End If
   Next

   ActiveCell.Offset(4, 0).Select

   Loop

End Sub 

Итак, я прохожу каждый символ и сравниваю его цвет с цветом подсветки; если отличается, установите его на черный. Эти предложения находятся в каждой четвертой строке, поэтому я запускаю цикл от первой выбранной ячейки до конца листа.

Моя проблема в том, что у меня дикое непоследовательное поведение. Удаление цикла и запуск цикла работает правильно ... большую часть времени. В некоторых случаях содержимое ячейки эффективно модифицируется. Например:

Actually, I was hoping / you could help me / with this problem.

Выделено "На самом деле". Запуск макроса не только удаляет выделение (которое я дважды проверял и проверял трижды: это RGB (153, 102, 255)), но также меняет шрифт в, казалось бы, случайных частях предложения. Я открываю файл, запускаю макрос; закройте файл без сохранения и откройте его снова; запустите макрос в одном предложении, и шрифт изменится в разных разделах по сравнению с предыдущим

Кроме того, он правильно работает с другими предложениями.

Когда я пытаюсь запустить цикл, это занимает гораздо больше времени, чем нужно, Excel обычно дает сбой (даже если он успешно выполнен хотя бы один раз), результаты несовместимы даже для одной и той же ячейки при разных запусках…

Я попробовал это на macOS с последними версиями Excel и OS, на виртуальной машине Windows, на нескольких машинах с Windows ... единственное, что соответствует, - это насколько это противоречиво.

Так что мой вопрос двоякий: 1- Являются ли макросы / действительно ли VBA ненадежными / противоречивыми? 2- Есть ли лучший способ реализовать эту функцию?

1 Ответ

0 голосов
/ 25 марта 2019

За мои комментарии;Я хотел бы перейти к последней строке, этот код был протестирован на небольшом примере с несколькими цветными символами ... (на основе кода @ Gary'sStudent)

Sub fixFontColor()
    Dim r As Long, x As Integer, lRow As Long
    lRow = Cells(Rows.Count, "C").End(xlUp).Row

        For r = 1 To lRow 'Number of rows

            For x = 1 To Len(Cells(r, 3).Value) 'for each character in cell

                If Cells(r, 3).Characters(Start:=x, Length:=1).Font.Color <> RGB(153, 102, 255) Then
                    Cells(r, 3).Characters(Start:=x, Length:=1).Font.Color = RGB(0, 0, 0)
                End If

            Next x

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