Как раскрасить ячейку, которая помечена как вариант в кодировании VBA

Обратите внимание, что [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 должен использоваться только для числовых типов, а строки не являются числовыми.

1
задан Scott Craner 18 January 2019 в 18:50
поделиться

2 ответа

Проблема в том, что когда вы определяете свой адрес, переменная «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
0
ответ дан cekar 18 January 2019 в 18:50
поделиться

Основная проблема: Вам необходимо изменить 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)

Другие проблемы :

  1. И PlantRow = Sheets("Expedite").Range("A3:A5").Find..., и [ 118] предположим, что PlantName и DateEntered действительно найдены, и выдаст ошибку, если они не найдены .
  2. Вы должны определить, какой 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
0
ответ дан BigBen 18 January 2019 в 18:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: