アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBAを使って

-9223372036854775808 ~ 9223372036854775807

の数値を要素数が4のバイト型の配列に変換したいと考えています。

まず思いついたのが


dim Length_buf(3) As Byte
dim Text_size1 as long

Length_buf(0) = Text_size1 \ 16777216
Len01 = Text_size1 - Length_buf(0) * 16777216

Length_buf(1) = Len01 \ 65536
Len02 = Len01 - Length_buf(1) * 65536

Length_buf(2) = Len02 \ 256
Length_buf(3) = Len02 - Length_buf(2) * CLng(256)


のようにして普通に10進数を分解する方法です。
しかしこの方法だと正の数の時にはうまくいくのですが
longの上限値を超えて負の数になった時にうまくいきません。
これはどうすれば良いでしょうか?

あともう一つがhex関数を使った方法で

Len_byte01 = Hex(Text_size1)

Len_byte02 = ""

For I = 1 To 8 - Len(Len_byte01)

Len_byte02 = Len_byte02 & "0"

Next I

Len_byte02 = Len_byte02 & Len_byte01

Length_buf(0) = "&H" & Mid(Len_byte02, 1, 2)
Length_buf(1) = "&H" & Mid(Len_byte02, 3, 2)
Length_buf(2) = "&H" & Mid(Len_byte02, 5, 2)
Length_buf(3) = "&H" & Mid(Len_byte02, 7, 2)

のようにすることで負の数であっても、うまくいきます。
しかし8桁の数値にするためにfor文を使っていますが
もっと簡単に8桁に変換することができないでしょうか?

もっと良い方法があれば教えてください。

質問者からの補足コメント

  • VBAだと符号無し整数が使えないので
    これはできないのではないでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/10/31 22:18
  • すいません、間違いました
    一つの要素が2バイトで4つの要素からなる配列です。
    9223372036854775807までは格納できるのですが
    これを超えた場合にはVBAでどのように扱えば良いかを教えていただきたいのですが
     
    一度double型に変換してから計算するしかないでしょうか?

    No.3の回答に寄せられた補足コメントです。 補足日時:2015/11/01 00:01
  • http://homepage1.nifty.com/rucio/main/kiso/DataT …

    上記ページの値をコピペしたのですが
    このページが間違っていました。
    -2147483648 ~ 2147483647
    が正解です。とりあえず問題は自己解決しました。

    No.6の回答に寄せられた補足コメントです。 補足日時:2015/11/01 16:56

A 回答 (6件)

>9223372036854775807までは格納できるのですが


>これを超えた場合にはVBAでどのように扱えば良いかを教えていただきたいのですが
要は、9223372036854775807より大きな整数を扱う、四則演算をしたいということでしょうか?
その場合は、多倍長整数を扱うパッケージが必要になります。
参考1:
http://supermab.com/biginteger.html
上記のサイトは、動作環境として
NetFramework4.0 がインストールされている必要があります。
Excel2000以降がインストールされている必要があります。
とうことですが、その要件を満たしているなら利用可能かと思います。
参考2:
http://qiita.com/mmYYmmdd/items/23ad7ce279f2828a …
上記のサイトは、多倍長整数を扱うパッケージを独自に開発されたかたのサイトです。

以上、参考まで。
この回答への補足あり
    • good
    • 0

>一つの要素が2バイトで4つの要素からなる配列です。


これは、変換先のことですか?
>9223372036854775807 これを超えた場合とありますが、
2バイトで4つの要素(=8バイト)の上限は、9223372036854775807です。
これ以上の値を格納できません。格納するには、要素が5以上の配列にしないとだめです。

以下のことを明確にしませんか。
1.入力データ(変換前)の型、及び配列なら、その要素の数
2.出力データ(変換後)の型、及び配列なら、その要素の数
それが、判らないと始まりません。
    • good
    • 0

#3です。


そもそも、元の数値である-9223372036854775808 ~ 9223372036854775807の数値は
何の型の変数に格納されているのでしょうか。
VBAには、上記の範囲の数値を格納できる型はありません。(文字列なら別ですが)
Long型では格納できませんし、Currency型でも格納できません。
    • good
    • 0

9223372036854775807 は16進数で7FFFFFFFFFFFFFFFであり、8バイト必要です。


従って、そもそも、要素数が4のバイト型の配列に格納することは、出来ないと思いますが。
要素数が8のバイト型の配列であれば、格納可能です。
この回答への補足あり
    • good
    • 0

ごめんなさい、正の整数化ではないですね


(unsigned型があったとしても)

ただ、-1の時に0XFFFFFFFFがキチンと返るかと思うのですがどうでしょう?
ちょっと今手元にMacしかないので試せないのですが…
    • good
    • 0

Dim text4Byte as long


text4Byte = Text_size1 AND 0xFFFFFFFF
として、4Byteの正の整数値に切り詰めて最初の計算したらどうでしょう?
この回答への補足あり
    • good
    • 0

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