Сообщение об ошибке несоответствия типов, данное # N / A # N / A для расчета в VBA - PullRequest
0 голосов
/ 23 октября 2018

У меня есть список (сильно упрощенный):

Quantity      Price          Volume
20            10
50            5
40            #N/A #N/A
20            #N/A #N/A
10            30

Я использовал следующие строки кода для вычисления объема:

For i = 1 to 5
Cells(i,3).Value = Cells(i,2).Value * Cells(i,1).Value
Next i 

Я получаю сообщение об ошибке типа, когда япосчитайте выше, что, я считаю, связано с сообщениями об ошибках "# N / A # N / A", которые я получаю.Любые предложения о том, как я мог бы обойти эту проблему.Как, например, просто пропустить расчет, если одна ячейка равна # N / A # N / A

1 Ответ

0 голосов
/ 23 октября 2018

Оператор умножения * ожидает, что он может работать с операндами, то есть с числовыми значениями.

[ActiveSheet.]Cells(i, 3).Value возвращает Variant, который обернет String при заданном значении строковой ячейки, a Date дано значение даты, Double дано числовое значение ... и Error дано значение ошибки.

В то время как VBA, как правило, очень допускает типы и весело преобразует Date в своиDouble представление, оно не может неявно преобразовать подтип Variant/Error во что-либо.

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

Решение состоит в том, чтобы проверить, является ли задействованный подтип Variant Errorvalue - функция 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...