前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >常用功能加载宏——单元格数字与文本转换

常用功能加载宏——单元格数字与文本转换

作者头像
xyj
发布2020-07-28 14:18:34
1.9K0
发布2020-07-28 14:18:34
举报
文章被收录于专栏:VBA 学习VBA 学习VBA 学习

使用Excel主要就是做表格,表格自然离不开数字,特别是对于会计专业的,每天都要处理大量的表格,大量的数字。

Excel为了方便使用者,对于单元格的格式是非常的开放的,数字不但可以作为加减乘除用的常规数字,还可以作为文本。很多新手都会碰到数字存储格式上造成的问题,因为没有注意到数字真正存储的格式。

1、数字的两种存储格式

要判断一个数字是常规的数字还是文本,最简单的判断是:

  • 默认单元格是常规的格式下,如果数字是靠右边对齐的,那么它就是常规的数字,如果是靠左边对齐的,那么就是文本
  • 如果数字存储格式是文本,单元格左上角会有一个绿色的小三角,选中这个单元格后,还会出现一个“!”,点击这个“!”可以把数字转换为常规的数字

2、“眼见为虚”

Excel为了尽量方便操作,对于这些格式都是非常的包容的,很多公式在处理以文本形式存储的数字的时候,也会自动转换。

这也就导致很多Excel的使用者对于数字的存储非常的不在意,因为不管是常规的数字还是文本,都可以正常的进行加减乘除,完全不用太过关心。

但是在某些函数使用的时候,比如VLookup函数,如果要查找的数据和查找范围内的数据是不同存储格式,VLookup函数会返回错误。很多新手就会用Ctrl+F的查找框去查找,然后会非常不理解VLookup函数,明明看见用Ctrl+F的查找框能找到的东西,函数却返回错误!

3、数字格式转换

数字的两种存储格式,在Excel里都有它的用处,常规的数字就不用说了,表格里到处都是这些数字。

文本形式存储的数字也有它的用处,比如身份证号码,如果以常规形式输入的话,你会发现超过了15位后,数字都变为了0,这是因为Excel只能保留16位的有效数字,所以要存储超过了15位的数字,就必须使用文本格式。

在Excel里,假如有一列常规的数字,你想把它转换为文本形式存储的数字,你可能会这样去操作:

  • 选中它
  • 右键设置格式为文本
  • 发现数字左对齐了,这时候你可能以为已经搞定了!

可事实上,这个东西还是“眼见为虚”的,它仅仅是看起来变化了,实际内部存储的还是数字,必须进入编辑状态,再回车才行,这个时候就会出现那个小三角

反之也是一样的。

对Excel熟悉的人会使用分列功能来完成数字与文本的转换,用VBA来实现转换功能自然也没有问题:

首先在customUI.xml中增加代码:

      <menu id="rbmenuNumber" label="数字处理&#13;" size="large" imageMso="FormattingUnique">
        <button id="rbbtnText2Num" label="文本转数字" onAction="rbbtnText2Num" imageMso="CombineCharacters"/>
        <button id="rbbtnNum2Text" label="数字转文本" onAction="rbbtnNum2Text" imageMso="WrapText"/>   
      </menu>

回调函数:

Sub rbbtnText2Num(control As IRibbonControl)
    Call MRange.Text2Num
End Sub
Sub rbbtnNum2Text(control As IRibbonControl)
    Call MRange.Num2Text
End Sub

函数实现:

Sub Text2Num()
    Dim selectRng As Range
    Dim arr As Variant
    
    '确保选中的是单元格
    If TypeName(Selection) = "Range" Then
        Set selectRng = Selection
        '设置单元格为常规格式
        selectRng.NumberFormatLocal = "G/通用格式"
        
        '读取单元格数据,Excel会根据数据的特点自动转换格式
        arr = selectRng.Value
        selectRng.Value = arr
    End If
    
    Set selectRng = Nothing
End Sub

Sub Num2Text()
    Dim selectRng As Range
    Dim arr() As Variant
    Dim i As Long, j As Long
    
    '确保选中的是单元格
    If TypeName(Selection) = "Range" Then
        Set selectRng = Selection
        '设置单元格为文本格式
        selectRng.NumberFormatLocal = "@"
         
        If selectRng.Cells.Count > 1 Then
            arr = selectRng.Value
            
            For i = 1 To UBound(arr)
                For j = 1 To UBound(arr, 2)
                    '将数据转换为文本
                    arr(i, j) = VBA.CStr(arr(i, j))
                Next
            Next
            
            selectRng.Value = arr
        Else
            selectRng.Value = VBA.CStr(selectRng.Value)
        End If
    End If
    
    Set selectRng = Nothing
End Sub
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 VBA 学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档