ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

按需剔除指定部位的不可见字符(以及空格)《附件在5楼》

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-7-15 17:42 | 显示全部楼层 |阅读模式
核心代码如下:(全部代码均在窗体中)

Option Explicit
      '撰写:老朽
      '网址:http://Club.ExcelHome.net
      '日期:2009-7-15 下午 05:41:43

Private Sub CommandButton2_Click() '随机生成用于测试的字符串
    Dim Rng, Brr, Cel
    With
Sheet1
        Set
Rng = .[a2:d25]: Brr = Array(7, 8, 9, 10, 13, 28, 29, 30, 31, 32)
        Application.ScreenUpdating = False

        Application.DisplayAlerts = False
        For Each Cel In Rng
            Cel.Value = Application.Rept(Chr(Brr(Int(Rnd * 9))), Int(Rnd * 5)) & "A" & Application.Rept(Chr(Brr(Int(Rnd * 9))), Int(Rnd * 5)) & "B" & Application.Rept(Chr(Brr(Int(Rnd * 9))), Int(Rnd * 5)) & "C" & Application.Rept(Chr(Brr(Int(Rnd * 9))), Int(Rnd * 5)) & "D" & Application.Rept(Chr(Brr(Int(Rnd * 9))), Int(Rnd * 5))
        Next

        .[a1:D1].Merge
        .[a1] = "含不可见字符之字符串"
        .[e1:h1].Merge
        .[e1] = "对应的字符串长度"
        .[e2:h25] = "=LEN(RC[-4])"
    End
With
    Application.ScreenUpdating = True
End Sub
      '撰写:老朽
      '网址:http://Club.ExcelHome.net
      '日期:2009-7-15 下午 05:41:43

Sub MYCHECK1_CLICK()
    If
MYCHECK1 = True Then Me.Tag = 1
End
Sub

      '撰写:老朽
      '网址:http://Club.ExcelHome.net
      '日期:2009-7-15 下午 05:41:43

Sub MYCHECK2_CLICK()
    If
MYCHECK2 = True Then Me.Tag = 2
End
Sub

      '撰写:老朽
      '网址:http://Club.ExcelHome.net
      '日期:2009-7-15 下午 05:41:43

Sub MYCHECK3_CLICK()
    If
MYCHECK3 = True Then Me.Tag = 3
End
Sub

      '撰写:老朽
      '网址:http://Club.ExcelHome.net
      '日期:2009-7-15 下午 05:41:43

Sub MYCHECK4_CLICK()
    If
MYCHECK4 = True Then Me.Tag = 4
End
Sub

      '撰写:老朽
      '网址:http://Club.ExcelHome.net
      '日期:2009-7-15 下午 05:41:43

Sub MYCHECK5_CLICK()
    If
MYCHECK5 = True Then Me.Tag = 5
End
Sub


[ 本帖最后由 zldccmx 于 2009-7-16 11:05 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-7-15 17:43 | 显示全部楼层
      '撰写:老朽
      '网址:http://Club.ExcelHome.net
      '日期:2009-7-15 下午 05:41:43

Private Sub COMMANDBUTTON1_CLICK()
    If
Not (CheckBox1 Or CheckBox2) Then Exit Sub
    Dim Ans, M, A, B, C, N
    Ans = IIf(Me.Tag = "", 1, Me.Tag)
    Application.ScreenUpdating = False

    Dim I As Long , J As Long , Arr, T As Single     ', Ans
    T = Timer
    If
CheckBox1 Then '单纯空格
        Select Case Ans
        Case
1    '剔除全部空格
            Selection.Replace What:=" ", Replacement:="", LookAt:=xlPart
        Case
2   '剔除左边空格
            Arr = Selection
            For
I = 1 To UBound (Arr, 1)
                For
J = 1 To UBound (Arr, 2)
                    Arr(I, J) = LTrim(Arr(I, J))
                Next

            Next
            Selection = Arr
        Case
3    '剔除右边空格
            Arr = Selection
            For
I = 1 To UBound (Arr, 1)
                For
J = 1 To UBound (Arr, 2)
                    Arr(I, J) = RTrim(Arr(I, J))
                Next

            Next
            Selection = Arr
        Case
4    '同时剔除两边空格。
            Arr = Selection
            For
I = 1 To UBound (Arr, 1)
                For
J = 1 To UBound (Arr, 2)
                    Arr(I, J) = Trim(Arr(I, J))
                Next

            Next
            Selection = Arr
        Case
5    '剔除中间空格,保留两端空格
            Arr = Selection
            For
I = 1 To UBound (Arr, 1)
                For
J = 1 To UBound (Arr, 2)
                    Arr(I, J) = Replace(Arr(I, J), Trim(Arr(I, J)), Replace(Trim(Arr(I, J)), " ", ""))
                Next

            Next
            Selection = Arr
        End
Select
    End If
    If CheckBox2 Then '剔除不可见字符
        Dim Brr, Dic As New Dictionary
        Brr = Array(7, 8, 9, 10, 13, 28, 29, 30, 31) '

        For M = 0 To UBound (Brr): Dic(Chr(Brr(M))) = "": Next
        If Ans = 1 Then   '剔除全部不可见字符
            Selection = Application.Clean(Selection)
        Else

            Select Case Ans
            Case
2   '剔除左边不可见字符
                Arr = Selection
                For
I = 1 To UBound (Arr, 1)
                    For
J = 1 To UBound (Arr, 2)
                        For
M = 1 To Len(Arr(I, J))
                            If
Not Dic.Exists(Mid(Arr(I, J), M, 1)) Then Exit For
                        Next
                        Arr(I, J) = Mid(Arr(I, J), M)
                    Next

                Next
                Selection = Arr
            Case
3    '剔除右边不可见字符

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-7-15 17:44 | 显示全部楼层
                Arr = Selection
               
For
I = 1 To UBound (Arr, 1)
                    For
J = 1 To UBound (Arr, 2)
                        For
M = Len(Arr(I, J)) To 1 Step -1
                            If
Not Dic.Exists(Mid(Arr(I, J), M, 1)) Then Exit For
                        Next
                        Arr(I, J) = Left(Arr(I, J), M)
                    Next

                Next
                Selection = Arr
            Case
4    '同时剔除两端不可见字符。
                Arr = Selection
                For
I = 1 To UBound (Arr, 1)
                    For
J = 1 To UBound (Arr, 2)
                        For
M = 1 To Len(Arr(I, J))
                            If
Not Dic.Exists(Mid(Arr(I, J), M, 1)) Then Exit For
                        Next
                        Arr(I, J) = Mid(Arr(I, J), M)
                        For
M = Len(Arr(I, J)) To 1 Step -1
                            If
Not Dic.Exists(Mid(Arr(I, J), M, 1)) Then Exit For
                        Next
                        Arr(I, J) = Left(Arr(I, J), M)
                    Next

                Next
                Selection = Arr
            Case
5    '剔除中间不可见字符,保留两端不可见字符
                Arr = Selection
                For
I = 1 To UBound (Arr, 1)
                    For
J = 1 To UBound (Arr, 2)
                        For
M = 1 To Len(Arr(I, J))
                            If
Not Dic.Exists(Mid(Arr(I, J), M, 1)) Then Exit For
                        Next
                        A = Left(Arr(I, J), M - 1): C = Mid(Arr(I, J), M)
                        For
N = Len(C) To 1 Step -1
                            If
Not Dic.Exists(Mid(Arr(I, J), N, 1)) Then Exit For
                        Next
                        B = Mid(C, N + 1): C = Left(C, N - 1)
                        For
Each M In Dic.Keys
                            C = Replace(C, M, "")
                        Next

                        Arr(I, J) = A & C & B
                    Next

                Next
                Selection = Arr
            End
Select
        End If
    End If
    Application.ScreenUpdating = True
    MsgBox "替换完毕" & vbLf & "用时共计 " & Timer - T & " 秒!", 64 + vbOKOnly, "友情提示"
End
Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-7-15 17:45 | 显示全部楼层
      '撰写:老朽
      '网址:http://Club.ExcelHome.net
      '日期:2009-7-15 下午 05:41:44

Private Sub UserForm_QueryClose(Cancel As Integer , CloseMode As Integer )
    Cancel = True

End Sub





下面是工作簿代码:
Option Explicit

      '撰写:老朽
      '网址:http://Club.ExcelHome.net
      '日期:2009-7-15 下午 05:45:32

Private Sub Workbook_BeforeClose(Cancel As Boolean )
    Unload 剔除空格
End Sub

      '撰写:老朽
      '网址:http://Club.ExcelHome.net
      '日期:2009-7-15 下午 05:45:32

Private Sub Workbook_Open()
    剔除空格.Show 0
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-7-15 17:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
剔除空格及不可见字符.rar (17.46 KB, 下载次数: 109)

这是一个比较完整的附件,源码全公开。

TA的精华主题

TA的得分主题

发表于 2010-2-22 18:49 | 显示全部楼层
下载不了,权限不够好像

对不起,只有特定用户可以下载本论坛的附件,请返回。

[ 本帖最后由 crystalxp 于 2010-2-22 18:50 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-11-29 22:49 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-12-28 13:54 | 显示全部楼层
这个文件太好了。解决了我一个大问题。一堆无规律的单元格里面充斥着不可见字符和空格。拿这个控件一扫光。

TA的精华主题

TA的得分主题

发表于 2012-9-29 18:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
太好了,学习一下。

TA的精华主题

TA的得分主题

发表于 2013-1-20 09:35 | 显示全部楼层
这是我非常需要的,但附件下载不了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 23:33 , Processed in 0.041758 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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