如果值不是数字,为啥我的函数不会将我的长度加一
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 函数以返回一个值,或者如果参数不是数字,则返回另一个值?