Обратите внимание, что [1, "One"]
уже вызывает ошибку.
Давайте проанализируем его ошибку: ключевая точка
Could not deduce (Num [Char]) arising from the literal ‘1’
Это на самом деле означает «Мне нужно использовать 1 :: [Char]
, так как это единственный способ, которым список может ввести проверку. Однако я не знаю, как интерпретировать литерал 1 как [Char]
». (Напомним, что [Char]
и String
являются точно такими же типами, и оба являются типом строковых литералов, таких как "One"
.)
Haskell немного отличается своей обработкой числовых литералы вроде 1
. Примерно обрабатывается так, как если бы Integer
s, тип целочисленной произвольной точности, а затем сразу же преобразовывался в желаемый тип, используя метод fromInteger
typeclass Num
.
class Num a where
fromInteger :: Integer -> a
...
В стандартных библиотеках этот класс имеет экземпляры для всех числовых типов. Пользователь может добавлять другие, например. для своих пользовательских числовых типов.
Глупый программист мог даже добавить экземпляр для строк!
instance Num [Char] where
fromInteger n = "urk!" ++ show n
Этот экземпляр фиктивный, поскольку он не может разумно определить другие методы , но в принципе это можно было бы использовать. С этим экземпляром в области, тип исходного кода проверяет! Мы можем проверить его в GHCi:
> [(1,2),("One",2)]
[("urk!1",2),("One",2)]
Обратите внимание, как Haskell преобразовал литерал, как мы сказали ему.
A последнее предупреждение: даже не думайте добавлять такие экземпляр для серьезной программы :) Класс Num
должен использоваться только для числовых типов, а строки не являются числовыми.
Проблема в том, что когда вы определяете свой адрес, переменная «Address» получает строку адреса, например «B2». Вам необходимо создать объект диапазона из этой адресной строки, как показано в коде ниже. Для цвета Font я получаю .Font.Color, работающий так:
Option Explicit
Sub test()
Dim addr As Variant
Dim TestBool As Boolean
addr = Cells(2, 2).Address
Debug.Print addr
TestBool = True
If TestBool = True Then
Range(addr).Interior.Color = RGB(0, 255, 0) And Range(addr).Font.Color = RGB(0, 255, 0)
End If
End Sub
Основная проблема: Вам необходимо изменить Interior.Color
и .Font.Color
объекта Range
, а не адрес String
. Также, как отмечено в комментариях, удалите And
и поместите эти два пункта в отдельные строки.
Если бы вы сохранили первоначальный подход, это могло бы выглядеть так:
Dim rng as Range
...
Set rng = Cells(PlantRow, DateColumn)
...
rng.Interior.Color = RGB(0, 255, 0)
rng.Font.Color = RGB(0, 225, 0)
Другие проблемы :
PlantRow = Sheets("Expedite").Range("A3:A5").Find...
, и [ 118] предположим, что PlantName
и DateEntered
действительно найдены, и выдаст ошибку, если они не найдены . Worksheet
- при условии, что это Sheets("Expedite")
, что Cells
включены. В противном случае есть неявная ссылка на ActiveSheet
. С этими изменениями ваш код может выглядеть следующим образом:
Dim PlantName As String
Dim DateEntered As String
PlantName = Me.ComboBox1.Value
DateEntered = Me.TextBox5.Value
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Expedite")
Dim plantRng As Range, dateRng As Range
Set plantRng = ws.Range("A3:A5").Find(PlantName)
Set dateRng = ws.Range("B2:BB2").Find(DateEntered)
If Not plantRng Is Nothing Then
If Not dateRng Is Nothing Then
Dim rng As Range
Set rng = ws.Cells(plantRng.Row, dateRng.Column)
Else
MsgBox "Not found - try again!"
Exit Sub
End If
End If
If Me.Expedite_yes.Value = True Then
rng.Interior.Color = RGB(0, 255, 0)
rng.Font.Color = RGB(0, 225, 0)
ElseIf Me.Expedite_yes.Value = False Then
rng.Interior.Color = RGB(255, 0, 0)
rng.Font.Color = RGB(255, 0, 0)
End If