EXCEL中,将十六进制转换为十进制
一、背景
1、在EXCEL表格中,將十六進(jìn)制轉(zhuǎn)換為十進(jìn)制的常用方法是:使用HEX2DEC函數(shù)。
2、在EXCEL的一個單元格中,如果輸入形如"12E36"之類的可以被成功識別為“科學(xué)計數(shù)法”的文本,EXCEL就會自動將該單元格中的文本以“科學(xué)計數(shù)法”的方式進(jìn)行解釋轉(zhuǎn)換。這種智能轉(zhuǎn)換的初衷本是為了提供幫助,但如果"12E36"本身其實是一個十六進(jìn)制數(shù)時,這種轉(zhuǎn)換則會給用戶添加不少麻煩。
二、策略
鑒于以上原因,我在EXCEL中顯示和處理十六進(jìn)制數(shù)時,傾向于在原始的十六進(jìn)制文本前面加上"0x"前綴。以這種方式表示十六進(jìn)制數(shù),既有助于人為直觀判斷,又能抑制EXCEL不適當(dāng)?shù)闹悄苻D(zhuǎn)換。
三、轉(zhuǎn)換方法
在這里,我總結(jié)了自己使用HEX2DEC函數(shù),將含有"0x"前綴的十六進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)的三種方法。
前兩種方法都采用VBA宏實現(xiàn),都會用到相同的自定義函數(shù)HexToDec(其中用到了Hex2Dec函數(shù))。代碼如下:
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"前綴(即頭兩個字符),得到真正代表十六進(jìn)制值的文本
On Error Resume Next ' 開啟錯誤處理開關(guān)(因為文本內(nèi)容不一定都滿足十六進(jìn)制格式,所以HEX2DEC函數(shù)轉(zhuǎn)換時可能會出錯)
decVal = Application.WorksheetFunction.Hex2Dec(hexVal) ' 十六進(jìn)制 --> 十進(jìn)制
If Err.Number = 0 Then '轉(zhuǎn)換未出錯
cell.Value = decVal
If cell.Value = "0" Then ' 將轉(zhuǎn)換為十進(jìn)制后值為0的單元格的字體變灰,以便區(qū)分
cell.Font.Color = RGB(200, 200, 200)
End If
End If
On Error GoTo 0 ' 關(guān)閉錯誤處理開關(guān)(在函數(shù)結(jié)尾處,可以忽略)
End Function
1、在活動工作表被選中的單元格區(qū)域中,遍歷各個單元格;依次判斷每個單元格的值,如果是以"0x"為前綴的,則借助于HexToDec函數(shù)進(jìn)行轉(zhuǎn)換。代碼如下:
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 ' 得到被選中單元格區(qū)域中包含的行數(shù)
columnCount = Application.Selection.Columns.Count ' 得到被選中單元格區(qū)域中包含的列數(shù)
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 ' 將該單元格的值從十六進(jìn)制轉(zhuǎn)換為十進(jìn)制
End If
Next column
Next row
End With
End Sub
2、在活動工作表被選中的單元格區(qū)域中,使用Range對象的Find方法逐個查找以"0x"為前綴的單元格;如果查找到滿足條件的單元格,則借助于HexToDec函數(shù)對其值進(jìn)行轉(zhuǎn)換。代碼如下:
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 Cells(cell.row, cell.column)
Set cell = .FindNext(cell)
On Error Resume Next ' 開啟錯誤處理開關(guān)
' 查找并轉(zhuǎn)換完畢所有滿足條件的單元格后,執(zhí)行下面這行語句應(yīng)該條件為假從而跳出循環(huán);
' 但不知為何,實際情況是:此時會出錯,所以特別增加了錯誤處理
Loop While Not cell Is Nothing And cell.Address <> firstAddress
If Err.Number <> 0 Then ' 如果出錯,表明已經(jīng)查找并轉(zhuǎn)換完畢,退出
Exit Sub
End If
On Error GoTo 0 ' 關(guān)閉錯誤處理開關(guān)(在函數(shù)結(jié)尾處,可以忽略)
End If
End With
End Sub
3、直接在EXCEL表格中為含有十六進(jìn)制數(shù)據(jù)的單元格指定Formula屬性:使用轉(zhuǎn)換公式(配合Hex2Dec函數(shù)、Right函數(shù)和Len函數(shù)),然后使用Copy方法拷貝相同的公式到其他含有十六進(jìn)制數(shù)據(jù)的單元格中。轉(zhuǎn)換公式如下:
=HEX2DEC(RIGHT(A1, LEN(A1) - 2)) ' 針對A1單元格的轉(zhuǎn)換公式
四、比較
1、方法1、2采用VBA宏編寫,更為靈活:
(1)對于不滿足十六進(jìn)制格式的文本數(shù)據(jù),可以跳過不處理,進(jìn)而做到只轉(zhuǎn)換滿足格式的數(shù)據(jù),不滿足格式的數(shù)據(jù)不會受影響。
(2)可以根據(jù)轉(zhuǎn)換后數(shù)值的不同,設(shè)置單元格的屬性(如將值為0的單元格的字體變灰)。
2、方法1與方法2相比,方法2的速度更快,可能是得益于“Find方法”的查找效率高于“人為過濾”的效率。
3、相比方法1、2而言,方法3的速度是最快的(而且要快得多),批量轉(zhuǎn)換效率極高。但不足的地方有:
(1)由于是直接寫在EXCEL表中的,不如VBA宏編程來得靈活;
(2)轉(zhuǎn)換后得到的十進(jìn)制數(shù)據(jù)一般出現(xiàn)在新的單元格中,所以屬于拷貝轉(zhuǎn)換,而不是替換;
(3)Copy方法往往針對大塊連續(xù)的單元格區(qū)域,其中若含有不滿足十六進(jìn)制格式的數(shù)據(jù),也會一并被轉(zhuǎn)換,不但轉(zhuǎn)換后的數(shù)據(jù)是無效的,之前的原始數(shù)據(jù)也受到了影響(沒有被保留)。
當(dāng)然如果能夠保證所有待轉(zhuǎn)換的數(shù)據(jù)都滿足十六進(jìn)制格式(即以"0x"為前綴,并且后續(xù)字符均代表有效的十六進(jìn)制數(shù)字),并且待轉(zhuǎn)換的數(shù)據(jù)量非常大,那么使用方法3將會是最佳的選擇。
總結(jié)
以上是生活随笔為你收集整理的EXCEL中,将十六进制转换为十进制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 涨停板第二天开盘的三种操作方法
- 下一篇: 大数据笔记-外存算法