04 其他

分离单元格对象内的字符、字母和数字

  对单元格(Range)对象的操作非常重要,我们对数据的处理过程,几乎都是在循环、判断内、对单元格对象处理的过程。

  用一个“数据处理—分离单元格对象内的不同数据类型”的案例,了解下VBA的部分基础知识—"运算符和内置函数调用"。

  运算符是"计算和实现逻辑”的过程,内置函数的调用,使得代码更简洁有效。

运行视频:

源码下载:

描述:

  在一个单元格内,有一串融合字符串、字母和数字的内容,如果将不同数据类型分离出来,输出到后续列?

样本示例:
点击放大的图片
结果示例:
点击放大的图片
需求分析:
  • 1、支持自主选择需要分离的区域;
  • 2、分离出的结果,在选择列的后三列,其中运行符号归类为字母;
  • 3、有列标题。
VBA实现过程:
  • 1.Application.InputBox(Text, Type:=8),自主选择,Type类型是单元格;
  • 2.有错误处理过程,选择对象错误、选择对象内容为空,都退出程序执行,调用内置函数CountA执行选择对象内容为空的判断;
  • 3.for each 对选择的单元格区域循环,嵌套一个for循环,依次判断单元格内的每个字符的数据类型;
  • 4、主程序逻辑实现过程
  • ①调用Mid内置函数,把每个字符取出来判断,
  • ②调用Asc内置函数,获取该字符的ASCII码返回值,小于0的为文本字符,
  • ③比较运算符Like,判断该字符是否归属[a-z,A-Z,+,-,*,/]的范围,
  • ④比较运算符Like,判断该字符是否归属"#"(数字) 或"."(理解为小数点),
  • ⑤逐个字符判断,把结果用"&"拼接起来,
  • 调用offset内置函数,把不同结果输出到当前单元格的同行、偏移列的位置。
  • 5.Array列标题,一次写入到工作表。
示例代码
复制成功!
1

Sub 分离字符串字母和数字()
    Dim Choose_rng, rng As Range
    Dim i As Integer
    Dim str, hz, zm, sz As String

    On Error Resume Next
    Set Choose_rng = Application.InputBox("选择需要分离的单元格区域", Type:=8)  '和用户交互,自主选择,单元格类型
    If Err.Number > 0 Then MsgBox "未选择内容": Exit Sub                       '错误处理,选择类型错误,退出当前过程
    If WorksheetFunction.CountA(Choose_rng) = 0 Then MsgBox "选择单元格区域为空": Exit Sub '错误处理,单元格区域空白无内容,退出当前过程
    On Error GoTo 0

    For Each rng In Choose_rng '遍历参数代表区域中的每一个单元格
        If Len(rng) > 0 Then '如果是非空单元格
            For i = 1 To Len(rng.Text) '遍历单元格字符中的每一个字符
                str = Mid(rng.Text, i, 1) '逐个提示字符
                If Asc(str) < 0 Then hz = hz & str '如果ASCII码小于0,串联起来赋值给hz变量
                If str Like "[a-z,A-Z,+,-,*,/]" Then zm = zm & str
                If str Like "#" Or str = "." Then sz = sz & str
            Next i
        End If
        rng.Offset(0, 1) = hz '在选区后面的三个单元格分别写入汉字、数字、和字母
        rng.Offset(0, 2) = zm
        '数字部分需要处理前置、后置小数点及多个小数点同时出现的问题,方法为将小数点转换成空格,在用trim去除多余的空格,最后将空格替换成小数点
        rng.Offset(0, 3) = Replace(WorksheetFunction.Trim(Replace(sz, ".", " ")), " ", ".")
        hz = "": zm = "": sz = ""
    Next rng
    Choose_rng.Offset(-1, 1).Resize(1, 3) = Array("汉字", "字母", "数值") '写入标题

    MsgBox "分离完成"
End Sub

请开发者喝杯咖啡 请开发者喝杯咖啡!