Использование оператора IF со строкой с использованием .value (VBA) - PullRequest
0 голосов
/ 11 июля 2019

Возвращает ли команда .value строки и, если нет, как у вас оператор IF проверяет правильность строки в ячейке (ях).

Я работаю над таблицей бюджета, в которой задан определенный столбецв какой отдел следует направлять бюджет и его разбивку.

Sub calcMonthly()

Dim ws As Worksheet
Dim wssum As Worksheet

'set worksheets to copy values
Set ws = Sheets("Sheet 1")
Set wssum = Sheets("Sheet 2")


Dim i As Integer
Dim j As Integer
Dim k As Integer

Dim bumonth As Currency
Dim busum As Currency


'sort through Departments for % breakdown
For k = 0 To 18

    'sort through months
    For i = 0 To 11
    busum = 0
        'sort through each item
        For j = 0 To 350
            bumonth = 0
            bumonth = CCur(ws.Cells(3 + j, 37 + k).Value * ws.Cells(3 + j, 24 + i).Value)
            busum = busum + bumonth
        Next j
    'row C holds the string which details if the item if physical hardware or digital then uploads it to the cell
    If ws.Cells(3 + j, 3) = "SW" Then
        wssum.Cells(3 + k, 2 + i).Value = busum
    Else
        wssum.Cells(3 + k, 14 + i).Value = busum
    End If
    Next i
Next k


End Sub

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Range.Value возвращает Variant, чей подтип зависит от содержимого ячейки.

Учитывая #N/A, #VALUE, #REF! или любое другое значение ошибки ячейки, он возвращает Variant/Error, который не может быть приведен ни к чему, кроме Variant - пытаясь сравнить его с строка или числовое значение или выражение приведут к ошибке 13 «несоответствие типов».

Вы можете избежать этой ошибки во время выполнения, оценив, является ли вариантный подтип Error, используя функцию IsError, в идеале, сначала записав значение ячейки в локальную переменную Variant, поэтому вам не нужно обращаться к клетка дважды.

Учитывая пустую ячейку, которая не имеет ни формулы, ни значения, ни содержимого вообще, она возвращает Variant/Empty; функция IsEmpty может использоваться для проверки этого подтипа варианта.

Учитывая значение Date, возвращается Variant/Date. При любом числовом значении возвращается Variant/Double. Если задано значение TRUE или FALSE, возвращается Variant/Boolean.

И, учитывая String значение, он возвращает Variant/String.


Обратите внимание, что член по умолчанию класса Range является скрытым свойством [_Default] с двумя необязательными параметрами:

Property _Default([RowIndex], [ColumnIndex]), default member of Excel.Range

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

If ws.Cells(3 + j, 3) = "SW" Then ' implicit: .Value
    wssum.Cells(3 + k, 2 + i).Value = busum
Else
    wssum.Cells(3 + k, 14 + i).Value = busum
End If
0 голосов
/ 11 июля 2019

.Value возвращает строку, но не похоже, что вы включили ее в оператор IF.

Если ws.Cells (3 + j, 3) .value = "SW" Тогда

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