我试图在Excel Visual Basic编辑器中创建我的第一个用户定义函数。我在OS X El Capitan版本10.11.1的Macbook Pro 2011上使用Excel 2011
我正在创建一个工作簿,该工作簿将使用我的函数来计算4分区格式的每桶比赛的结果。划分如下:
第一类或“一维”是最快的时间,相比最快的时间低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”开头的任何内容都将以白色显示,因此在查看时不可见,但是,当我继续使用时,仍可以将其用于将来的功能每个部门的排名。
因此,例如,我目前正在使用2D,并且我希望所有最快时间之间相差0.5到0.999秒的时间都返回“ X2D”的结果,除了第一个,这意味着它上面的单元格会说“ X1D”。
上面代码中的所有内容均正常运行,但ElseIf应该返回“ 2D”。它返回为false,并继续到下一个ElseIf,然后在该处返回“ X2D”。
我一次删除了一部分代码,并对其进行了测试。我将问题缩小到ActiveCell.Offset部分。
在过去三天里,我一直在互联网上进行搜索,试图找出我所缺少的内容,但我找不到它。以下是我根据在网上找到的内容尝试输入的所有方式,到目前为止没有任何效果。
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"
我尝试了另一种方式,根据有人在另一个网站上的建议对它进行编码,那就是:
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
当我尝试执行此操作时,它使整个功能停止工作,并且所有结果都以“正确”的形式返回。
我完全不知该如何解决此问题,如果有人有任何建议,我将不胜感激。
谢谢!
编辑**此功能将仅在C列和C2列之外的所有C列中使用,因为C1是标题单元格,而C2始终是1D。
该函数的使用方式的具体示例:
假设有12次,每个部门3次。
始终在B2中的快速时间是15.000。
B5中的时间是15.5,这是第一个2D时间。
该函数在C5中,应首先询问B5是否=“ Z”,如果为true,则应将单元格留空;如果不为true,则应询问B5是否为= 999,如果为true,则应返回“ DQ”,否则为“ DQ”。如果为true,则应询问B5是否> 100;如果为true,则应返回“ NT”;如果为true,则应询问B5 <B2 + 0.5;如果为true,则应返回“ X1D”;如果为true,则应返回“ X1D”。询问B5是否<B2 + 0.999 AND C4 =“ X1D”,如果为true,则应返回“ 2D”;如果不是,则应询问B5 <B2 + 0.999,如果为true,则应返回“ X2D”,否则为true它应该继续询问下一个部门。如果我能找到第二部分的处理方法,则可以从中学习并能够完成其他部分的处理,并希望为我希望工作簿执行的其他操作创建新功能。
我希望这有帮助!
您需要重新设计函数的逻辑,而且在设计UDF时,还需要将所有变量传递给它,而不是在函数中分配它们。我认为这是您的函数应为:
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
还值得注意的是,以这种方式比较值时,必须非常仔细地指定测试的顺序。例如,如果值pVal
是999
在这种情况下:
Case 999: ret = "DQ"
Case Is > 100: ret = "NT"
它将返回“ DQ”,因为那是第一个测试,但是如果相反,则返回:
Case Is > 100: ret = "NT"
Case 999: ret = "DQ"
您会得到“ NT”,因为pVal
它也大于100。请记住一点...
要使用此UDF
例如,在C5中输入的公式,其中pVal是B5中的值
=DIV(B5,C4,$B$2)
(请注意B2的绝对参考)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句