使用单元格相对于活动单元格的内容作为自定义If函数中的条件的问题

我正在尝试在Excel Visual Basic编辑器中创build我的第一个用户定义的函数。 我在OS X El Capitan 10.11.1版本的Macbook Pro 2011上使用Excel 2011

我正在创build一个工作手册,将使用我的function,以4分区格式计算每桶比赛的结果。 各部门如下:

第一师或“1D”是最快时间最快0.499秒。

第二个分区或“2D”是距离最快时间0.5到0.999秒之间的下一个最快时间。

第三部分或“3D”时间在最短时间内是1秒到1.499秒之间。

最后,第四个分区或“4D”时间是最快时间的1.5秒或更多秒。

这是目前的代码,我必须找出这些部门:

Function DIV(pVal) If pVal = "Z" Then DIV = "" ElseIf pVal = 999 Then DIV = "DQ" ElseIf pVal > 100 Then DIV = "NT" ElseIf pVal < (Range("B2") + 0.5) Then DIV = "X1D" ElseIf ActiveCell.Offset(-1, 0) = "X1D" And pVal < (Range("B2") + 1) Then DIV = "2D" ElseIf pVal < (Range("B2") + 1) Then DIV = "X2D" ElseIf pVal < (Range("B2") + 1.5) Then DIV = "X3D" ElseIf pVal > (Range("B2") + 1.499) Then DIV = "X4D" Else DIV = "Incorrect" End If End Function 

现在,我只想在每个分部中第一次产生“2D”,“3D”和“4D”,其余的时间在每个分区中产生“X1D”,“X2D”,“X3D”&“ X4D“,因为我将使用条件格式,以便以”X“开始的任何内容都将以白色文本显示,因此在查看时不可见,但是当我继续前进时,仍然可以将其用于将来的function在每个部门的放置。

因此,例如,我目前正在2D上工作,并且希望所有时间都在0.5到0.999秒之间,以便返回“X2D”的结果,除了第一个表示上面的单元格会说“X1D”。

上面的代码中的所有东西都在工作,除了ElseIf应该返回“2D”。 它回来是错误的,然后转到下一个ElseIf,然后返回“X2D”。

我一次删除了一部分代码,并对其进行了testing。 我已经将问题缩小到了ActiveCell.Offset部分。

在过去的三天里,我在互联网上search了所有的东西,试图弄清楚我错过了什么,而我却找不到它。 以下是我尝试过的基于我在网上find的所有方法,至今没有任何工作。

 ElseIf ActiveCell.Offset(rowOffset:=-1, columnOffset:=0) = "X1D" And pVal < (Range("B2") + 1) Then DIV = "2D" ElseIf pVal < (Range("B2") + 1) And ActiveCell.Offset(-1, 0) = "X1D" Then DIV = "2D" ElseIf pVal < (Range("B2") + 1) And ActiveCell.Offset(-1, 0).Select = "X1D" Then DIV = "2D" ElseIf pVal < (Range("B2") + 1) And ActiveCell.Offset(-1, 0).Range = "X1D" Then DIV = "2D" ElseIf pVal < (Range("B2") + 1) And ActiveCell.Offset(-1, 0).Activate = "X1D" Then DIV = "2D" 

我已经尝试了另一种方式来编码它基于别人build议在另一个网站上,这是这样的:

 Function DIV(pVal) If pVal = "Z" Then DIV = "" If pVal = 999 Then DIV = "DQ" If pVal > 100 Then DIV = "NT" If pVal < (Range("B2") + 0.5) Then DIV = "X1D" If ActiveCell.Offset(-1, 0) = "X1D" And pVal < (Range("B2") + 1) Then DIV = "2D" If pVal < 100 Then DIV = "Correct" If DIV = "" Then DIV = "Incorrect" End Function 

当我尝试这一个时,它使整个function停止工作,所有的结果回来“正确”。

我完全丧失了我应该怎样解决这个问题,如果有人有任何build议,我会非常感激。

谢谢!

编辑**这个function只会用在除了C1和C2之外的所有列C中,因为C1是一个标题单元,而C2将一直是1D。

如何使用函数的具体例子:

假设有12次,每个分区3次。

总是在B2中的快速时间是15.000。

B5中的时间是第一次2D时间15.5。

该函数在C5中,应该首先询问B5是否为“Z”,如果为真,则应该将单元格留空,如果不是,则应该询问B5是否为999,如果是true,则返回“DQ”那么它应该询问B5是否大于100,如果是true,则返回“NT”,如果不是,则应该询问B5是否小于B2 + 0.5,如果是true,则返回“X1D”,否则返回如果B5是<B2 + 0.999 AND C4 =“X1D”,如果为true,则返回“2D”,否则应询问B5 <B2 + 0.999,如果为true,则返回“X2D”应该继续询问下一个部门。 如果我能弄清楚如何做到这一点,我可以从中学到这一点,并能够完成其他部门,并希望为我想要的工作簿做的其他事情创造新的function。

我希望这有帮助!

你需要重新devise你的函数的逻辑,而且在deviseUDF的时候也要把所有的variables都传递它,而不是函数中分配它们。 这是我认为你的function应该是这样的:

 Public Function DIV(pVal As Double, testRng As Range, testX1D As Range) As String Dim ret As String If testX1D.value = "X1D" Then If pVal < testRng.value + 1 Then DIV = "2D" Exit Function End If End If Select Case CVar(pVal) Case "Z": ret = vbNullString Case 999: ret = "DQ" Case Is > 100: ret = "NT" Case Is < (testRng.value + 0.5): ret = "X1D" Case Is < (testRng.value + 1): ret = "X2D" Case Is < (testRng.value + 1.5): ret = "X3D" Case Is > (testRng.value + 1.499): ret = "X4D" Case Else: ret = "Incorrect" End Select DIV = ret End Function 

同样值得注意的是,当以这种方式比较数值时,您必须非常小心地指定testing的顺序。 例如,如果在这种情况下pVal的值是999

 Case 999: ret = "DQ" Case Is > 100: ret = "NT" 

它会返回“DQ”,因为这是第一次testing,但是如果这是相反的话:

 Case Is > 100: ret = "NT" Case 999: ret = "DQ" 

你会得到“新台币”,因为pVal 大于100.只是要记住…


使用这个UDF

例如,在C5中input的公式,其中pVal是B5中的值

 =DIV(B5,C4,$B$2) 

(注意B2的绝对参考)