Я пытаюсь раскрасить ячейки кода, чтобы дать пользователю предупреждение о том, какие данные ячейки неверны, прежде чем запускать расчет. В настоящее время бросает:
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.
извините, я австралиец... это привычка
Я пропустил, что вы тоже используете неправильное свойство.
LOL, я вижу, ты сделал то же самое... почему язык не может быть универсальным!?
Да... Меня тоже это зацепило. Знал, что это будет что-то простое.
.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
.Color отлично работает с полным RGB. ColorIndex с правильными номерами тоже работает. Очень признателен. Знал, что это будет что-то простое. Также помогает, когда вы используете американское написание цвета (сила привычки)
Свойство .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)
В качестве альтернативы, без использования ColorIndex
Range().Font.Color
поддерживает полные значения RGB:
Range("A1").Font.Color = RGB(100, 20, 255)
На самом деле это американское написание цвета.