ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的测验 > Excel VBA > 判断子字符串在母字符串中的位置

判断子字符串在母字符串中的位置

作者:绿色风 分类: 时间:2022-08-18 浏览:198
楼主
0Mouse
题目:已知文本型变量S和ss,ss肯定存在于S中,请用VBA判断ss在S中的次序。已知代码如下:
  1. Sub test()
  2.     Dim S$, ss$
  3.     S = "研发部,科学事务部,国际业务部,市场部,财务部,人事部,行政部"
  4.     ss = "财务部"
  5.     '……
  6. End Sub
结果解释:若ss为“财务部”,则答案为5;若ss为“科学事务部”,则答案为2,依此类推。
要求:
1. 不得使用循环
2. 不得调用工作表函数
3. 每人有且仅有一次答题机会,出题人评分后再次编辑或重新发帖视为无效

参与方式:在回帖中贴上代码即可。
奖励方式:综合考虑解决方法的优劣和结果正确度酌情加1个技术分和/或1~5个魅力值。
开帖时间:2013-12-27晚20:00时

=======================
参考答案及解析:1楼
2楼
0Mouse
参考答案:
  1. Sub test()
  2.     Dim S$, ss$
  3.     S = "研发部,科学事务部,国际业务部,市场部,财务部,人事部,行政部"
  4.     ss = "研发部"
  5.     MsgBox UBound(Split(Split("," & S, ss)(0), ","))
  6. 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前多加了一个逗号。
  1. MsgBox UBound(Split(Split(S, ss)(0), ",")) + 1


=================
更严谨的解法见10楼!
3楼
天南地北
  1. Debug.Print UBound(Split(Left(S, InStr("," & S & ",", "," & ss & ",")), ",")) + 1
4楼
windimi007
我说我怎么没有权限乃?原来不是帖分比的关系哈!o(╯□╰)o

  1. MsgBox UBound(Split(Left$(S, InStr(S, ss) + Len(ss) - 1), ",")) + 1

简化一下:
  1. MsgBox UBound(Split(Left(S & ",", InStr(S, ss) + Len(ss)), ","))

5楼
kevinchengcw
  1. Sub test()
  2.     Dim S$, ss$
  3.     S = "研发部,科学事务部,国际业务部,市场部,财务部,人事部,行政部"
  4.     'ss = "财务部"
  5.     ss = "科学事务部"
  6.     MsgBox "ss位于S的第" & UBound(Split(Split(S, ss)(0), ",")) + 1 & "个位置"
  7. End Sub
奇怪,竟然可以看到二楼的代码
6楼
kevinchengcw
  1. MsgBox "ss位于S的第" & UBound(Split(Split(S, ss)(0) & " ", ",")) + 1 & "个位置"
  1. MsgBox "ss位于S的第" & UBound(Split(Split(S, ss)(0) & ",", ",")) & "个位置"
再来,没测试第一个是个失误
7楼
hustclm
  1. Sub test()
  2.     Dim S$, ss$
  3.     S = "研发部,科学事务部,国际业务部,市场部,财务部,人事部,行政部"
  4.     ss = "财务部"
  5.     arr = Split(S, ",")
  6.     If ss = arr(0) Then
  7.         Add = 1
  8.     ElseIf ss = arr(1) Then
  9.         Add = 2
  10.     ElseIf ss = arr(2) Then
  11.         Add = 3
  12.     ElseIf ss = arr(3) Then
  13.         Add = 4
  14.     ElseIf ss = arr(4) Then
  15.         Add = 5
  16.     ElseIf ss = arr(5) Then
  17.         Add = 6
  18.     Else
  19.         Add = 7
  20.     End If
  21. MsgBox Add
  22. End Sub
8楼
kevinchengcw
  1. Sub test()
  2.     Dim S$, ss$
  3.     S = "研发部,科学事务部,国际业务部,市场部,财务部,人事部,行政部"
  4.     ss = "科学事务部"
  5.     With CreateObject("vbscript.regexp")
  6.         .Global = True
  7.         .Pattern = "(^|,)(?=.*" & ss & ")"
  8.         Debug.Print .Execute(S).Count
  9.     End With
  10. End Sub
再来个正则的
9楼
windimi007
小千辛苦了,只能加魅力哈!技术分等我升到高级再看看哈!
10楼
天南地北
哈哈!从竞赛题的严谨性来讲,考虑业务部和国际业务部的区分,要用精确匹配,逗号夹住部分来匹配
直接用两个SPLIT或者Split+left皆可
  1. Debug.Print UBound(Split(Split(" ," & S & ",", "," & ss & ",")(0), ",")) + 1
11楼
hustclm
看完了,学习了好多东西,

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap