EXCEL中,将⼗六进制转换为⼗进制
⼀、背景
  1、在EXCEL表格中,将⼗六进制转换为⼗进制的常⽤⽅法是:使⽤HEX2DEC函数。
  2、在EXCEL的⼀个单元格中,如果输⼊形如"12E36"之类的可以被成功识别为“科学计数法”的⽂本,EXCEL就会⾃动将该单元格中的⽂本以“科学计数法”的⽅式进⾏解释转换。这种智能转换的初衷本是为了提供帮助,但如果"12E36"本⾝其实是⼀个⼗六进制数时,这种转换则会给⽤户添加不少⿇烦。
⼆、策略
  鉴于以上原因,我在EXCEL中显⽰和处理⼗六进制数时,倾向于在原始的⼗六进制⽂本前⾯加上"0x"前缀。以这种⽅式表⽰⼗六进制数,既有助于⼈为直观判断,⼜能抑制EXCEL不适当的智能转换。
三、转换⽅法
  在这⾥,我总结了⾃⼰使⽤HEX2DEC函数,将含有"0x"前缀的⼗六进制数转换为⼗进制数的三种⽅法。
  前两种⽅法都采⽤VBA宏实现,都会⽤到相同的⾃定义函数HexToDec(其中⽤到了Hex2Dec函数)。代码如下:
Function HexToDec(cell)
Dim hexStr As String
Dim hexVal As String
Dim decVal As String
hexStr = cell.Value
hexVal = Right(hexStr, Len(hexStr) - 2) ' 去掉"0x"前缀(即头两个字符),得到真正代表⼗六进制值的⽂本
On Error Resume Next ' 开启错误处理开关(因为⽂本内容不⼀定都满⾜⼗六进制格式,所以HEX2DEC函数转换时可能会出错)
decVal = Application.WorksheetFunction.Hex2Dec(hexVal) ' ⼗六进制 --> ⼗进制
If Err.Number = 0 Then '转换未出错
cell.Value = decVal
If cell.Value = "0" Then ' 将转换为⼗进制后值为0的单元格的字体变灰,以便区分
cell.Font.Color = RGB(200, 200, 200)
End If
End If
On Error GoTo 0 ' 关闭错误处理开关(在函数结尾处,可以忽略)
End Function
  1、在活动⼯作表被选中的单元格区域中,遍历各个单元格;依次判断每个单元格的值,如果是以"0x"为前缀的,则借助于HexToDec函数进⾏转换。代码如下:
Sub ConvertData_1()
Dim rowCount As Long
Dim columnCount As Long
Dim row As Long
Dim column As Long
Dim cell As Object
rowCount = Application.Selection.Rows.Count      ' 得到被选中单元格区域中包含的⾏数
columnCount = Application.Selection.Columns.Count ' 得到被选中单元格区域中包含的列数
With Application.Selection
For row = 1 To rowCount
For column = 1 To columnCount
Set cell = .Cells(row, column)
If Left(cell.Value, 2) = "0x" Then ' 如果单元格的值以"0x"为前缀
HexToDec cell ' 将该单元格的值从⼗六进制转换为⼗进制
End If
Next column
Next row
End With
End Sub
  2、在活动⼯作表被选中的单元格区域中,使⽤Range对象的Find⽅法逐个查以"0x"为前缀的单元格;如果查到满⾜条件的单元格,则借助于HexToDec函数对其值进⾏转换。代码如下:
Sub ConvertData_2()
Dim cell As Object
进制数转换公式
With Application.Selection
Set cell = .Find("0x", LookIn:=xlValues) ' 查以"0x"为前缀的单元格
If Not cell Is Nothing Then ' 如果查成功
firstAddress = cell.Address
Do
HexToDec w, lumn)
Set cell = .FindNext(cell)
On Error Resume Next ' 开启错误处理开关
' 查并转换完毕所有满⾜条件的单元格后,执⾏下⾯这⾏语句应该条件为假从⽽跳出循环;
' 但不知为何,实际情况是:此时会出错,所以特别增加了错误处理
Loop While Not cell Is Nothing And cell.Address <> firstAddress
If Err.Number <> 0 Then ' 如果出错,表明已经查并转换完毕,退出
Exit Sub
End If
On Error GoTo 0 ' 关闭错误处理开关(在函数结尾处,可以忽略)
End If
End With
End Sub
  3、直接在EXCEL表格中为含有⼗六进制数据的单元格指定Formula属性:使⽤转换公式(配合Hex2Dec函数、Right函数和Len函数),然后使⽤Copy⽅法拷贝相同的公式到其他含有⼗六进制数据的单元格中。转换公式如下:
=HEX2DEC(RIGHT(A1, LEN(A1) - 2)) ' 针对A1单元格的转换公式
四、⽐较
  1、⽅法1、2采⽤VBA宏编写,更为灵活:
(1)对于不满⾜⼗六进制格式的⽂本数据,可以跳过不处理,进⽽做到只转换满⾜格式的数据,不满
⾜格式的数据不会受影响。
(2)可以根据转换后数值的不同,设置单元格的属性(如将值为0的单元格的字体变灰)。
  2、⽅法1与⽅法2相⽐,⽅法2的速度更快,可能是得益于“Find⽅法”的查效率⾼于“⼈为过滤”的效率。
  3、相⽐⽅法1、2⽽⾔,⽅法3的速度是最快的(⽽且要快得多),批量转换效率极⾼。但不⾜的地⽅有:
  (1)由于是直接写在EXCEL表中的,不如VBA宏编程来得灵活;
  (2)转换后得到的⼗进制数据⼀般出现在新的单元格中,所以属于拷贝转换,⽽不是替换;
  (3)Copy⽅法往往针对⼤块连续的单元格区域,其中若含有不满⾜⼗六进制格式的数据,也会⼀并被转换,不但转换后的数据是⽆效的,之前的原始数据也受到了影响(没有被保留)。
  当然如果能够保证所有待转换的数据都满⾜⼗六进制格式(即以"0x"为前缀,并且后续字符均代表有效的⼗六进制数字),并且待转换的数据量⾮常⼤,那么使⽤⽅法3将会是最佳的选择。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。