TigerFish 发表于 2017-3-22 08:52:55

VBA 中如何把数字转换为十六进制的数字,如15,怎...

下面程序,当Mydec =9 时(转换后不包含A--F),则TransftoHEX 数值类型为数字,但Mydec =15 时,TransftoHEX 数值类型自动为STRING 型。

有没办法把15转为数字形式的HEX?

Private Sub CommandButton1_Click()

Dim MYdec As Long
'Dim TransToHex As long' 如果转换后的数字包含A...F 将报数据类型不匹配错误
Dim TransToHex As Variant

Dim MYhexToDec As Variant


MYdec = 15

TransToHex = Hex(MYdec)

MYhexToDec = Val(TransToHex)



End Sub

GoingDown 发表于 2017-3-22 08:52:56

如下:
只需要把你程序中的:
       MYhexToDec = Val(TransToHex)
改为:
      MYhexToDec = Application.Hex2Dec(TransToHex)
即可。

mcu5i51 发表于 2017-3-22 09:33:59

计算机中的数字格式有定点浮点整形等,没有进制的,或者说目前都是用二进制处理;
通常所谓的二进制,十进制,十六进制都是字符串

wangjiati 发表于 2017-3-22 10:03:53

本帖最后由 wangjiati 于 2017-3-22 10:08 编辑

Private Function myMod(a As Variant, b As Integer) As Integer
   Dim I As Integer
   For I = 1 To Len(a)
      If I = 1 Then
         myMod = CInt(Mid(a, I, 1)) Mod b
      Else
         myMod = (myMod * 10 + CInt(Mid(a, I, 1))) Mod b
      End If
   Next
End Function



Public Function CHANGE_10TO36(number As Variant) As String
    Dim remainder As Variant
    Dim a As Variant
    Dim result As String
    If number >= 1 Then
         table_36 = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", _
                           "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")
         a = Fix(number / 36)
         remainder = myMod(number, 36)
         result = table_36(remainder) & result
         
         Do While a >= 36
             remainder = myMod(a, 36)
             result = table_36(remainder) & result
             a = Fix(a / 36)
         Loop
         If a > 0 Then
            a = Fix(a)
            result = table_36(a) & result
         End If
         CHANGE_10TO36 = result
    Else
      CHANGE_10TO36 = 0
    End If   
End Function


=DEC2HEX(C9)//16进制自带函数

TigerFish 发表于 2017-3-22 13:04:32

GoingDown 发表于 2017-3-22 09:29
如下:
只需要把你程序中的:
       MYhexToDec = Val(TransToHex)


对的,是这样,谢谢
还有个问题请教下,当需要转换的十进制是正数时,得到的16进制字符串是8 位,但为负数时,是10位的长度。

如下:

Dim Target_inc As Variant
Dim Target_inc_HEX As Variant

Target_inc_HEX = Application.WorksheetFunction.Dec2Hex(Target_inc_Dec, 8)

Target_inc_Dec=-10 时. Target_inc_HEX =“FFFFFFFFF6”      --------10 位

Target_inc_Dec=10 时. Target_inc_HEX =“00000006”      -------8 位


因为要用下面的函数把两位两位分开,如果是8位,刚好4组,可负数出来10位,怎么弄?

   Target_inc_HEX_Seperated(0) = Mid(Target_inc_HEX, 7, 2)
    Target_inc_HEX_Seperated(1) = Mid(Target_inc_HEX, 5, 2)
    Target_inc_HEX_Seperated(2) = Mid(Target_inc_HEX, 3, 2)
    Target_inc_HEX_Seperated(3) = Mid(Target_inc_HEX, 1, 2)

GoingDown 发表于 2017-3-22 14:07:03

TigerFish 发表于 2017-3-22 13:04
对的,是这样,谢谢
还有个问题请教下,当需要转换的十进制是正数时,得到的16进制字符串是8 位,但为负 ...

我也不知道VBA的负数怎么用这种表示方法,即然负数这种形式,你可以把正数指定为负数同样的长度, Dec2Hex(postive_num,10). 这样的话,你就可以统一用Mid处理了,下标从2开始。
页: [1]
查看完整版本: VBA 中如何把数字转换为十六进制的数字,如15,怎...