我发现自己陷入了一个在开始时看起来如此简单和愚蠢的问题,但现在让我努力解决它超过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值。
希望这是有道理的,答案很简单(我认真地认为在分配数据类型时我错过了一些东西)。
提前感谢您的帮助!
答案 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的差异