0

我正在表格的 Excel VBA 中创建一个公式

myformula(cell1, cell2, range)

范围看起来像这个的前 7 列:

V1    D2    V2    D3    V3    D4    V4    RESULT
0.5   2     0.7

第一列中总会有一个值,该值介于 0 和 1 之间。所有后续列可能为空,但如果 D2 中有值,V2 中也会有值,依此类推。

我的公式在 RESULT 列中,涉及对 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等。

4

3 回答 3

1

您可以创建自定义函数。使用下面的函数,你可以这样称呼它:

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与预期一致。

于 2013-09-19T13:57:33.887 回答
1

对于零,您可以检查是否Range("D2").Value = 0

要检查公式是否返回空白,您可以使用 ifRange("D2").Value = vbNullString

您通常也可以侥幸逃脱Range("D2").Value = ""(尽管一些顽固的 vba 人可能会推荐 vbNullString 代替)

于 2013-09-19T13:50:03.777 回答
0

一般来说,尽量避免使用 VBA。在这种情况下,给定这样的数据设置:

在此处输入图像描述

单元格H2中的公式并复制下来是:

=A2+SUMPRODUCT(--(B2:F2<>""),--(ISNUMBER(SEARCH("d",$B$1:$F$1))),C2:G2)
于 2013-09-19T14:43:03.457 回答