Оператор умножения *
ожидает, что он может работать с операндами, то есть с числовыми значениями.
[ActiveSheet.]Cells(i, 3).Value
возвращает Variant
, который обернет String
при заданном значении строковой ячейки, a Date
дано значение даты, Double
дано числовое значение ... и Error
дано значение ошибки.
В то время как VBA, как правило, очень допускает типы и весело преобразует Date
в своиDouble
представление, оно не может неявно преобразовать подтип Variant/Error
во что-либо.
Поэтому каждый раз, когда вы читаете значение ячейки , не проверяя, содержит ли она ошибку , выделая предположение о его типе данных, и когда это предположение неверно, возникает ошибка несоответствие типов .
Решение состоит в том, чтобы проверить, является ли задействованный подтип Variant
Error
value - функция IsError
идеально подходит для этого.
Извлеките значения в локальные переменные, затем используйте IsError
для условного умножения операндов:
Dim lhs As Variant
lhs = ActiveSheet.Cells(i,2).Value
Dim rhs As Variant
rhs = ActiveSheet.Cells(i,1).Value
If Not IsError(lhs) And Not IsError(rhs) Then
ActiveSheet.Cells(i,3).Value = lhs * rhs
Else
'one of the operands is an error; can't compute...
End If