Excel VBA質問箱 IV

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

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


2173 / 13645 ツリー ←次へ | 前へ→

【69542】10進→16進8桁への変換 質問者 11/7/30(土) 21:34 質問[未読]
【69543】Re:10進→16進8桁への変換 kanabun 11/7/30(土) 21:44 発言[未読]
【69545】Re:10進→16進8桁への変換 ichinose 11/7/31(日) 0:23 発言[未読]
【69547】Re:10進→16進8桁への変換 ichinose 11/7/31(日) 8:59 発言[未読]
【69548】Re:10進→16進8桁への変換 Yuki 11/7/31(日) 18:07 発言[未読]
【69550】Re:10進→16進8桁への変換 jyun 11/7/31(日) 18:57 回答[未読]
【69560】Re:10進→16進8桁への変換 質問者 11/8/1(月) 20:46 お礼[未読]

【69542】10進→16進8桁への変換
質問  質問者  - 11/7/30(土) 21:34 -

引用なし
パスワード
   セルの数式を使用せずにマクロの中で
10進数の値を16進数に変換が必要で以下の数式を使用しています。

Function vbDec2Hex(Dec as Long, n as Byte) as String

vbDecHex=Hex(Dec)
If Len(vbDec2Hex)<n Then
Do Until Len(vbDec2Hex)=n
  vbDec2Hex="0"&vbDec2Hex
Loop
End If

End Function

最初のうちはLong型の範囲でよかったのですが、
最大2^32-1=0xFFFFFFFFのまで必要になりました。
そのため、オーバーフローを起こしてしまいます。

データ型を変更したのですが、Hex関数の部分がどうしても
オーバーフローを回避する方法を教えて下さい。

【69543】Re:10進→16進8桁への変換
発言  kanabun  - 11/7/30(土) 21:44 -

引用なし
パスワード
   ▼質問者 さん:

その関数、単に

Function Dec2Hex(num As Long) As String
  Dec2Hex = Right$("00000000" & Hex$(num), 8)
End Function

ではだめですか?

【69545】Re:10進→16進8桁への変換
発言  ichinose  - 11/7/31(日) 0:23 -

引用なし
パスワード
   こんばんは。

>セルの数式を使用せずにマクロの中で
>10進数の値を16進数に変換が必要で以下の数式を使用しています。
>最初のうちはLong型の範囲でよかったのですが、
>最大2^32-1=0xFFFFFFFFのまで必要になりました。
>そのため、オーバーフローを起こしてしまいます。
もっと桁数が必要なら、
16進変換をVBAでシミュレートすれば良いのですが
(10進数を16でどんどん割っていって余りを逆に繋げれば良いのですが、
ゆとり教育世代はやらないんだってねえ、中学で)、
4バイトで足りる数字なら・・・、


Function vbDec2Hex(num As Double, Optional n As Byte = 0) As String
  On Error Resume Next
  Dim wk As Long
  wk = CLng(num)
  If Err.Number <> 0 Then
    wk = -(2 ^ 32 - num)
  End If
  vbDec2Hex = Hex$(wk)
  vbDec2Hex = String(n - Len(vbDec2Hex), "0") & vbDec2Hex
  On Error GoTo 0
End Function


↑こんな関数では?

Sub test()
  MsgBox vbDec2Hex(256)
  MsgBox vbDec2Hex(255, 4)
  MsgBox vbDec2Hex(4294967295#)
End Sub


試してみてください。

Hexで80000000以上の数は、負の数に置き換えてから、Hex関数を使います。


>
>データ型を変更したのですが、Hex関数の部分がどうしても
>オーバーフローを回避する方法を教えて下さい。

【69547】Re:10進→16進8桁への変換
発言  ichinose  - 11/7/31(日) 8:59 -

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

>セルの数式を使用せずにマクロの中で
この意味を分析ツールのDec2Hex関数をセルに入力して値を取得するのではなく、・・・。

という意味ならば・・・。

既製アドインの「分析ツール」と「分析ツール-VBA」にチェックを入れると

Sub test2()
  MsgBox Application.Run("atpvbaen.xla!dec2hex", 256)
  MsgBox Application.Run("atpvbaen.xla!dec2hex", 255, 4)
  MsgBox Application.Run("atpvbaen.xla!dec2hex", 4294967295#)
  MsgBox Application.Run("atpvbaen.xla!dec2hex", 2147483648#)
End Sub

これで
>セルの数式を使用せずにマクロの中で
>10進数の値を16進数に変換が必要
条件を満たしていませんか?

【69548】Re:10進→16進8桁への変換
発言  Yuki  - 11/7/31(日) 18:07 -

引用なし
パスワード
   ▼質問者 さん:
>データ型を変更したのですが、Hex関数の部分がどうしても
>オーバーフローを回避する方法を教えて下さい。

こんな風な関数でどうですか
Sub TestvbDec2Hex()  ' テストしたもの
  Debug.Print vbDec2Hex(CDec(2 ^ 8) - 1)
  Debug.Print vbDec2Hex(CDec(2 ^ 32) - 1)
  Debug.Print vbDec2Hex(CDec("1234567890123456"), 16)
End Sub

'********************************************************
'*** TargetValeu : 変換データ
'*** col     : 表示桁数 8桁標準
'********************************************************
Public Function vbDec2Hex(ByVal TargetValue As Variant, _
             Optional ByVal col As Long = 8)
  Const Base   As Long = 16
  Const CharList As String = "0123456789ABCDEF"
  Dim nVal    As Variant
  Dim vVal    As Variant

  Do
    nVal = Fix(TargetValue / Base)
    vVal = (TargetValue - (nVal * Base))
    
    vbDec2Hex = Mid(CharList, vVal + 1, 1) & vbDec2Hex
    
    TargetValue = nVal
  Loop Until TargetValue = 0
  If Len(vbDec2Hex) < col Then
    vbDec2Hex = Right(String(col, Left(CharList, 1)) & vbDec2Hex, col)
  End If
End Function

【69550】Re:10進→16進8桁への変換
回答  jyun  - 11/7/31(日) 18:57 -

引用なし
パスワード
   ▼質問者 さん:
>セルの数式を使用せずにマクロの中で
>10進数の値を16進数に変換が必要で以下の数式を使用しています。
>Function vbDec2Hex(Dec as Long, n as Byte) as String

>データ型を変更したのですが、Hex関数の部分がどうしても
>オーバーフローを回避する方法を教えて下さい。

組み込みのDec2Hex関数を使うのが簡単で確実です。
準備は \Office\Library\Analysis フォルダの ATPVBAEN.XLA を参照設定するだけです。(アドインの設定は不要)
以下使用例
Sub test2()
 Debug.Print Dec2Hex(2 ^ 32 - 1)
 Debug.Print Dec2Hex(2 ^ 32)
End Sub

【69560】Re:10進→16進8桁への変換
お礼  質問者  - 11/8/1(月) 20:46 -

引用なし
パスワード
   各位

色々な回答ありがとうございます。
エクセルマクロ以外でもVB6.0を使用しているので、
折込みの数式で使用出来る様になりました。

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