日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

EXCEL中,将十六进制转换为十进制

發布時間:2024/6/21 综合教程 36 生活家
生活随笔 收集整理的這篇文章主要介紹了 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的速度是最快的(而且要快得多),批量轉換效率極高。但不足的地方有:

 ?。?)由于是直接寫在EXCEL表中的,不如VBA宏編程來得靈活;

 ?。?)轉換后得到的十進制數據一般出現在新的單元格中,所以屬于拷貝轉換,而不是替換;

 ?。?)Copy方法往往針對大塊連續的單元格區域,其中若含有不滿足十六進制格式的數據,也會一并被轉換,不但轉換后的數據是無效的,之前的原始數據也受到了影響(沒有被保留)。

  當然如果能夠保證所有待轉換的數據都滿足十六進制格式(即以"0x"為前綴,并且后續字符均代表有效的十六進制數字),并且待轉換的數據量非常大,那么使用方法3將會是最佳的選擇。

總結

以上是生活随笔為你收集整理的EXCEL中,将十六进制转换为十进制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。