Получение ошибки времени выполнения «13»: несоответствие типов при запуске следующего макроса - PullRequest
1 голос
/ 25 июня 2019

Я новичок в VBA и не совсем знаком с синтаксисом.Я создал макрос Excel, который будет идентифицировать фон текущей ячейки и добавлять текущее значение к имени цвета фона.Поэтому, если ячейка имеет синий фон и значение 1000, макрос должен заменить значение в ячейке как «1000 синих».Ниже приведен код, который я написал.

Sub coloridentifier()
Dim Myrange As Range
Dim Mycell As Range
Dim Myvalue As String
Set Myrange = Selection
For Each Mycell In Myrange.Rows
    Myvalue = Mycell.Value
    If Mycell.Interior.Color = RGB(0, 176, 80) Then
        Mycell.Value = Myvalue & " Green"
    ElseIf Mycell.Interior.Color = RGB(184, 204, 228) Then
        Mycell.Value = Myvalue & " Blue"
    ElseIf Mycell.Interior.Color = RGB(192, 0, 0) Then
        Mycell.Value = Myvalue & " Red"
    End If
Next Mycell
End Sub

Отладчик указывает на следующую строку:

Myvalue = Mycell.Value

Что я здесь не так делаю?

Ответы [ 3 ]

1 голос
/ 25 июня 2019

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

Option Explicit
Sub coloridentifier()

    Dim Myrange As Range
    Dim Mycell As Range

    Set Myrange = Selection
    For Each Mycell In Myrange
        If Mycell.Interior.Color = RGB(0, 176, 80) Then
            Mycell = Mycell & " Green"
        ElseIf Mycell.Interior.Color = RGB(184, 204, 228) Then
            Mycell = Mycell & " Blue"
        ElseIf Mycell.Interior.Color = RGB(192, 0, 0) Then
            Mycell = Mycell & " Red"
        End If
    Next Mycell

End Sub

Хотя я бы не стал использовать Set Myrange = Selection и объявил бы ваш диапазон, давэто адреса.

1 голос
/ 25 июня 2019

Измените For Each Mycell In Myrange.Rows эту строку на

For Each Mycell In Myrange

Когда вы используете Myrange.Rows, тогда саб будет зацикливаться на строке вашего установленного диапазона. Когда вы будете использовать только Myrange, он будет зацикливаться на ячейках заданного диапазона. Также удалите .value из Mycell.Value, потому что, когда вы будете использовать .value, он будет принимать только значения (числовые значения) из ячейки. Если вы хотите сохранить .value, измените тип переменной Integer или Long на String, например Dim Myvalue As Integer.

Итак, полный саб будет

Sub coloridentifier()
Dim Myrange As Range
Dim Mycell As Range
Dim Myvalue As Variant
Set Myrange = Selection
For Each Mycell In Myrange
    Myvalue = Mycell
    If Mycell.Interior.Color = RGB(0, 176, 80) Then
        Mycell.Value = Myvalue & " Green"
    ElseIf Mycell.Interior.Color = RGB(0, 0, 255) Then
        Mycell.Value = Myvalue & " Blue"
    ElseIf Mycell.Interior.Color = RGB(192, 0, 0) Then
        Mycell.Value = Myvalue & " Red"
    End If
Next Mycell
End Sub
0 голосов
/ 25 июня 2019

Вы пытаетесь присвоить массив строковой переменной

Cells - это коллекция Range объектов, так же как и Rows и Columns.Всякий раз, когда вы просматриваете Range.Rows и у вас есть более 1 столбца в строке, свойство .Value будет массивом, и вы не можете присвоить его строковой переменной.

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