使用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=”数字处理 ” 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.Text2NumEnd SubSub rbbtnNum2Text(control As IRibbonControl) Call MRange.Num2TextEnd 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 = NothingEnd SubSub 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 = NothingEnd Sub