Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1739 / 13646 ツリー ←次へ | 前へ→

【72256】4バイトの16進→10進数変換 VBAユーザー 12/7/3(火) 22:20 質問[未読]
【72258】Re:4バイトの16進→10進数変換 UO3 12/7/3(火) 23:15 発言[未読]
【72259】Re:4バイトの16進→10進数変換 Abyss 12/7/3(火) 23:17 発言[未読]
【72260】Re:4バイトの16進→10進数変換 UO3 12/7/3(火) 23:20 発言[未読]
【72261】Re:4バイトの16進→10進数変換 Abyss 12/7/3(火) 23:37 発言[未読]
【72262】Re:4バイトの16進→10進数変換 UO3 12/7/3(火) 23:44 発言[未読]
【72263】Re:4バイトの16進→10進数変換 ichinose@久しぶり 12/7/4(水) 0:23 発言[未読]
【72265】Re:4バイトの16進→10進数変換 UO3 12/7/4(水) 6:15 発言[未読]
【72266】Re:4バイトの16進→10進数変換 ichinose@久しぶり 12/7/4(水) 6:57 発言[未読]
【72268】Re:4バイトの16進→10進数変換 VBAユーザー 12/7/4(水) 21:39 お礼[未読]

【72256】4バイトの16進→10進数変換
質問  VBAユーザー  - 12/7/3(火) 22:20 -

引用なし
パスワード
   質問です。
マクロ動作中に16進数の値を10進数に変換が必要な際、数式を使用しています。

Function Function vbHex2Dec(Hex As String) As Long
 vbHex2Dec = CLng("&H" & Hex)
End Function

正の数を取得したいのですが、2Byte以上の値でHex = 0xF***だと負の領域になるので、以下の様にしました。

vbHex2Dec = CLng("&H0" & Hex)

4バイトの16進の値を全領域を正の数で返すにはどの様にすれば良いでしょうか?
教えて下さい。

【72258】Re:4バイトの16進→10進数変換
発言  UO3  - 12/7/3(火) 23:15 -

引用なし
パスワード
   ▼VBAユーザー さん:

どこかに計算間違いがあるかもしれませんが。
与える文字列は必ず偶数桁数との前提です。


Function vbHex2Dec(Hex As String) As Long
  Dim x As Long
  Dim z As Long
  z = Len(Hex) / 2 - 1
  For x = 1 To Len(Hex) Step 2
    vbHex2Dec = vbHex2Dec + CLng("&H" & Mid(Hex, x, 2)) * 16 ^ z
    z = z - 1
  Next
  
End Function

【72259】Re:4バイトの16進→10進数変換
発言  Abyss  - 12/7/3(火) 23:17 -

引用なし
パスワード
   16進数は1バイトあたり「2桁の文字列」構成ですので、
下記のような方法でよいと思います。

Function vbHex2Dec(ByVal Hex As String) As Long
  Hex = VBA.Right$("00000000" & Hex, 8)
  vbHex2Dec = CLng("&H" & Hex)
End Function

【72260】Re:4バイトの16進→10進数変換
発言  UO3  - 12/7/3(火) 23:20 -

引用なし
パスワード
   ▼Abyss さん:

いつもお世話様です。
Abyssさんにもの申すのは100万年早いんですが
スレ主さんの要望は、先頭ビットも数に入れたい(負の数にしたくない)ということなのかなと思うのですが。
ですので、"FFFFFFFF" なら -1 ではなく、1114095 が要件かもしれません。

【72261】Re:4バイトの16進→10進数変換
発言  Abyss  - 12/7/3(火) 23:37 -

引用なし
パスワード
   なるほど。
C言葉での「ULONG」型でしょうか。
であれば、VBのlong型には収まらない範囲が
あるので、戻り値は「通貨型」が都合に会うと
思います。UO3さん、ご指摘ありがとうございます。

【72262】Re:4バイトの16進→10進数変換
発言  UO3  - 12/7/3(火) 23:44 -

引用なし
パスワード
   ▼Abyss さん:

▼Abyss さん:

わゎlです!!
もの申して、不安になってアップしたコメントを読み返して数字おかしいなぁ?
バグに気がつきました。1桁255に対して16を使ってました。
以下ですよねぇ。ごめんなさ〜い!

Function vbHex2Dec(Hex As String) As Currency
  Dim x As Long
  Dim z As Long
  z = Len(Hex) / 2 - 1
  For x = 1 To Len(Hex) Step 2
    vbHex2Dec = vbHex2Dec + CLng("&H" & Mid(Hex, x, 2)) * 256 ^ z
    z = z - 1
  Next
  
End Function

【72263】Re:4バイトの16進→10進数変換
発言  ichinose@久しぶり  - 12/7/4(水) 0:23 -

引用なし
パスワード
   ▼VBAユーザー さん:
こんばんは。

>4バイトの16進の値を全領域を正の数で返すにはどの様にすれば良いでしょうか?
4バイト以下なら・・・・、


Function vbHex2Dec(ByVal Hex As Variant) As Double
   Dim wk As Double
   wk = CLng("&h" & Hex)
   If wk < 0 Then
    wk = (2 ^ 32) + CLng("&h" & Hex)
   End If
   vbHex2Dec = wk
End Function

【72265】Re:4バイトの16進→10進数変換
発言  UO3  - 12/7/4(水) 6:15 -

引用なし
パスワード
   ▼ichinose@久しぶり さん:

おはようございます

いつも、勉強になります。
なるほど。力技ループの私のコードはがずかしくなりますね。

で、示唆されるように、文字列桁数が、奇数の場合もカバーしておくと便利ですね。
力技コードのままですけど、1桁ずつ処理をして奇数桁をカバーしてみました。

Function vbHex2Dec(Hex As String) As Currency
  Dim x As Long
  For x = 1 To Len(Hex)
    vbHex2Dec = vbHex2Dec + CLng("&H" & Mid(Hex, x, 1)) * 16 ^ (Len(Hex) - x)
  Next
End Function

【72266】Re:4バイトの16進→10進数変換
発言  ichinose@久しぶり  - 12/7/4(水) 6:57 -

引用なし
パスワード
   おはようございます
>

>なるほど。力技ループの私のコードはがずかしくなりますね。
私は、一例として投稿しただけで、
UO3さんのロジックがN進数--->10進数に変換の基本ですよね!!

私は、中学で習いましたが、うちの子供達は、高校でやっと
少しかじった程度なんですってよ!!
ゆとり何とか でしょうか?

【72268】Re:4バイトの16進→10進数変換
お礼  VBAユーザー  - 12/7/4(水) 21:39 -

引用なし
パスワード
   各回答ありがとうございます。参考なりました。
データの中に符号有り無しが混在しているので、以下の様にしてみました。

Function vbHex2Dec(ByVal Hex As Variant, Sign As Boolean) As Double

vbHex2Dec = CLng("&H" & Hex)

'符号無しの場合を考慮
If vbHex2Dec < 0 and Sign = False Then
 vbHex2Dec = 16 ^ Len(Hex) + vbHex2Dec
End If
 
End Function

1739 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free