在excel vba中testing空单元格

我在Excel VBA中创build了一个公式

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) 

select适当的值,这在大多数情况下工作正常。

但是,我也希望能够将这个公式应用于V和D值由公式计算的情况。 公式是有条件的,输出一个数字,或者“”(类似于IF(A2="","",3) )。所以单元格范围看起来相同,但不再被VB视为真空。

我正在寻找解决这个问题的方法。 我意识到一个公式的结果永远不会是真正的空白,但是有没有一种方法可以让单元格的内容“空白”,让VB理解它是空的? 或者是有一个不同的条件,我可以用来拿起空单元格 – 但我必须能够区分零值和空单元格。

ETA:我正在努力实施Stepan1010的解决scheme。 这就是我正在做的 – 这可能是错误的:

 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等等。

为零,你可以检查是否Range("D2").Value = 0

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

你也可以通常使用Range("D2").Value = "" (尽pipe一些顽固的vba用户可能会推荐使用vbNullString)

你可以创build一个自定义函数。 使用下面的function,你可以这样调用它:

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

这是function:

 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 

我testing了这个常数值为6 ,一个公式=IF(D24=C24,C23,"") (它返回一个空string)和一个常数值为0 。 结果如预期的那样是False, True, False

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

在这里输入图像说明

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

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