Excel精英培训网

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

[已解决]求助,用vba实现固定字符长度分列

[复制链接]
发表于 2021-1-1 17:59 | 显示全部楼层 |阅读模式
数据蛮多,自带的分列不够灵活。因此想求教vba的,希望老师们帮助我,非常感谢,祝您元旦快乐。毕竟大元旦的,老师们有空能帮忙就帮忙吧。非常感谢
固定长度分列.zip (7.02 KB, 下载次数: 14)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2021-1-1 23:51 | 显示全部楼层    本楼为最佳答案   
本帖最后由 高 于 2021-1-1 23:55 编辑

点按钮运行,或者按Alt+F8调出宏窗口运行,看行不行

工作簿2.rar

18.96 KB, 下载次数: 22

评分

参与人数 1学分 +3 收起 理由
976190982 + 3 学习了

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2021-1-2 09:11 | 显示全部楼层
高 发表于 2021-1-1 23:51
点按钮运行,或者按Alt+F8调出宏窗口运行,看行不行

谢谢老师   完美解决,我昨天晚上自己折腾了一下
写的是简单版的对数组还不熟悉
  1. Sub Split()
  2.     Dim s As String, i As Long
  3.     s = [A1]
  4.     For i = 1 To (Len(s) / 3) + 1
  5.         Cells(1, i + 1).Value = Mid(s, 1 + (i - 1) * 3, 3)
  6.     Next i
  7. End Sub
复制代码


回复

使用道具 举报

发表于 2021-1-2 10:47 | 显示全部楼层
976190982 发表于 2021-1-2 09:11
谢谢老师   完美解决,我昨天晚上自己折腾了一下
写的是简单版的对数组还不熟悉

你是以3个字符的长度分列的,并且只试了对A1单元格分列。
回复

使用道具 举报

 楼主| 发表于 2021-1-2 12:08 | 显示全部楼层
高 发表于 2021-1-2 10:47
你是以3个字符的长度分列的,并且只试了对A1单元格分列。

是的  还没有加循环   老师请教你一个问题
Arrdata = Range("A1:a10")'赋值到数组
For Each Rng In Range("A2:A" & UBound(Arrdata))'标红的这里不对,我想单个单元格在定义的数组里循环,对数组我是头痛很
回复

使用道具 举报

发表于 2021-1-2 12:33 | 显示全部楼层
976190982 发表于 2021-1-2 12:08
是的  还没有加循环   老师请教你一个问题
Arrdata = Range("A1:a10")'赋值到数组
For Each Rng In Ran ...

既然赋值 Range("A1:a10")到数组Arrdata了,就不要写下面的《For Each Rng In Range("A2:A" & UBound(Arrdata))'》了。你该用循环调用数组里的数据了,而不是再回到单元格。应该这样写:
Arrdata=Range("A1:a10")
for x = 1 to UBound(Arrdata)
'这里写你需要的内容,如
  mm =Arrdata(x,1)   'mm取得数组第x行第一列的数值
‘………………
next x
回复

使用道具 举报

 楼主| 发表于 2021-1-2 13:55 | 显示全部楼层
高 发表于 2021-1-2 12:33
既然赋值 Range("A1:a10")到数组Arrdata了,就不要写下面的《For Each Rng In Range("A2:A" & UBound(Arr ...

谢谢老师指教,这我算是有点明白了,谢谢您,元旦快乐
回复

使用道具 举报

 楼主| 发表于 2021-1-2 14:09 | 显示全部楼层
976190982 发表于 2021-1-2 13:55
谢谢老师指教,这我算是有点明白了,谢谢您,元旦快乐

    Dim Rng As Range, SJ
    Arrdata = Range("A1:a10")'这里本来是Arrdata = Range("A1").CurrentRegion,但是我有时候数据不在这个区域
    Set reg = CreateObject("vbscript.regexp")
    With reg
        .Global = True
        .Pattern = "[一-龢]+|[a-zA-Z]+|[\d+]+|[\s+]+|[^一-龢a-zA-Z0-9\s]+|"
        For Each Rng In Range("A1:a10" & UBound(Arrdata))                    '这下面的我还是理解不成,太笨了,这是一位老师帮我写的代码我想改成固定区域的
            If .test(Rng) Then
                For x = 0 To Len(Rng)
                    Range("g3").Offset(0, (x + 1) - 1) = .Execute(Rng)(x)
                Next
            Else
                For x = 0 To Len(Rng)
                    Range("g3").Offset(0, (x + 1) - 1) = Rng
                    Range("g3").Offset(0, (x + 1) - 1) = ""
                Next
            End If
        Next
    End With

老师有空的话就帮我看看吧

回复

使用道具 举报

发表于 2021-1-2 15:27 | 显示全部楼层
976190982 发表于 2021-1-2 14:09
Dim Rng As Range, SJ
    Arrdata = Range("A1:a10")'这里本来是Arrdata = Range("A1").CurrentReg ...

Dim Rng As Range, SJ
    Arrdata = Range("A1:a10") '这里本来是Arrdata = Range("A1").CurrentRegion,但是我有时候数据不在这个区域
    Set reg = CreateObject("vbscript.regexp")
    With reg
        .Global = True
        .Pattern = "[一-龢]+|[a-zA-Z]+|[\d+]+|[\s+]+|[^一-龢a-zA-Z0-9\s]+|"
        For Each Rng In Range("A1:a10" & UBound(Arrdata))                    '这下面的我还是理解不成,太笨了,这是一位老师帮我写的代码我想改成固定区域的
            k = k + 1
            If .test(Rng) Then
                For x = 0 To Len(Rng)
                On Error Resume Next '遇错误继续
                  Range("g3").Offset(x, k) = .Execute(Rng)(x)
                Next

            End If
        Next
    End With
这样能拆分。加了k,加了On Error Resume Next,改了offset(),删除了else,那个else一点用都没有。另外说两点,一是我对正则只是看了看,没用过。二是for Each Rng In Range("A1:a10" & UBound(Arrdata))区域的范围是A1:a1010

评分

参与人数 1学分 +3 收起 理由
976190982 + 3 学习了

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2021-1-2 15:39 | 显示全部楼层
高 发表于 2021-1-2 15:27
Dim Rng As Range, SJ
    Arrdata = Range("A1:a10") '这里本来是Arrdata = Range("A1").CurrentRegion ...

好的  谢谢老师   我测试一番
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-7 14:02 , Processed in 0.302303 second(s), 17 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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