ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 作品分享:批量剔除空格

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-7-13 20:55 | 显示全部楼层 |阅读模式
代码如下:
  1. Sub 批量剔除空格()    '批量剔除空格,可以是区域,也可以是单列或者多列
  2.     On Error Resume Next
  3.     Application.ScreenUpdating = False
  4.     Dim n As Long, i As Long, arr, t As Single, q
  5.     If Selection.Count = 1 Then MsgBox "您只选择了一个单元格,太 Easy 了" & vbCrLf & "请自行手动删除。", 48 + vbOKOnly, "警示": Exit Sub
  6.     ans = Application.InputBox("请选择剔除全部、左边还是右边。" & Chr(10) & "1:剔除全部空格;" & Chr(10) & "2:剔除左边空格。" & Chr(10) & "3:剔除右边空格。", "剔除方式", 1, 100, 100, , , 1)
  7.     If ans = False Then Exit Sub
  8.     t = Timer
  9.     PG = Selection.Cells(1, 1).Address(RowAbsolute:=False, ColumnAbsolute:=False)  '定义选区第一个单元格的地址
  10.     y = Selection.Rows.Count  '定义选区的行数
  11.     ph = Selection.Columns.Count     '定义选区列数
  12.     Pl = Selection.Column  '定义选区第一类的列标
  13.     q = Columns(1).Rows.Count   '判断是07格式还是非07格式,若为07格式,则q=1048576,否则为65536
  14.     Select Case ans
  15.     Case 1    '剔除全部空格
  16.         For k = 1 To ph   '以循环执行剔除空格的模式执行
  17.             '+++++++++++核心部分(S)+++++++++++
  18.             n = WorksheetFunction.Min(Cells(q, Pl + k - 1).End(xlUp).Row, y)
  19.             arr = Range(PG).Offset(0, k - 1).Resize(n, 1)
  20.             With CreateObject("scripting.dictionary")    '建立字典
  21.                 For i = 1 To n
  22.                     .add i, Trim(arr(i, 1))    '顺序建立字典内容
  23.                 Next
  24.                 arrk = Range(PG).Offset(0, k - 1).Resize(n, 1)
  25.                 For i = 1 To UBound(arr)
  26.                     arr(i, 1) = .item(i)   '在字典中按key取item
  27.                 Next
  28.             End With
  29.             Range(PG).Offset(0, k - 1).Resize(UBound(arr), 1) = arr
  30.             '+++++++++++核心部分(E)+++++++++++
  31.         Next k

  32.         Selection.Replace What:=" ", Replacement:="", LookAt:=xlPart, _
  33.                           SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
  34.                           ReplaceFormat:=False

  35.     Case 2  '剔除左边空格
  36.         For k = 1 To ph   '以循环执行剔除空格的模式执行
  37.             '+++++++++++核心部分(S)+++++++++++
  38.             n = WorksheetFunction.Min(Cells(q, Pl + k - 1).End(xlUp).Row, y)
  39.             arr = Range(PG).Offset(0, k - 1).Resize(n, 1)
  40.             With CreateObject("scripting.dictionary")    '建立字典
  41.                 For i = 1 To n
  42.                     .add i, LTrim(arr(i, 1))    '顺序建立字典内容
  43.                 Next
  44.                 arrk = Range(PG).Offset(0, k - 1).Resize(n, 1)
  45.                 For i = 1 To UBound(arr)
  46.                     arr(i, 1) = .item(i)   '在字典中按key取item
  47.                 Next
  48.             End With
  49.             Range(PG).Offset(0, k - 1).Resize(UBound(arr), 1) = arr
  50.             '+++++++++++核心部分(E)+++++++++++
  51.         Next k
  52.     Case 3    '剔除右边
  53.         For k = 1 To ph   '以循环执行剔除空格的模式执行
  54.             '+++++++++++核心部分(S)+++++++++++
  55.             n = WorksheetFunction.Min(Cells(q, Pl + k - 1).End(xlUp).Row, y)
  56.             arr = Range(PG).Offset(0, k - 1).Resize(n, 1)
  57.             With CreateObject("scripting.dictionary")    '建立字典
  58.                 For i = 1 To n
  59.                     .add i, RTrim(arr(i, 1))    '顺序建立字典内容
  60.                 Next
  61.                 arrk = Range(PG).Offset(0, k - 1).Resize(n, 1)
  62.                 For i = 1 To UBound(arr)
  63.                     arr(i, 1) = .item(i)   '在字典中按key取item
  64.                 Next
  65.             End With
  66.             Range(PG).Offset(0, k - 1).Resize(UBound(arr), 1) = arr
  67.             '+++++++++++核心部分(E)+++++++++++
  68.         Next k
  69.     End Select
  70.     Application.ScreenUpdating = True
  71.     MsgBox "替换完毕" & vbCrLf & "用时共计 " & Timer - t & " 秒!", 64 + vbOKOnly, "友情提示"    '速度还可以
  72. End Sub
复制代码
速度还算可以,以前问过很多人,后来自己使用字典开发,提高了速度,只是还是比较繁琐。

TA的精华主题

TA的得分主题

发表于 2009-7-13 21:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
终于出炉了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-7-13 21:09 | 显示全部楼层
由于目前都是使用Office 2007,考虑到目前很多会员都是使用Office 2003版本,因此只提供代码,需要的会员可以利用代码整合到自己的模板中,作为自己的一项工具,希望它可以提高您的工作效率。

TA的精华主题

TA的得分主题

发表于 2009-7-13 21:12 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-7-13 21:13 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-7-13 21:15 | 显示全部楼层
其实这个解决我先前想的一个问题:如孙版说的假空,或者是特殊的空格,这种情况在从数据库中直接导出的数据比较常见:http://club.excelhome.net/thread-436992-1-1.html

[ 本帖最后由 little-key 于 2009-7-13 21:19 编辑 ]

TA的精华主题

TA的得分主题

发表于 2009-7-13 21:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
呵呵,使用字典方法来剔除空格不敢苟同

TA的精华主题

TA的得分主题

发表于 2009-7-13 21:37 | 显示全部楼层
对于替换全部空格,一条语句足矣,就是版主在CASE1中的最后一行
整个Case 1 就可以修改如下,字典、数组 以及循环都是冗余的
case 1: Selection.Replace What:=" ", Replacement:="", LookAt:=xlPart

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-7-13 21:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Selection.Replace What:=" ", Replacement:="", LookAt:=xlPart这个只是其中一种情况,当是非标准的空格时,这句代码就无法起到作用了。

TA的精华主题

TA的得分主题

发表于 2009-7-13 21:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
trim并不能去除全部的假空字符
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-14 18:51 , Processed in 0.043024 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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