如果值不是数字,为啥我的函数不会将我的长度加一

Posted

技术标签:

【中文标题】如果值不是数字,为啥我的函数不会将我的长度加一【英文标题】:Why wont my function extend my length by one if the value is non numeric如果值不是数字,为什么我的函数不会将我的长度加一 【发布时间】:2014-04-29 11:12:26 【问题描述】:

所以我以为我的任务是一个非常简单的目标,但事实证明我正在为此苦苦挣扎。

我想要执行一段非常简单的代码,其背后的想法是数字函数,这意味着它会跳过非数字单元格,只将数值放入计算中。伟大的。但是,我希望它将长度变量扩展 1,以便为每个空白添加一个额外的数字以保持 Length 的真实值相同。

但是我不能让它工作。我的数字函数似乎什么也没做。

有人可以帮忙吗?

    Function RSE(MyCells As Range, Length As Double)  
    Dim up_day, down_day, ups, downs
    Dim average_up, average_down
    Dim rs, cellcount, rangecount As Long
    Dim cll As Range
    ups = 0
    up_day = 0
    downs = 0
    down_day = 0
    cellcount = 0
    rangecount = 0

For Each cll In MyCells


    If IsNumeric(cll) Then

    cellcount = cellcount + 1
    If cellcount = Length Then Exit For
    If cll.Value >= cll.Offset(1, 0).Value Then
    downs = downs + cll - cll.Offset(1, 0).Value
    ElseIf cll.Value < cll.Offset(1, 0).Value Then
    ups = ups + cll.Offset(1, 0).Value - cll.Value
    End If

    Else:

    Length = Length + 1

    End If

    Next cll
    average_up = ups / Length
    average_down = downs / Length

    rs = average_up / average_down

    RSE = 100 - (100 / (1 + rs))



    End Function

【问题讨论】:

空单元格可以计算为数字(零);因此 IsNumeric[some_blank_cell]) 将评估为 True。 感谢您的回答,所以我检查单元格是否为空白而不是是否包含数字更好。 如果您正在寻找空白,那么请务必进行测试。 【参考方案1】:

你应该使用

If IsNumeric(cll) And Not isEmpty(cll) Then

因为空单元格被认为是数值


重新编辑

我会这样做

Function RSE(MyCells As Range, Length As Double)
    Dim up_day, down_day, ups, downs
    Dim average_up, average_down
    Dim rs, cellcount, rangecount As Long
    Dim cll As Range
    Dim nbBlank As Integer
    ups = 0
    up_day = 0
    downs = 0
    down_day = 0
    cellcount = 0
    rangecount = 0

For Each cll In MyCells

    If cll.Address <> MyCells.Cells(1, 1).Address Then 'skip first address
        If IsNumeric(cll) And Not IsEmpty(cll) Then

        cellcount = cellcount + 1
        If cellcount = Length Then Exit For
        If cll.Offset(-1 - nbBlank, 0).Value >= cll.Value Then
        downs = downs - cll + cll.Offset(-1 - nbBlank, 0).Value
        ElseIf cll.Offset(-1 - nbBlank, 0).Value < cll.Value Then
        ups = ups - cll.Offset(-1 - nbBlank, 0).Value + cll.Value
        End If
        nbBlank = 0

        Else:

        nbBlank = nbBlank + 1

        End If
    End If
    Next cll
    average_up = ups / Length
    average_down = downs / Length

    rs = average_up / average_down

    RSE = 100 - (100 / (1 + rs))

    End Function

【讨论】:

嗨,修复上述错误后,我意识到我犯了另一个错误,但我又不知道最好的解决方法。由于我制作的 If's 字符串很麻烦,而且并没有真正起作用。基本上每次我找到一个空白时,上面的语句都使用空白单元格作为 cll 的起点,因此答案真的是错误的。如果 cll 的值为空白,我将如何使 cll 的值等于最后一个空白之前的单元格的值。 您好,非常感谢您的帮助,我已经实施了您的建议,我可以看到您的来历。但是,我的两个答案仍然存在很大差异。例如,一个日期集看起来像这样 100、空白、102、103、104,103 并返回 1.94(错误),而另一个相同但没有空白的日期集返回正确的 80。我只是不知道为什么,我知道它是因为空白弄乱了它的工作方式。由于下降的值相差 100。 @user2842059 你是对的,空白正在搞乱计算。我编辑了我的答案,希望这次我做对了 感谢它工作得非常好而且非常简单。 :)

以上是关于如果值不是数字,为啥我的函数不会将我的长度加一的主要内容,如果未能解决你的问题,请参考以下文章

javascript填充输入值,0到最大长度

如果参数是数字,我如何在雪花中获得一个 javascript 函数以返回一个值,或者如果参数不是数字,则返回另一个值?

为啥我的信号量程序打印 20 秒而不是 10 秒?

如何将我的函数参数作为数字而不是“NaN”进行交互/输出?

封装 - 为啥我使用 getter setter 将我的数据成员公开,如果我已经在课堂上声明它们是私有的

如果参数是数字,为啥函数返回 NaN?