Тестирование пустых ячеек в excel vba

Я создаю формулу в Excel VBA формы

myformula(cell1, cell2, range)

где диапазон выглядит примерно как первые 7 столбцов:

V1    D2    V2    D3    V3    D4    V4    RESULT
0.5   2     0.7

В первом столбце всегда будет значение от 0 до 1 включительно. Все последующие столбцы могут быть пустыми, но если в D2 есть значение, то оно будет и в V2 и так далее.

Моя формула находится в столбце РЕЗУЛЬТАТ и включает суммирование цифр в столбцах V, но только в том случае, если предыдущий столбец D заполнен. то есть в этом случае он будет вычислять V1 + V2, но игнорировать V3 и V4.

VB, который я использовал, работает с

if IsEmpty(D2)

чтобы выбрать соответствующие значения, и в большинстве случаев это работает нормально.

Однако я также хочу иметь возможность применять эту формулу к случаям, когда значения V и D рассчитываются по формуле. Формула условная, выводит либо число, либо "" (что-то вроде IF(A2="","",3)). Таким образом, диапазон ячеек выглядит идентично, но VB больше не считает его действительно пустым.

Я ищу способы обойти это. Я понимаю, что результат формулы никогда не будет по-настоящему пустым, но есть ли способ сделать содержимое ячейки «достаточно пустым», чтобы VB понимал его как пустое? В качестве альтернативы есть другое условие, которое я могу использовать для выбора пустых ячеек, но я должен иметь возможность различать нулевые значения и пустые ячейки.

ETA: Я изо всех сил пытаюсь реализовать решение Stepan1010. Вот что я делаю - это может быть неправильно:

Public Function YEARAV(sdate As Date, edate As Date, yearrange As Range) As Variant

    Dim v1 As Variant
    Dim v2 As Variant
    Dim v3 As Variant
    Dim v4 As Variant

    Dim b As Date
    Dim c As Date
    Dim d As Date

    v1 = yearrange.Cells(1, 1)
    v2 = yearrange.Cells(1, 3)
    v3 = yearrange.Cells(1, 5)
    v4 = yearrange.Cells(1, 7)

    b = yearrange.Cells(1, 2)
    c = yearrange.Cells(1, 4)
    d = yearrange.Cells(1, 6)

    total_days = edate - sdate

    a = sdate
    e = edate

    If Range(yearrange.Cells(1, 6)).Value = vbNullString Then
        d = edate
        If Range(yearrange.Cells(1, 4)).Value = vbNullString Then
            c = edate
            If Range(yearrange.Cells(1, 2)).Value = vbNullString Then
                b = edate
            End If
        End If
    End If

    YEARAV = ((b - a) * v1 + (c - b) * v2 + (d - c) * v3 + (e - d) * v4) / total_days

End Function

Я также пытался просто использовать If b = vbNullString и т.д.


person ajor    schedule 19.09.2013    source источник
comment
Вы можете использовать оператор Or... например. If IsEmpty(D2) Or D2="" Then. Добавьте столько Ors, сколько хотите, чтобы описать то, что вы считаете достаточно пустым.   -  person Jean-François Corbett    schedule 19.09.2013


Ответы (3)


Для нуля вы можете просто проверить, если Range("D2").Value = 0

Чтобы проверить, возвращает ли формула пустое значение, вы можете использовать if Range("D2").Value = vbNullString

Вы также можете обычно обойтись без Range("D2").Value = "" (хотя некоторые несгибаемые люди vba, вероятно, порекомендуют вместо этого vbNullString)

person Stepan1010    schedule 19.09.2013
comment
Я пытался использовать vbNullString, но это не работает с формулами. Он по-прежнему отлично работает с пустыми ячейками, но не с теми, для которых установлено значение . То же самое для использования ="". - person ajor; 19.09.2013
comment
@apkdsmith Вы также можете попробовать, если LEN(Range(D2).Value) = 0 - person Stepan1010; 19.09.2013
comment
@apkdsmith вы не можете напрямую использовать vbNullString в формуле - это только для VBA. - не уверен, знали ли вы это. - ISBLANK() — это еще одна функция, которую вы можете попробовать, если вас беспокоит только ваша формула. - person Stepan1010; 19.09.2013
comment
Я не использую его в формуле напрямую? Я пишу формулу в VBA, в которой хочу ее использовать. - person ajor; 19.09.2013
comment
Возможно, я не реализую это должным образом - я просто отредактирую свой пост, чтобы показать, что я пытаюсь сделать. - person ajor; 19.09.2013
comment
@apkdsmith Один из этих вариантов должен вам подойти. Или вы можете использовать их комбинацию в операторе if, используя OR() или AND() - в VBA или/и. Проверка того, является ли ячейка пустой, пустой или нулевой, обычно не представляет большой проблемы. Вы попробовали предложение Дэвида Земенса? - person Stepan1010; 19.09.2013

Вы можете создать пользовательскую функцию. Используйте функцию ниже, и вы можете вызвать ее так:

Debug.Print IsCellFormulaEmpty(Range("D2"))

Вот функция:

Function IsCellFormulaEmpty(c As Range) As Boolean

Dim myVal As String
myVal = Trim(c.Value)

Select Case myVal
    Case Empty
        IsCellFormulaEmpty = True
    Case Else
        IsCellFormulaEmpty = False
End Select

End Function

Я проверил это на постоянном значении 6, формуле =IF(D24=C24,C23,"") (которая возвращала нулевую строку) и постоянном значении 0. Результаты False, True, False соответствуют ожиданиям.

person David Zemens    schedule 19.09.2013

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

введите здесь описание изображения

Формула в ячейке H2 и скопированная вниз:

=A2+SUMPRODUCT(--(B2:F2<>""),--(ISNUMBER(SEARCH("d",$B$1:$F$1))),C2:G2)
person tigeravatar    schedule 19.09.2013