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 Cells(cell.row, cell.column)
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將會是最佳的選擇。
總結
以上是生活随笔為你收集整理的EXCEL中,将十六进制转换为十进制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 涨停板第二天开盘的三种操作方法
- 下一篇: 大数据笔记-外存算法