ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 787|回复: 5

[已解决] 数据在A列中,如何分列

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-9-21 01:38 | 显示全部楼层 |阅读模式
本帖最后由 寒羽良 于 2019-9-22 18:29 编辑

数据以空格的分开的方式在A列,(用EXCEL分列数据中的空格选项,无法做到),如何用VBA分开,如表2中的那样。求大神帮助。

特殊分列.rar

7.77 KB, 下载次数: 24

TA的精华主题

TA的得分主题

发表于 2019-9-21 07:01 | 显示全部楼层
Option Explicit

Sub test()
  Dim arr, i, j, t, n, max
  arr = Sheets("sheet1").[a1].CurrentRegion
  ReDim brr(1 To UBound(arr, 1), 1 To 30)
  For i = 1 To UBound(arr, 1)
    t = Split(arr(i, 1), ChrW(160)): n = 0
    For j = 0 To UBound(t)
      If Len(t(j)) Then n = n + 1: brr(i, n) = t(j)
    Next
    If max < n Then max = n
  Next
  With Sheets("sheet2").[a1]
    .Resize(Rows.Count, max + 1).ClearContents
    .Resize(UBound(brr, 1), max) = brr
  End With
End Sub

评分

5

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-9-21 08:02 | 显示全部楼层
本帖最后由 寒羽良 于 2019-9-21 08:07 编辑

感谢老师的帮助,完美解决了我工作中的难题。另外我刚开始学习,您写的代码,我看不懂,能加上说明 ,让我学习学习吗?

TA的精华主题

TA的得分主题

发表于 2019-9-21 08:06 | 显示全部楼层
选中A列,数据→分列→固定宽度,需要分列处单击...完成。  ctrl+f,复制其中一个单元格里较短的不可见符号,全部替换。
以上为自食其力的解法

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-9-21 08:22 | 显示全部楼层

谢谢老师的帮助。想学习一下,可以加个注解吗?入门都,不好意思。

TA的精华主题

TA的得分主题

发表于 2019-9-21 08:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
寒羽良 发表于 2019-9-21 08:22
谢谢老师的帮助。想学习一下,可以加个注解吗?入门都,不好意思。

'没有必要再给你修改代码,因为运行多余一次时结果是不确定的,输出时已经给你考虑好了

'你可以把它复制到需要数据出现的地方,用不了几秒的吧,,,


Option Explicit '变量必须定义(不定义变量会出错,良好的习惯从这里开始)

Sub test() '这就是传说中的过程,过程名叫test,哈哈哈
  Dim arr, i, j, t, n, max '定义变量,但没有指定变量类型(就是变体变量,可以查一下什么是变量类型)
  arr = Sheets("sheet1").[a1].CurrentRegion '跟{a1]连在一起的数据块,当然也可以指定,,,
  ReDim brr(1 To UBound(arr, 1), 1 To 30) '定义一个列足够大的数组,行当然已经确定为ubound(arr,1)
  For i = 1 To UBound(arr, 1)
    t = Split(arr(i, 1), ChrW(160)): n = 0 '按非可见字符ChrW(160)进行分割当前字符串,如果是空格改成space(1)
    For j = 0 To UBound(t) '分割后得到的字符串下标为0(也可在开始处声明从1开始,觉得没有必要),上标为ubound(t)
      If Len(t(j)) Then n = n + 1: brr(i, n) = t(j) '非空时取数据,因为你这ChrW(160)有点多
    Next
    If max < n Then max = n '输出时用,因为前面定义的输出数组列数有点大,也可以不要
  Next
  With Sheets("sheet2").[a1] '指定工作表及输出的第一单元格位置,有很多方法这是最常见的
    .Resize(Rows.Count, max + 1).ClearContents '清除输出区可能存在的数据
    .Resize(UBound(brr, 1), max) = brr '输出数据,max在这里用,当然也可以把它改成ubound(brr,2)
  End With
End Sub

评分

6

查看全部评分

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

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-23 15:42 , Processed in 0.036994 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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