VBA中的和变量

时间:2014-11-14 11:23:31

标签: vba excel-vba excel

我发现自己陷入了一个在开始时看起来如此简单和愚蠢的问题,但现在让我努力解决它超过24小时。

我有一个字符串(由|分隔的数字串),我希望将其转换为数组,然后根据具体情况对一些数组键求和。

我发现的第一个问题是整数长度限制,当VBA无法返回高于32767的数字时,我无法相信(然后我发现了多头......)。在"解决"我发现当试图将某些0值相加时,它实际上增加了我的总数,我无法找到任何解释。

下面你可以看到我现在拥有的东西:

Public Function calcTime(TimeType As String)
Dim jsSting As String
Dim strSplit As Variant
Dim tempTime as Double

jsSting = "100|0|10080|400|0|4320|70|0|1440|30|0|2280|10|0|7400|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|300|0|15855|90|0|1721"
'Split the string by delimiter
strSplit = Split(jsSting, "|")


Select Case UCase(TimeType)
    Case "TOTAL"
        tempTime = WorksheetFunction.Sum(strSplit(2), strSplit(5), strSplit(8), strSplit(11), strSplit(14), strSplit(17), strSplit(20), strSplit(23), strSplit(26), strSplit(29), strSplit(32), strSplit(35), strSplit(38))
    Case "GROUP1" ' Team 1 + Team2
        tempTime = WorksheetFunction.Sum(strSplit(2), strSplit(5), strSplit(8), strSplit(11), strSplit(14))
    Case "GROUP2" ' Team 1 + Team2 + Team3 
        tempTime = WorksheetFunction.Sum(strSplit(2), strSplit(5), strSplit(8), strSplit(11), strSplit(14), strSplit(38))
    Case "GROUP3" ' Team 5
        tempTime = WorksheetFunction.Sum(strSplit(17), strSplit(20), strSplit(23), strSplit(26))
    Case "GROUP4" ' Team 2
        tempTime = strSplit(14)
    Case "GROUP5" ' Team 6
        tempTime = WorksheetFunction.Sum(strSplit(29), strSplit(32), strSplit(35))
End Select

Return tempTime
End Function

在这个例子中,我试图使用Excel的SUM函数来获得所需的结果,但它并没有成功。

坚持TOTAL案例。它总结了以下键 - 值:

jsString(2)  - 10080
jsString(5)  - 4320
jsString(8)  - 1440
jsString(11) - 2280
jsString(14) - 7400
jsString(17) - 0
jsString(20) - 0
jsString(23) - 0
jsString(26) - 0
jsString(29) - 0
jsString(32) - 0
jsString(35) - 15855
jsString(38) - 0

这总共给出了41375,但是,当我在VBA中得到总和时,我得到了43096,我无法理解为什么。如果我从SUM中删除值为0,则返回正确的41k值。

希望这是有道理的,答案很简单(我认真地认为在分配数据类型时我错过了一些东西)。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

你可能意味着......?

Select Case UCase(TimeType)
Case "TOTAL"
    tempTime = WorksheetFunction.Sum(strSplit(2), strSplit(5), strSplit(8), strSplit(11), strSplit(14), strSplit(17), strSplit(20), strSplit(23), strSplit(26), strSplit(29), strSplit(32), strSplit(35), strSplit(38)

无论如何,问题在于即使你在样本中写入等于0,你也要求strSplit(38)即1721,这恰好是Excel和VBA之间的差异;)

使用代码中的MsgBox strSplit(38)进行检查。

答案 1 :(得分:0)

strsplit(38)= 1721,这是43096和41375的差异