楼主 0Mouse |
题目:已知文本型变量S和ss,ss肯定存在于S中,请用VBA判断ss在S中的次序。已知代码如下:
- Sub test()
- Dim S$, ss$
- S = "研发部,科学事务部,国际业务部,市场部,财务部,人事部,行政部"
- ss = "财务部"
- '……
- End Sub
结果解释:若ss为“财务部”,则答案为5;若ss为“科学事务部”,则答案为2,依此类推。 要求: 1. 不得使用循环 2. 不得调用工作表函数 3. 每人有且仅有一次答题机会,出题人评分后再次编辑或重新发帖视为无效。 参与方式:在回帖中贴上代码即可。 奖励方式:综合考虑解决方法的优劣和结果正确度酌情加1个技术分和/或1~5个魅力值。 开帖时间:2013-12-27晚20:00时
======================= 参考答案及解析:1楼 |
2楼 0Mouse |
参考答案:
- Sub test()
- Dim S$, ss$
- S = "研发部,科学事务部,国际业务部,市场部,财务部,人事部,行政部"
- ss = "研发部"
- MsgBox UBound(Split(Split("," & S, ss)(0), ","))
- End Sub
书写步骤: 1、使用Split函数以ss为分隔符处理变量S,得到一个下标为0的一位数组。 2、取第1步得到的一维数组的第1个元素。 3、再次使用Split函数以逗号为分隔符处理第2步得到的内容,又得到一个下标为0的新一维数组。 4、返回第3步得到的数组的上界。
补充:若使用以下代码,结果不完全正确。当ss取第一个,即“研发部”时,Split(S, ss)(0)为空(""),那么Split("", ","))为空数组,其Ubound值为-1,结果为-1+1=0。鉴于此,参考答案在S前多加了一个逗号。
- MsgBox UBound(Split(Split(S, ss)(0), ",")) + 1
================= 更严谨的解法见10楼! |
3楼 天南地北 |
- Debug.Print UBound(Split(Left(S, InStr("," & S & ",", "," & ss & ",")), ",")) + 1
|
4楼 windimi007 |
我说我怎么没有权限乃?原来不是帖分比的关系哈!o(╯□╰)o
- MsgBox UBound(Split(Left$(S, InStr(S, ss) + Len(ss) - 1), ",")) + 1
简化一下:
- MsgBox UBound(Split(Left(S & ",", InStr(S, ss) + Len(ss)), ","))
|
5楼 kevinchengcw |
- Sub test()
- Dim S$, ss$
- S = "研发部,科学事务部,国际业务部,市场部,财务部,人事部,行政部"
- 'ss = "财务部"
- ss = "科学事务部"
- MsgBox "ss位于S的第" & UBound(Split(Split(S, ss)(0), ",")) + 1 & "个位置"
- End Sub
奇怪,竟然可以看到二楼的代码 |
6楼 kevinchengcw |
- MsgBox "ss位于S的第" & UBound(Split(Split(S, ss)(0) & " ", ",")) + 1 & "个位置"
- MsgBox "ss位于S的第" & UBound(Split(Split(S, ss)(0) & ",", ",")) & "个位置"
再来,没测试第一个是个失误 |
7楼 hustclm |
- Sub test()
- Dim S$, ss$
- S = "研发部,科学事务部,国际业务部,市场部,财务部,人事部,行政部"
- ss = "财务部"
- arr = Split(S, ",")
- If ss = arr(0) Then
- Add = 1
- ElseIf ss = arr(1) Then
- Add = 2
- ElseIf ss = arr(2) Then
- Add = 3
- ElseIf ss = arr(3) Then
- Add = 4
- ElseIf ss = arr(4) Then
- Add = 5
- ElseIf ss = arr(5) Then
- Add = 6
- Else
- Add = 7
- End If
- MsgBox Add
- End Sub
|
8楼 kevinchengcw |
- Sub test()
- Dim S$, ss$
- S = "研发部,科学事务部,国际业务部,市场部,财务部,人事部,行政部"
- ss = "科学事务部"
- With CreateObject("vbscript.regexp")
- .Global = True
- .Pattern = "(^|,)(?=.*" & ss & ")"
- Debug.Print .Execute(S).Count
- End With
- End Sub
再来个正则的 |
9楼 windimi007 |
小千辛苦了,只能加魅力哈!技术分等我升到高级再看看哈! |
10楼 天南地北 |
哈哈!从竞赛题的严谨性来讲,考虑业务部和国际业务部的区分,要用精确匹配,逗号夹住部分来匹配 直接用两个SPLIT或者Split+left皆可
- Debug.Print UBound(Split(Split(" ," & S & ",", "," & ss & ",")(0), ",")) + 1
|
11楼 hustclm |
看完了,学习了好多东西, |