Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1682|回复: 6

[已解决]求教,我这段代码到底有什么原因?(更新附件)

[复制链接]
发表于 2016-9-9 11:28 | 显示全部楼层 |阅读模式
本帖最后由 lovelfg 于 2016-9-9 11:42 编辑

现在有一列数据,存放的是电话号码,有一些单元格内包含了两个或者两个以后的号码,这些号码之间以“/”隔开。现想把有三个或者三个以上的号码分为两列,第一列保持一个号码,第二列存放第二个和第三个甚至更多的电话号码,我编写了一段代码,但是运行后一点效果也没有,不知道是什么原因,请高人帮我看一下吧
最佳答案
2016-9-9 11:43
  1. Sub test()
  2. Dim arr, brr
  3. arr = Range("a1").CurrentRegion
  4. ReDim brr(1 To UBound(arr), 1 To 2)
  5. For a = 2 To UBound(arr)
  6.     x = InStr(arr(a, 1), "/")
  7.     If x = 0 Then
  8.         brr(a, 1) = arr(a, 1)
  9.     Else
  10.         brr(a, 1) = Left(arr(a, 1), x - 1)
  11.         brr(a, 2) = Mid(arr(a, 1), x + 1)
  12.     End If
  13. Next
  14.     [b1].Resize(a - 1, 2) = brr
  15. End Sub
复制代码

新建 Microsoft Excel 工作表.zip

13.91 KB, 下载次数: 8

发表于 2016-9-9 11:41 | 显示全部楼层
本帖最后由 Excel学徒123 于 2016-9-9 11:42 编辑

复制代码吧
  1. Option Explicit

  2. Sub test()
  3.     Dim arrSrc, arr, arrRst()
  4.     Dim irow%, iCnt%
  5.     Dim strText$
  6.     arrSrc = Range("a1").CurrentRegion.Value
  7.     ReDim arrRst(1 To UBound(arrSrc), 1 To 2)
  8.     For irow = 2 To UBound(arrSrc)
  9.         arr = Split(arrSrc(irow, 1), "/")
  10.         If UBound(arr) = 1 Or UBound(arr) = 0 Then
  11.             arrRst(irow, 1) = arrSrc(irow, 1)
  12.         End If
  13.         If UBound(arr) > 1 Then
  14.             arrRst(irow, 1) = arr(0)
  15.             For iCnt = 1 To UBound(arr)
  16.                 If Len(arr(iCnt)) > 0 Then
  17.                     strText = strText & arr(iCnt) & "/"
  18.                 End If
  19.             Next
  20.         End If
  21.         If Len(strText) > 0 Then
  22.             arrRst(irow, 2) = Left(strText, Len(strText) - 1)
  23.         End If
  24.         strText = ""
  25.     Next
  26.     Range("g1").Resize(UBound(arrRst), 2) = arrRst
  27. End Sub
复制代码
回复

使用道具 举报

发表于 2016-9-9 11:43 | 显示全部楼层    本楼为最佳答案   
  1. Sub test()
  2. Dim arr, brr
  3. arr = Range("a1").CurrentRegion
  4. ReDim brr(1 To UBound(arr), 1 To 2)
  5. For a = 2 To UBound(arr)
  6.     x = InStr(arr(a, 1), "/")
  7.     If x = 0 Then
  8.         brr(a, 1) = arr(a, 1)
  9.     Else
  10.         brr(a, 1) = Left(arr(a, 1), x - 1)
  11.         brr(a, 2) = Mid(arr(a, 1), x + 1)
  12.     End If
  13. Next
  14.     [b1].Resize(a - 1, 2) = brr
  15. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2016-9-9 11:51 | 显示全部楼层
多谢两位!
回复

使用道具 举报

发表于 2016-9-9 12:36 | 显示全部楼层
根据您要求更改下代码,是直接取得数后再判断。
Sub test()
    Dim x As Integer, arr
    [g:h] = ""
    For x = 2 To 13
        arr = Split(Range("A" & x), "/")
        If UBound(arr) = 1 Then
            Range("g" & x) = arr(0) & "/" & arr(1)
        Else
            Range("g" & x) = arr(0)
            Range("h" & x) = Mid(Replace(Join(arr, "/"), arr(0), ""), 2)
        End If
        arr = ""
    Next x
End Sub
回复

使用道具 举报

 楼主| 发表于 2016-9-9 13:21 | 显示全部楼层
苏子龙 发表于 2016-9-9 12:36
根据您要求更改下代码,是直接取得数后再判断。
Sub test()
    Dim x As Integer, arr

万分感谢!您的这个对我很有参考意义,我才明白自己错在哪儿
回复

使用道具 举报

发表于 2016-9-9 13:43 | 显示全部楼层
因为它是个二维数组
Sub djk()
Dim arr, k%, i%
arr = Range("a2", Cells(Cells.Rows.Count, 1).End(xlUp))
For i = 1 To UBound(arr)
    k = Len(arr(i, 1))
        If k > 8 Then
        Cells(i + 1, "e") = Left(arr(i, 1), 8)
      
        Cells(i + 1, "f") = Right(arr(i, 1), Len(arr(i, 1)) - 9)
        Else
         Cells(i + 1, "e") = Left(arr(i, 1), 8)
        End If
    Next
End Sub

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-22 21:14 , Processed in 0.371571 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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