16時36分49秒この記事は4年ほど前に投稿された記事です。この記事の内容は古くなっている可能性があります。更新日時にご注意ください。某所で利用していた製品のパラメータファイルが、整数および実数型の16進数で記録されていまして。それを専用ツールにて10進数実数値に戻していましたが。専用ツールが老朽化しており、また、エクセルのマクロに貼り付けるのに手間がかかっていたため、エクセルマクロを作れと言われて作ったのですが。作る過程で製品のパラメータデータを10進数で取り込めるコマンドがあることに気づいたので実際にはそちらが採用されました。私が個人で個人の家でIEEE754形式の実数値に関する資料をまとめ、コードを作り、某所に持って行く前に不採用となりましたので。作ったので誰か拾ってください。マクロが使用できない環境のために、マクロを排してすべてエクセル関数で作ったバージョンはこちらです。仕組みまずこのIEEE754形式というのは、一般的なコンピュータで利用されている浮動小数点演算の標準規格です。定義すれば扱えるアレです。double型は8バイトの変数ですが。これの中身は先頭1bitが符号ビット(値が正なのか負なのか)指数部11bit仮数部52bitとなっています。この格納データをもとに指数部と仮数部を計算し、フォーマット通りに計算してやることで16進数のデータから実数値が取得できます。作成環境このマクロはエクセル2003で作成しており、2000・2003・2013で動作確認を行いました。1.2」にて数値及び小数点桁数の異なる数値データを利用して小数点第3位まで相違ない事を確認しています。コード以下に全体のコードを貼り付けておきます。("数値を入力してください。'8桁の16進数=整数値として認識させる。'仮数部を小数点に変換する。'標準命令に丸投げする。("数値を入力してください。BinConvCnt'8桁の16進数=整数値として認識させる。ExpDataDecConvCnt'仮数部を小数点に変換する。FracDataCnv))'実数用変換命令終わりElse'整数の場合は標準命令で対応できるので'標準命令に丸投げする。("数値を入力してください。("数値を入力してください。SpaceDeleteまず前準備です。必要な変数の定義、変換前データの読み込み、整形。読み込みに関しては、16進数の値をInputData変数に入れ込んでやります。その後前後のスペースを削除し、大文字に変換していますが。変数に代入される値が大文字の16進数で固定されている場合は最後の6行は不要です。今回のコードはもともと搭載する予定だった対象製品パラメータの仕様に合わせリトルエンディアンを前提に作成しています。よってビッグエンディアンのコードで使用する場合は上記全体コードにある以下の行のコメントをはずしてください。BigToLittle次に16進数を2進数に変換するのですが。今回16進数のコードは導入予定だったマクロの仕様に合わせ文字列として格納していますので1文字ずつ抜き出してIF文で2進数に変換するコードを使います。文字列→2進数(文字列)とすっ飛ばすことにします。BinConvCntなお、このコード直下にある'8桁の16進数=整数値として認識させる。Then12'8桁の16進数=整数値として認識させる。Thenという部分ですが。これはこの製品のパラメータが整数値はint型(4バイト)で実数値がdouble(8バイト)で記録されている事を利用したもので。整数値も8バイトで記録されているものでは別の方法で整数と実数を判別する必要があります。13)単純に文字列を抜き出しているだけです。次に2進数の指数部を10進数に変換します。ExpDataDecConvCnt11bit目をから0bit目までを2進数→10進数に直します。解析ツールとか使えばいい気がしますが気にしないでください。2進数データなので値×2桁数-1で計算できます。2進数を10進数に計算しています。この部分のみを使用すると整数の2進数→10進数の変換が行えます。次に仮数部を固定小数点に変換します。1.23456の形になるはずです。'仮数部を小数点に変換する。FracDataCnvCnt123456'仮数部を小数点に変換する。FracDataCnvCnt上のビットからビット×(1÷2n)を行っていき、データを合計することで仮数部を計算しています。この計算式を見たらわかると思いますが。これでは正確な値を保持することは出来ません。これはもともとのdouble型の仕様であって、double型はあまり精度が良くありません。このマクロ自体は最初に話したように小数点以下3桁までの同一性は確保しているはずです。次に最終的な計算をします。FracDataCnv))ここでのいままで計算したデータを全て結合します。この計算式は以下のとおりになっています。解=((-1)不等号×2指数-1023×(1+仮数))この結果を最終的に希望の場所に出力して終了です。]このプログラムデータの仕様に関しては特に使用許諾等は必要ありません。商用・非商用問わず使用できます。商用マクロへの組み込みや、製品管理ツールとしての添付など、特に制限を設けておりません。このプログラムデータをこのファイル単体そのままの形で転載や販売等をすることを禁止します。エクセルマクロとして配布する場合は必ずオリジナルのマクロに組み込んだ形での使用をお願いします。エクセル関数版の案内追加。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。前後に投稿された記事ブログに統合しました。』内)ブログに統合しました。253ヴィッツ(NSP130)にナビ取り付けました。187DAC買いました。159スピーカー買いました。7年ぶりにメインのカメラを買い換えました。89キーボード買いました。テレビ台をDIYする。