Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在自定义If函数中使用相对于活动单元格的单元格内容作为条件时出现问题_Excel_Excel Formula_Vba - Fatal编程技术网

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

Excel 在自定义If函数中使用相对于活动单元格的单元格内容作为条件时出现问题,excel,excel-formula,vba,Excel,Excel Formula,Vba,我正在尝试在Excel Visual Basic编辑器中创建我的第一个用户定义函数。我正在Macbook Pro 2011上使用Excel 2011和OS X El Capitan 10.11.1版 我正在创建一个工作簿,该工作簿将使用我的函数以4分格式计算桶赛的结果。划分如下: 第一个分区或“1D”是最快的时间,比最快时间缩短0.499秒 第二个除法或“2D”是次快时间,距离最快时间0.5秒到0.999秒 第三个除法或“3D”时间比最快时间差1秒到1.499秒 最后,第四个除法或“4D”时间比

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

我正在创建一个工作簿,该工作簿将使用我的函数以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
功能分区(pVal)
如果pVal=“Z”,则
DIV=“”
ElseIf pVal=999然后
DIV=“DQ”
ElseIf pVal>100然后
DIV=“NT”
ElseIf pVal<(范围(“B2”)+0.5)然后
DIV=“X1D”
ElseIf ActiveCell.Offset(-1,0)=“X1D”和pVal<(范围(“B2”)+1),然后
DIV=“2D”
ElseIf pVal<(范围(“B2”)+1)然后
DIV=“X2D”
ElseIf pVal<(范围(“B2”)+1.5)然后
DIV=“X3D”
ElseIf pVal>(范围(“B2”)+1.499)然后
DIV=“X4D”
其他的
DIV=“不正确”
如果结束
端函数
现在,我只希望每个分区中的第一次生成“2D”、“3D”和“4D”,而每个分区中的其余时间生成“X1D”、“X2D”、“X3D”和“X4D”,因为我将应用条件格式,因此以“X”开头的任何内容都将以白色文本显示,因此在查看时不可见,当我转到每个部门的职位时,我仍然能够在未来的职能中使用它

例如,我目前正在处理2D,我希望在最快时间的0.5到0.999秒之间的所有时间返回“X2D”的结果,但第一个时间除外,这意味着它上面的单元格将显示“X1D”

上面代码中的所有内容都在工作,除了应该返回“2D”的ElseIf。它返回为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"
ElseIf ActiveCell.Offset(行偏移量=1,列偏移量=0)=“X1D”和pVal<(范围(“B2”)+1),然后DIV=“2D”
ElseIf pVal<(范围(“B2”)+1)和ActiveCell.Offset(-1,0)=“X1D”,然后DIV=“2D”
ElseIf pVal<(范围(“B2”)+1)和ActiveCell.Offset(-1,0)。选择=“X1D”然后选择DIV=“2D”
ElseIf pVal<(范围(“B2”)+1)和ActiveCell.Offset(-1,0)。Range=“X1D”然后DIV=“2D”
ElseIf pVal<(范围(“B2”)+1)和ActiveCell.Offset(-1,0)。激活=“X1D”然后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
功能分区(pVal)
如果pVal=“Z”,则DIV=“”
如果pVal=999,则DIV=“DQ”
如果pVal>100,则DIV=“NT”
如果pVal<(范围(“B2”)+0.5),则DIV=“X1D”
如果ActiveCell.Offset(-1,0)=“X1D”且pVal<(范围(“B2”)+1),则DIV=“2D”
如果pVal<100,则DIV=“正确”
如果DIV=“”则DIV=“不正确”
端函数
当我尝试这个函数时,它使整个函数停止工作,所有结果都返回为“正确”

我完全不知道该怎么做才能解决这个问题,如果有人有任何建议,我将非常感激

谢谢大家!

编辑** 此函数将仅用于除C1和C2之外的所有C列,因为C1是标题单元格,C2始终为1D

如何使用该功能的具体示例:

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

B2中始终存在的最快时间为15.000

B5中的时间为15.5,这是第一个2D时间

函数位于C5中,应首先询问B5是否为=“Z”,如果为true,则应将单元格留空,如果为true,则应询问B5是否为=999,如果为true,则应返回“DQ”,如果为true,则应询问B5是否大于100,如果为true,则应返回“NT”,如果为true,则应询问B5是否小于B2+0.5,如果为true,则应返回“X1D”,如果不正确,则应询问B5是否
我希望这有帮助

您需要重新设计函数的逻辑,但在设计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
它将返回“DQ”,因为这是第一次测试,但是如果是相反的情况:

Case Is > 100:                      ret = "NT"
Case 999:                           ret = "DQ"
您将得到“NT”,因为
pVal
大于100。只是要记住一些事情


使用此自定义项

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


(注意B2的绝对参考)

您需要重新设计函数的逻辑,但在设计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
它将返回“DQ”,因为这是第一次测试,但是如果是相反的情况:

Case Is > 100:                      ret = "NT"
Case 999:                           ret = "DQ"
您会得到“NT”,因为
pVal
也是<