Несоответствие типа ошибки времени выполнения VBA

Я получаю следующее сообщение от компилятора

"Ошибка выполнения "13": несоответствие типов"

и он выделяет следующую строку:

If Cells(k, j + 1) = "T1" ... 

Я не понимаю, почему я получаю эту ошибку. Ячейки, через которые он проходит, имеют текстовый формат. Может кто-нибудь объяснить, как исправить этот код? Обратите внимание, что это только часть программы.

Sub TestSub2()

Dim i As Integer, j As Integer, k As Integer, k2 As Integer


'i ->tier table row counter
'j ->column counter
'k ->"Reading Date" and "PM Executed?" table row counter

'---TIER 1 TABLE---
k = 102
k2 = 84


For i = 21 To 35

    k = k + 1
    k2 = k2 + 1

    For j = 26 To 148
        If Cells(k, j + 1) = "T1" Or "T1, T2" Or "T2, T1" Or "T1, T3" Or "T3, T1" Or "T1, T2, T3" Or "T1, T3, T2" Or "T2, T1, T3" Or "T2, T3, T1" Or "T3, T1, T2" Or "T3, T2, T1" Then
    'then
        Cells(i, 8) = Cells(i, j) And Cells(i, 9) = Cells(k2, j + 1)
    End If

    Next j

Next i

person RG1of2    schedule 05.10.2015    source источник
comment
Я предлагаю добавить тег(и), которые относятся к языку программирования, который вы используете. Кроме того, в теле вопроса укажите все сообщение об ошибке, а не только его код ошибки. Иногда это помогает.   -  person onebree    schedule 05.10.2015
comment
хорошо, я указал, что это VBA. Сообщение об ошибке - несоответствие типа.   -  person RG1of2    schedule 05.10.2015
comment
Пожалуйста, отредактируйте вопрос и добавьте теги для VBA, а также вставьте или даже сделайте снимок экрана предоставленного сообщения, слово в слово   -  person onebree    schedule 05.10.2015
comment
хотя вставка дословно не добавила ясности, я это сделала. добавил тег тоже. любая подсказка, в чем проблема?   -  person RG1of2    schedule 05.10.2015


Ответы (2)


Or и And являются логическими операторами в vba и поэтому используются для сравнения двух или более выражений и возврата значения Boolean.

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

Cells(i, 8).Value = Cells(i, j).Value: Cells(i, 9).Value = Cells(k2, j + 1).Value

Однако это, как правило, снижает читабельность вашего кода, поэтому широко не используется в вба.


Существуют и другие способы использования логических сравнений, например Select Case или менее используемый оператор Like для ограниченного регулярное выражение сопоставление с образцом. Например:

If Cells(k, j + 1).Value Like "T[1-3]((, T[1-3])+)?" Then
    '// Do something
Else
    '// Do something Else
End If

Или, возможно, блок Select Case:

Select Case Cells(k, j + 1).Value
    Case "T1", "T1, T2", "T2, T1", "T1, T3", "T3, T1" '// etc...
        '// Do Something
        '// You could include further tests such as...
    Case "Test 1", "Test Another"
        '// Also do something...
        '// Or code for the chance that none of the conditions are met:
    Case Else
        '// Nothing matched - do something else.
End Select

Однако ваш исходный код должен выглядеть примерно так:

If Cells(k, j + 1).Value = "T1" Or Cells(k, j + 1).Value = "T1, T2" Or _
    Cells(k, j + 1).Value = "T2, T1" Or Cells(k, j + 1).Value = "T1, T3" Or _
    Cells(k, j + 1).Value = "T3, T1" Or Cells(k, j + 1).Value = "T1, T2, T3" Or _
    Cells(k, j + 1).Value = "T1, T3, T2" Or Cells(k, j + 1).Value = "T2, T1, T3" Or _
    Cells(k, j + 1).Value = "T2, T3, T1" Or Cells(k, j + 1).Value = "T3, T1, T2" Or _
    Cells(k, j + 1).Value = "T3, T2, T1" Then

        Cells(i, 8).Value = Cells(i, j).Value
        Cells(i, 9).Value = Cells(k2, j + 1).Value

End If

Как вы можете видеть, это становится довольно трудоемким, поэтому я бы предложил один из других методов для вашего сравнения.

person SierraOscar    schedule 05.10.2015
comment
отличный ответ. для метода выбора регистра вы хотели ввести ‹case is = T1 ...› правильно - person RG1of2; 06.10.2015
comment
@RG1of2 нет, Case Is используется, когда вы используете операторы сравнения в вашем заявлении Case :) - person SierraOscar; 06.10.2015

Оператор «ИЛИ» должен разделять логические выражения, а не значения в правой части равенства. Измените это следующим образом:

val = Cells(k, j + 1)
If   val = "T1" Or val = "T1, T2" Or val = "T2, T1" Or val = "T1, T3" Or val = "T3, T1" Or val = "T1, T2, T3" Or val = "T1, T3, T2" Or val = "T2, T1, T3" Or val = "T2, T3, T1" Or val = "T3, T1, T2" Or val = "T3, T2, T1" Then
person Chaz    schedule 05.10.2015