Ячейка/диапазон объекта не поддерживает свойство .Font в VBA

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

run time error 438 object doesn't support property

при попытке просмотреть все данные.

По сути, создание рабочего листа, позволяющего пользователю вводить некоторые данные в состав, а затем, основываясь на некоторых внутренних данных/ограничениях, выдавать ответ о том, что они могут/не могут делать. У меня уже есть уровень проверки ошибок в исходном коде, когда пользователь вводит данные (в основном, чтобы попытаться побудить их убедиться, что данные, которые они вводят, действительны, прежде чем они попытаются запустить расчет), и это отлично работает с использованием подпрограмма Worksheet_Change, которая может перебирать все ячейки по одной (в пределах целевого диапазона), не беспокойтесь.

Если я попытаюсь воспроизвести это (используя именованный диапазон вместо целевых ячеек из функции изменения), он, похоже, сделает одну из двух вещей: он попытается отправить диапазон ячеек, а не отдельные ячейки, и потерпит неудачу, когда он попытается сопоставлять данные из «ячеек», а не из одной ячейки, с которой она должна сопоставляться, ИЛИ она выдаст ошибку 438, когда попытается ее раскрасить.

Private Sub CommandButton1_Click()
    Dim ErrorWagonPack As Boolean, ErrorCellsNotEmpty As Boolean, WagonPack As Integer, cel As Range, Target As Range

    ErrorWagonPack = False
    ErrorCellsNotEmpty = False
    Set Target = Application.Range("ConsistInput")

    For Each cel In Target 'issue is here somewhere I think. It's related to how the cel is created and as such what properties it can have
        Application.EnableEvents = False
        WagonPack = 0
        If Len(cel.Value) > 0 Then
            WagonPack = Application.Index(Application.Range("WagonData"), Application.Match(cel.Value, Application.Range("WagonData").Columns(1), 0), 4)
            If cel.Offset(0, 1).Value Mod WagonPack > 0 Then
                ErrorWagonPack = True
                cel.Font.ColourIndex = RGB(156, 0, 6) '438 error here
                cel.Interior.ColourIndex = RGB(255, 199, 206) '438 error here too
            End If
        End If
    Next cel

If ErrorWagonPack = True Or ErrorCellsNotEmpty = True Then
    Exit Sub
End If

'calculate stuff
Application.EnableEvents = True
End Sub

В идеале я хотел бы добраться до точки, где я запускаю код, окрашиваю ячейки, вызывающие проблемы/неверные данные, а затем, если не выбрасываются какие-либо переменные ошибки, запускаю расчет, но ошибка 438 кажется камнем преткновения. Я почти готов поспорить, что это что-то простое, что мне просто не хватает, но я не могу понять. Вероятно, не помогает, я все еще довольно зеленый с VBA.

На самом деле это американское написание цвета.

SJR 29.05.2019 00:29

извините, я австралиец... это привычка

alowflyingpig 29.05.2019 00:31

Я пропустил, что вы тоже используете неправильное свойство.

SJR 29.05.2019 00:39

LOL, я вижу, ты сделал то же самое... почему язык не может быть универсальным!?

alowflyingpig 29.05.2019 00:41

Да... Меня тоже это зацепило. Знал, что это будет что-то простое.

Tyler P 29.05.2019 04:27
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
5
162
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

.ColorIndex неверно. Используйте .Color

Private Sub CommandButton1_Click()
    Dim ErrorWagonPack As Boolean, ErrorCellsNotEmpty As Boolean, WagonPack As Integer, cel As Range, Target As Range

    ErrorWagonPack = False
    ErrorCellsNotEmpty = False
    Set Target = Application.Range("ConsistInput")

    For Each cel In Target 'issue is here somewhere I think. It's related to how the cel is created and as such what properties it can have
        Application.EnableEvents = False
        WagonPack = 0
        If Len(cel.Value) > 0 Then
            WagonPack = Application.Index(Application.Range("WagonData"), Application.Match(cel.Value, Application.Range("WagonData").Columns(1), 0), 4)
            If cel.Offset(0, 1).Value Mod WagonPack > 0 Then
                ErrorWagonPack = True
                cel.Font.Color = RGB(156, 0, 6) '438 error here
                cel.Interior.Color = RGB(255, 199, 206) '438 error here too
            End If
        End If
    Next cel

If ErrorWagonPack = True Or ErrorCellsNotEmpty = True Then
    Exit Sub
End If

'calculate stuff
Application.EnableEvents = True
End Sub

Я должен добавить, что .ColorIndex — это значение между 1 и 56. Он представляет некоторые цвета, но не все (очевидно) docs.microsoft.com/en-us/office/vba/api/Excel.ColorIndex

alowflyingpig 29.05.2019 00:30

.Color отлично работает с полным RGB. ColorIndex с правильными номерами тоже работает. Очень признателен. Знал, что это будет что-то простое. Также помогает, когда вы используете американское написание цвета (сила привычки)

Tyler P 29.05.2019 04:28

Свойство .ColorIndex находится в диапазоне от 1 до 56:

Sub TestMe()

    Dim cel As Range
    Set cel = Worksheets(1).Range("A1")
    cel.Interior.ColorIndex = 1
    cel.Font.ColorIndex = 20

End Sub

2 значения RGB выходят далеко за рамки 56:

Sub TestMe()

    Debug.Print RGB(156, 0, 6)          '393372
    Debug.Print RGB(255, 199, 206)      '13551615

End Sub

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

cel.Font.ColorIndex = RGB(56, 0, 0)

а также

cel.Font.ColorIndex = RGB(1, 0, 0)

В качестве альтернативы, без использования ColorIndexRange().Font.Color поддерживает полные значения RGB:

Range("A1").Font.Color = RGB(100, 20, 255)

Другие вопросы по теме