Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: 爱疯

[已解决]转为以逗号分隔的字符串

  [复制链接]
发表于 2012-2-19 18:09 | 显示全部楼层
爱疯 发表于 2012-2-19 17:56
现在,11#方法暂时领先

也来最不可取的一个,效率及为低下,完全是为了玩:
Sub test()
s$ = Trim(" a     bc def  g    hi ")
Do While InStr(s, " ")
   If Mid(s, InStr(s, " ") - 1, 1) = "," Then
      s = Left(s, InStr(s, " ") - 1) & Mid(s, InStr(s, " ") + 1)
   Else
      s = Left(s, InStr(s, " ") - 1) & "," & Mid(s, InStr(s, " ") + 1)
   End If
Loop
MsgBox s
End Sub
还是前面哪楼的循环替换的做法应该是最快的(没具体测试)
Sub test1()
s$ = Trim(" a     bc def  g    hi ")
Do While InStr(s, "  ")
   s = Replace(s, "  ", " ")
Loop
MsgBox Replace(s, " ", ",")
End Sub

前面的玩笑话是针对你说的“事先是空格的话,让trim占了便宜,我在试试事先是其它字符(比如"|")”

评分

参与人数 1 +14 金币 +12 收起 理由
爱疯 + 14 + 12

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2012-2-19 18:43 | 显示全部楼层
本帖最后由 爱疯 于 2012-2-19 20:21 编辑

谢谢骄阳!

x="|",21楼会出错



希望大家相互“找茬”,检查和完善各种方法{:011:}
回复

使用道具 举报

发表于 2012-2-19 19:36 | 显示全部楼层
要改就得改彻底,改半截当然会出错了

评分

参与人数 1 +8 金币 +8 收起 理由
爱疯 + 8 + 8 你说的对,不好意思啊。这是精神损失费

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2012-2-19 19:48 | 显示全部楼层
本帖最后由 爱疯 于 2012-2-21 19:44 编辑

2#、6#、9#、10#、11#,修改后,可得到正确结果。
13#、14#、21#,还没改,作者能改改就好啦。

当大数据量时,正则就有优势了

我修改的2楼的正则表达式,不知能否用1个表达式,不要后面的判断来截取,就好了。希望高手指点下!
一起测第4次更新.rar (14.28 KB, 下载次数: 5)
回复

使用道具 举报

 楼主| 发表于 2012-2-19 19:52 | 显示全部楼层
雪日骄阳 发表于 2012-2-19 19:36
要改就得改彻底,改半截当然会出错了

不要郁闷呀高手,最新更新测试文件在24楼,还请你修改你的办法吧

我只是希望能多比较下几个方法,希望各位作者自己拿24楼附件作修改
请13#、14#、21#作者,还是你们修改下的好哇{:191:}
回复

使用道具 举报

 楼主| 发表于 2012-2-19 19:58 | 显示全部楼层


{:221:}
回复

使用道具 举报

发表于 2012-2-19 20:51 | 显示全部楼层
本帖最后由 兰色幻想 于 2012-2-19 22:12 编辑
  1. Function zh27(x As String, y As String, z As String) As String
  2.     Dim m As Integer
  3.     Dim sr As String
  4.     Dim x1 As String
  5.     x1 = x
  6.     For m = 10 To 2 Step -1
  7.         sr = String(m, y)
  8.         If InStr(x1, sr) > 0 Then
  9.             x1 = VBA.Replace(x1, sr, y)
  10.         End If
  11.     Next m
  12.     zh27 = Replace(Trim(Replace(x1, y, " ")), " ", z)
  13. End Function
复制代码
回复

使用道具 举报

 楼主| 发表于 2012-2-19 21:51 | 显示全部楼层
本帖最后由 爱疯 于 2012-2-20 12:36 编辑



从上到下三组结果,对应X少量,中量,大量时。
少量时,11#明显,其它相近。
中量时,2#,9#靠前
大量时,2#,9#靠前




回复

使用道具 举报

发表于 2012-2-20 14:23 | 显示全部楼层
用循环

Function lvbu(x As String, y As String, z As String) As String
    Dim bDelete As Boolean
    Dim lCount As Long
    Dim i As Long
    Dim s As String
    Dim ch As String
    s = x
    bDelete = False
    For i = 1 To Len(s)
        ch = Mid$(s, i, 1)
        If y = ch Then
            If Not bDelete Then
                bDelete = True
                lCount = lCount + 1
                Mid(s, lCount, 1) = z
            End If
        Else
            bDelete = False
            lCount = lCount + 1
            Mid(s, lCount, 1) = ch
        End If
    Next i
    s = Mid(s, 1, lCount)
    If z = Left(s, 1) Then s = Mid(s, 2)
    If z = Right(s, 1) Then s = Mid(s, 1, Len(s) - 1)
    lvbu = s
End Function

评分

参与人数 1 +22 金币 +24 收起 理由
爱疯 + 22 + 24

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2012-2-20 14:51 | 显示全部楼层



少:29#、11#靠前
中:2#,29#靠前
大:2#,9#靠前
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-3-29 16:47 , Processed in 0.555184 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表