エクセル2003を使用しています。
A列に小数が入力されていて
B列に4バイトの16進数に変換した結果を出力するマクロを作りたいと考えています。
例えばA1=1.0のとき
B1=0000803F
とリトルエンディアンで表示させたいです。
エクセルでこのような変換は可能でしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (1件)

こんな感じでしょうか。

Cのunionみたいな機能があれば良いのですが、無いので、ファイルに書いて読み直す。
Function ftox(f As Single) As String
Dim i As Long
Dim s As String
Open "C:\temp\xx" For Binary Access Write As 1
Put #1, , f
Close #1
Open "C:\temp\xx" For Binary Access Read As 1
Get #1, , i
Close #1
s = Hex(i)
ftox = Right(s, 2) & Mid(s, 5, 2) & Mid(s, 3, 2) & Left(s, 2)
End Function

別案としては、浮動小数点数値への変換ロジックをそのままVBAで書く。
めんどくさそうです。
    • good
    • 0
この回答へのお礼

詳しい回答ありがとうございます!
さっそくやってみたいと思います

お礼日時:2015/02/09 23:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Q数値を浮動小数点32bitHEXコードに変換

10進数をIEEE754(HEXコード)に変換する簡単な計算式を教えて下さい
100->42C80000 、0.5->3F000000 等に変換したいのですが、よく分かりません
よろしくお願い致します

Aベストアンサー

環境が不明ですが、.NETである場合は自力で計算するよりもBitConverterでSingle型をバイト配列化してしまうのがよいかと。
.NET(VB,C#)の単精度浮動小数点数はIEEE754だったと思うので・・・。

Imports System.Runtime.InteropServices
Imports System.IO

Class Sample
Public Shared Function SingleToHex(ByVal Value As Single) As String
Dim bytValue As Byte() = BitConverter.GetBytes(Value)
Dim strHex As String = ""

' リトルエンディアンならバイト配列を逆転させる
If BitConverter.IsLittleEndian Then Array.Reverse(bytValue)

' バイト配列を文字列化
For Each b As Byte In bytValue : strHex += b.ToString("X2") : Next
Return strHex
End Function
End Class

呼び出し例と出力結果です。
Console.WriteLine(Sample.SingleToHex(100.0F)) ' 42C80000
Console.WriteLine(Sample.SingleToHex(0.5F)) ' 3F000000


VB6.0やVBAにはBitConverterがないので、WinAPIのCopyMemoryで変数をバイト配列化することができます。こちらのコードは割愛。必要なら補足出してください。

環境が不明ですが、.NETである場合は自力で計算するよりもBitConverterでSingle型をバイト配列化してしまうのがよいかと。
.NET(VB,C#)の単精度浮動小数点数はIEEE754だったと思うので・・・。

Imports System.Runtime.InteropServices
Imports System.IO

Class Sample
Public Shared Function SingleToHex(ByVal Value As Single) As String
Dim bytValue As Byte() = BitConverter.GetBytes(Value)
Dim strHex As String = ""

' リトルエンディアンならバイト配列を...続きを読む

Q16進数を10進数に変換する方法...

お初にお目にかかります(^^)
簡潔に質問しますm(_ _)m

バージョン:MS-Visual Basic6.0
質問内容:
16進数を10進数に変換する方法がわかりません。
Hex(Text1.Text) や Oct(Text1.Text) のような方法で
16進数・8進数に変換できるんですが…
10進数に変換する方法がわかりません。

P.S できれば、16進数→10進数、16進数や10進数→2進数
…に、変換する方法も、よろしければ教えてくださいませ
m(_ _)m

Aベストアンサー

16進数→10進数は

Dim StrHex As String
Dim intVal As Integer
StrHex = "1A"
intVal = Val("&H" & StrHex)

で出来ます。


申し訳ありませんが2進数への変換はよく分かりません。

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

QVBAで符号無し整数

BMPファイルを読み込んで配列に書き出すプログラムを作ろうとしています。
BMPファイルの構造は
http://www.geocities.co.jp/Playtown-Knight/6845/sd_doc/format_windib.html

のページに書かれてあるのですが、
typedef unsigned short WORD
typedef unsigned long DWORD
typedef unsigned char BYTE
typedef long LONG

などの「符号無し整数」で定義された変数を使う必要があります。


http://homepage1.nifty.com/rucio/main/kiso/DataType.htm

のページにあるようにVBではUlongやUshortが使えるようなのですが、

VBA上で

Dim bfSize As ULong


とすると、「ユーザー定義型は定義されていません」
と表示されます。

参照設定のところで何か設定を行えば良いと思うのですがどこを設定すれば良いのでしょうか?


もし、使えないとして、VBAで2バイトや4バイトを数値として読み込むにはどうすれば良いでしょうか?

BMPファイルを読み込んで配列に書き出すプログラムを作ろうとしています。
BMPファイルの構造は
http://www.geocities.co.jp/Playtown-Knight/6845/sd_doc/format_windib.html

のページに書かれてあるのですが、
typedef unsigned short WORD
typedef unsigned long DWORD
typedef unsigned char BYTE
typedef long LONG

などの「符号無し整数」で定義された変数を使う必要があります。


http://homepage1.nifty.com/rucio/main/kiso/DataType.htm

のページにあるようにVBではUlongやUshor...続きを読む

Aベストアンサー

http://support.microsoft.com/kb/189323/ja

参考にしてみてください。

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

Qfloat 10進数 を float 16進数に変換してくれる電卓アプリを探しています。

おはようございます。

小数点有りの10進数 を float 16進数に
自動変換
してくれる電卓アプリを探しています。

何かいいツールはありませんか?

Aベストアンサー

10進数/16進数というのは、表示の問題。floatというのは内部表現の問題。
なので、float16進数というのは意味が通りません。
浮動小数点数の内部表現を表示してくれるアプリということでしょうか?
でも、電卓アプリを紹介して欲しいという話ならカテ違いなのでは?

C/C++的に回答するなら、

float f=123.456;
unsigned char *p=(unsigned char *)&f;
printf("%02X %02X %02X %02X\n",p[0],p[1],p[2],p[3]);
とかで表示できるかと。ただし、エンディアンとかfloatのバイト数とか
環境依存なので、そのあたりは適当に調整してください。

QVB6.0で小数10進数を16進数に変換したい

仕事に生かせるようになる為、VB6.0を勉強しています。
今仕事でディジタル通信を用いて信号のやり取りをするような機器を使っているのですが、例えば小数じゃないですけど、10進数の「1」は16進数に変換すると「3F800000」となるみたいです。
どのようなプログラムを作ればこのような変換が行えるのでしょうか?
分かる方いらっしゃいましたら教えてください。

Aベストアンサー

http://www.hc.uec.ac.jp/~nagai/ip/note/note7.html
の解説を手掛かりに解説してみます。
私も勉強させてもらいました。やっと納得と言うところです。
左からのビット(列。24ビット。Realからくる。)を考える。
第1--符号(サイン)を表す1ビット。正は0、負は1
    この質問に出てくる、1は正で0。
第2ビットから第9ビットまで8ビット--指数部。
Exponent部。
    1は1.0×2の0乗であるから0000000    0であるはずだが、バイアス(Bias。#2の    ご回答に出てくる。)オッフセット値127=2    進数で1111111を加えるので、11111    11が指数部となります。
第10ビットから第24ビットまで---仮数部。 Mantissaと言う。仮数部は、1は2の1乗だから1のはずが、「仮数は先頭の1を省略し、」(上記サイトより学んだ)で0になる。
以上サインビット+指数ビット+仮数ビットを寄せ集めると0.01111111.000000000000000(.は区切りを判りやすく入れたもの)となり、左から16進のため4ビットずつとって
0011=3
1111=F
1000=8
0000=0以下同じ0.
で「3F800000」となります。
●「Baiasが127」と「仮数は先頭の1を省略し、」
の意味は、なんとなく掴めるのですが、知っていないと
どうにもならないところですね。
VBレベルでこの変換をするのは無意味(必要性はない)と思いますが、敢えてなさるのなら、上記ロジックを参考にしてVBで実現されては。Real型が出てくるのはPascal系か。浮動小数点数=Float型+Real型です。

http://www.hc.uec.ac.jp/~nagai/ip/note/note7.html
の解説を手掛かりに解説してみます。
私も勉強させてもらいました。やっと納得と言うところです。
左からのビット(列。24ビット。Realからくる。)を考える。
第1--符号(サイン)を表す1ビット。正は0、負は1
    この質問に出てくる、1は正で0。
第2ビットから第9ビットまで8ビット--指数部。
Exponent部。
    1は1.0×2の0乗であるから0000000    0であるはずだが、バイアス(Bias。#2の  ...続きを読む

Qバイト型のデータをLong型に変換

初歩的なことですみません。

Dim a(0 to 3) as Byte
Dim b as Long
と宣言します。
この変数aをLong型のbに変換するにはどのように
したらよいのでしょうか?
逆にbの値をaに変換する方法もできましたらお願いします。

Aベストアンサー

色々な方法があります。

(1)論理演算子

a(0) = b And &HFF#
a(1) = (b And &HFF00#) / &H100#
a(2) = (b And &HFF0000#) / &H10000#
a(3) = (b And &H7F000000#) / &H1000000#
If (b And &H8000000) Then
a(3) = (a(3) Or &H80)
End If

(2)ファイル

Open "temp.tmp" For Binary As #1
Put #1, 1, b
Get #1, 1, a
Close #1

(3)RtlMoveMemory

Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long)
MoveMemory a(0), b, 4
MoveMemory b, a(0), 4

--
(2)が手堅く応用が利くかと。
(3)はlongならいいが、4の倍数でない型は問題あるかも。

色々な方法があります。

(1)論理演算子

a(0) = b And &HFF#
a(1) = (b And &HFF00#) / &H100#
a(2) = (b And &HFF0000#) / &H10000#
a(3) = (b And &H7F000000#) / &H1000000#
If (b And &H8000000) Then
a(3) = (a(3) Or &H80)
End If

(2)ファイル

Open "temp.tmp" For Binary As #1
Put #1, 1, b
Get #1, 1, a
Close #1

(3)RtlMoveMemory

Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (D...続きを読む

Q16進数を2進数に変換するコードを知りたい

16進数を2進数に変換するコードをselect caseを用いて作りました。
しかし、遅いです。
場合分けの考え方を利用して、例えば変数がFだったら・・みたいな感じで16個のcase全てを書いてみたのですが、もし他にもっと早く処理する方法が合ったら教えてください。
また、データ型はこれが最良でしょうか??

データ型
変数1、2 使用文字:相当長い文字列のためstring
変数3   使用文字:1-0,A-F,及び0000-1111:string
変数4、5 使用文字:1-1,000,000程度:integer

Aベストアンサー

変数 x : 元の1桁の16進数に相当する数値(0~15)

str$((x and 8)>>3) & str$((x and 4)>>2) & str$((x and 2)>>1) & str$(x and 1)


v : 1桁の16進数文字列
x = CInt("&H" & v)

QエクセルVBA データ型 SingleとDouble

SingleとDoubleともに、整数部分の範囲についてはどのように
考えればよいのでしょうか?例えば、小数点以下4桁までを正確
に計算できれば良く、変数の値が 54321.**** となる場合は
Singleで良いのでしょうか?
SingleとDoubleで対応できる、整数部分の範囲を教えてください。
お手数ですが、よろしくお願いします。

Aベストアンサー

有効桁数で考える必要があります。Singleの有効桁数は7桁(内部的には9桁)で、負の値は -3.4028235E+38 ~ -1.401298E-45、正の値は 1.401298E-45 ~ 3.4028235E+38 の範囲の値をとります。
http://msdn2.microsoft.com/ja-jp/library/xay7978z(VS.80).aspx

54321.1234 = 5.43211234E+4
になり、有効桁数は9桁あります。この場合はDoubleでないと小数点以下7,8桁目は桁落ちします。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報