Макрос создает отрицательные значения font.colorindex - PullRequest
0 голосов
/ 30 мая 2020

Подсказки к возможной причине в конце этого начального обсуждения .....

Простая строка кода макроса VBA, например:

FontCol = Cells(K, AmntCol).Font.ColorIndex

сообщает, с курсором, наведенным на " FontCol », значение« 1 », которое является значением индекса для черного.

пока это значение« опубликовано »в соответствующей (активной) электронной таблице Excel с помощью:

Cells(RowRef, ColRef) = FontCol

ячейка , адресованная, как указано выше, показывает -5 вместо 1 (как один из примеров проблемы)

«1» - это то, что вы ожидаете увидеть для черного, и я даже не могу понять, что «-5» не говоря уже о том, почему это также не то, что, по-видимому, используется в коде VBA. - и если я напишу "-5" в некоторый код logi c, из него не будет никакого полезного результата, что подтверждает, что реальное базовое значение равно 1, а не -5.

Кажется, что никакая сумма форматирования (посадочной) ячейки или изменение «Dimension as statement» для FontCol на «integer», «string» или «option» изменяет то, что публикуется в ячейке.

Мне не удалось найти какую-либо информацию по этой проблеме. Самым близким было что-то о длинных числах, обертывающих более короткие числа в индексном пространстве, и остаточные движущие силы ... что бы это ни значило.

Я действительно хотел бы решить эту проблему, поскольку я намеревался использовать значения ColorIndex как способ безопасного редактирования значений ячеек.

Любая мудрость будет принята с благодарностью.

Дополнение к выше - в ответ.

Изменение Dim переменной / s с "integer" на "long" не имеет значения.

При подготовке к предоставлению примера кода, как показано ниже, я определил часть проблемы - похоже, это связано со скоростью. Но сначала код.

'' '' Sub FontMacroIssue ()

Dim I As Long
Dim FontCol As Long

For I = 36 To 51
    FontCol = Cells(I, 10).Font.ColorIndex
    If FontCol = 3 Then
        Cells(I, 18) = "Red"
        Cells(I, 19) = FontCol
    Else
        Cells(I, 18) = "Not Red"
        Cells(I, 19) = FontCol
    End If
Next I

End Sub
''''

Вышеупомянутое выполняется на Windows 10 64-битной машине (эта двойная загрузка в Linux ) ... это не должно иметь значения.

Если вышеуказанное выполняется как есть, то вывод в основном / полностью «не красный», а строка значений FontCol распечатывается как,

1-5-5-5-5-7-7-7-7-7-7-7-7-7-7-5-7 - и если он замедлен, как 1 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1

Под замедлением я подразумеваю запуск макроса в режиме отладки с точкой останова на «Next I» или в подобном месте, а затем нажатие кнопки F5 (скажем) два раза в секунду. Результат для случая полной скорости - в основном / все «не красный», но это правильный отчет о «красном» и «не красном» при замедлении для оцениваемого шрифта.

Итак, мой вопрос / вопросы подробнее, «это нормально», «как мне лучше всего замедлить работу, чтобы получить правильный результат» ИЛИ «какой код более эффективен»? edit ...

Я склонен согласиться с Fun Thomas, поскольку даже 2 цикла / se c поднимают проблему. У меня нет ответа, но есть несколько комментариев, которые могут помочь. 1. Мой жесткий диск - твердотельный накопитель емкостью 2 ТБ. 2. В рассматриваемой электронной таблице более 46000 строк. 3. Несомненно, это более чем совпадение, что: 8-7 = 1, причем для черного шрифта указываются как 1, так и -7, а для красного шрифта - как 3, так и -5. Спасибо

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Font.ColorIndex возвращает:

Цвет указывается как значение индекса в текущей цветовой палитре или как одна из следующих констант XlColorIndex : xlColorIndexAutomati c или xlColorIndexNone.

Константы будут отображаться как целые значения -4105 и -4142 соответственно.

0 голосов
/ 31 мая 2020

Возможная проблема с процедурой события

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

Загрузка книги (Google Диск)

enter image description here

  • Следующая процедура события воспроизводит вашу проблему. Первый код входит в стандартный модуль (Module1), а второй - в модуль листа (например, Sheet1).

  • Вы запускаете только первый код, и он вернет правильные значения в диапазонах R36:R51 и T36:T51, и он «случайным образом» вернет правильные или неправильные значения в диапазоне S36:S51.

  • Кроме того, когда вы вводите значения вручную в диапазон S36:S51, и если это числа, после подтверждения, например, нажатием ENTER , введенные значения будут «случайным образом» либо уменьшены на 8, либо нет.

Модуль1

Option Explicit

Sub FontMacroIssue()

    Dim i As Long
    Dim FontCol As Long

    For i = 36 To 51
        FontCol = Cells(i, 10).Font.ColorIndex
        If FontCol = 3 Then
            Cells(i, 18).Value = "Red"
        Else
            Cells(i, 18).Value = "Not Red"
        End If
        Cells(i, 19).Value = FontCol
        Cells(i, 20).Value = FontCol
    Next i

End Sub

Лист1

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Const TargetCol As Long = 19
    Const TargetRows As String = "36:51"
    Const Offset As Long = 8

    Dim rng As Range
    Set rng = Intersect(Target, Columns(TargetCol))
    If rng Is Nothing Then Exit Sub
    Set rng = Intersect(rng, Rows(TargetRows))
    If rng Is Nothing Then Exit Sub

    On Error GoTo CleanExit

    Dim cel As Range
    For Each cel In rng
        If Round(Rnd()) = 0 Then
            Application.EnableEvents = False
            cel.Value = cel.Value - Offset
            Application.EnableEvents = True
        End If
    Next cel

    Exit Sub

CleanExit:
    Application.EnableEvents = True

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