• 締切済み

VBAのByte配列からInteger値を取り出し

Access VBA初心者です。 Dim Ax( 1 to 256 ) as Byte Dim Bx as Integer があるとします。 Ax(1)~Ax(256)には,データが入っています。 Ax(102)~Ax(103)を切り出して,Bxに代入したいのですが,どうしたら良いのでしょうか。 Bxの値は整数として,あとの処理に使います。

みんなの回答

noname#228894
noname#228894
回答No.5

> Windows用の専用APIは,何というものでしようか。 > どこを探せば良いのですか。 バイト列と2バイト以上からなる数値型を相互変換するのは、BitConverterクラスになります。ググれば多量のサンプルやリファレンスが出てきます。 2バイト長のInteger型だったらこんなものを使うよりも、256倍する方がよっぽど簡単だと思いますが、もっと長いデータ型や実数型ではこれの出番。詳細は以下の解説をどうぞ。私は以前これを使って、4バイトのデータ列から単精度浮動小数点型への変換と、その逆をやったことがあります。 解説 http://www.atmarkit.co.jp/fdotnet/dotnettips/045getbytes/getbytes.html リファレンスっぽい解説 http://goo.gl/C2iKhY C/C++だったらポインタで一発だと言うツッコミは…理解しますが、どうか我慢する方向でお願いします。

SangoJugo
質問者

お礼

Thank you very much.

noname#228894
noname#228894
回答No.4

その場合、バイトオーダー(ビッグエンディアンなのかリトルエンディアンなのか)が問題になります。どういうことかと言うと・・・ Ax(102) = &h1F Ax(103) = &h00 という2バイトの並びは、&h1F00と&h001Fのどっちに見るのが正しいのか、決まっていますか?ってことです。&h1F00と見るのはビッグエンディアン、&h001Fだとリトルエンディアンになります。x86/64だと、普通はリトルエンディアンですね。ただ今回は自分で勝手にバイト型配列にデータを入れているわけだから、バイトオーダーは自分で決めなきゃいけないことになりそうですが。 計算方法はすでに回答されている通りで、上位バイト側のデータを256倍して下位バイト側に足すだけです。後はバイトオーダーをどっちにするかを決めれば、式は簡単に作れますよね。 余談ですが、今回みたいな「Byte型変数をまとめてInteger型やSingle型にする」のはニーズが多いみたいで、Windowsにそれ専用のAPIがあったりします。

SangoJugo
質問者

お礼

ありがとうございました。

SangoJugo
質問者

補足

Windows用の専用APIは,何というものでしようか。 どこを探せば良いのですか。 よろしくお願いします。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

Byte  型 あるWEB記事を借りると、Excel VBAのデータ型を変数に設定してみる、中で バイト型(Byte) 0~255の整数を変数に代入できる。 例 Dim x As Byte x = 255 ーー Ax(1)からAx(256)は、それぞれ0~255の整数を変数に代入できるわけです。 自分でプログラムをで設定する場合は、上記のように、Ax(1)=254のように書けばよいのですが(初期化の記述法)、 質問者の場合、Ax(1)~Ax(256)に値がセットされるのは、どういうところからなされるのですか。たとえば (A)文字コードからや(B)画像の1バイト・8ビット分のビット列や(3)物理関連測定データなどからとか、小生は想像して考えてみるのですが、よくわからない。 それらは1バイトですが、Ax(102)~Ax(103)は合わせると2バイト=16ビット分ですね。 1例として Ax(102)=”10111011” Ax(103)="1000100" として Sub test04() MsgBox Application.WorksheetFunction.Bin2Dec("10111011") '187 End Sub Sub test05() MsgBox Application.WorksheetFunction.Bin2Dec("1000100") '68 End Sub なので、BXにはどう入れればよいのですか。 2進数的に”101110111000100”ですか? BxはIntegerといっているから 187+68=255  という10進数を入れるのですか。 所信者にしては、やりたいことの背後がむつかしいようにおもう。 ーーもう少し範囲を広げて、何を死体か説明したほうがよいのでは。 所信者の質問の、やりたいといっているメソッド(方法)やロジックが、その目的にはふさわしくない(むつかしい方法に迷い込んでいる)場合が、今まで散見されたので、こういってみるのです。 ーー ついでに、Dec2Binは Sub test01() MsgBox Application.WorksheetFunction.Dec2Bin(35) '100011 End Sub これらの関数を使えば、質問者で自分のしたいことに対し、何とかなるのでは。

SangoJugo
質問者

お礼

ありがとうございました。

回答No.2

ANo.1です。 Bx = CInt(Ax(102)) * 256 + CInt(Ax(103)) でしょうか? Ax(1)~Ax(256)に何が入ってるか不明ですし、求めたいものが何かによると思うんですが・・・

SangoJugo
質問者

お礼

ありがとうございました。

回答No.1

目的がわからないので、何がわからないのか不明ですが、 Bx = CInt(Ax(102)) または Bx = CInt(Ax(103)) ということでしょうか? 切り出すというのはどういう意味でしょうか?

SangoJugo
質問者

お礼

ありがとうございました。

SangoJugo
質問者

補足

Ax(102)とAx(103)の連続する2バイトを以て,1つのInteger型変数としたいのです。

関連するQ&A

  • EXCEL VBA Byte型に"0"を付けたい

    EXCEL VBAにてあるセルの値をByte型の16進数に 変換していますが、変換後の値の頭に"0"が付かなくて 困っています。 Dim a As String Dim aa As String Dim b As Byte Dim bb As Byte a = Val("&H" & Cells(1, 1)) aa = Format(a, "00") b = aa bb = Format(b, "00") 変数など簡略化していますが、こんな感じです。 最後の"bb"の中身が、例えば"01"ではなく"1"と なってしまっています。 バイナリエディタで表示した時に、"111"ではなく "010101"と表示させたいのですが、、、 この方法にこだわっている訳ではないので 他の方法も含めて、ご教示お願いします。

  • VBAの変数変換のことです

    VBAの変数変換のことです 整数変数=実数変数や実数変数=整数変数でCIntやCSng関数を使わないでOKでしょうか? Dim VAR(20) As Single '単精度浮動小数点数型 (Single) Dim IVARO(20) As Integer '整数型 (Integer) Dim IVAROC(20) As Integer '整数型 (Integer) IVARO(NCD) = VAR(NCD) 'Single to Integer IVAROC(NCD) = CInt(VAR(NCD)) 'Single to Integer これで、IVARO(NCD)とIVAROC(NCD)には同じ値が入っているのですが、 整数=実数でCInt関数を使わないで整数にする構文はOKでしょうか?

  • 【VBA】配列の部分コピー

    VBAにて、配列の範囲を指定して別の配列にコピーしたいと思っています。 現在は以下のようにFor文を使用して1つ1つ代入しているのですが、 もっと効率の良い方法はありますか? 処理速度を重視しています。 Dim srcArray As Variant: srcArray = Range("A1:A100") ' コピー元の配列 Dim dstArray As Variant ' コピー先の配列 Dim startIndex As Integer ' コピーする範囲の開始インデックス Dim endIndex As Integer ' コピーする範囲の終了インデックス startIndex = 6 endIndex = 16 ReDim dstArray(endIndex - startIndex) For si = startIndex To endIndex   dstArray(si - startIndex) = srcArray(si, 1) Next si

  • VBAの初期化について

    VBAの初期化について 変数Xに100という値を初期値として代入したいのですが。 Option Explicit Dim X As Integer X =100 と書くとコンパイルエラーになります。 C言語では int X=100 と初期化できますが、 VBAではどのようにすればいいのでしょうか?

  • エクセルマクロ配列で変数は使えますか

    エクセル2013です。 初めて配列を使います。 以下のように作成し思ったようにできました。 Sub 計算() '成功 Dim a As Integer Dim c As Integer Dim b(5) As Integer Dim 最終行 Dim 値列  値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To 5 b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub ただ計算する列の範囲をインプットボックスで入力した値 にしたい為以下のように改造しました。 Dim b(対象列) As Integerでエラーになります 配列には変数は使用できないのでしょうか? よろしくお願いします。 Sub 計算() '失敗 Dim a As Integer Dim c As Integer Dim b(対象列) As Integer’★ここでERRになる Dim 最終行 Dim 対象列 Dim 値列  対象列 = 22'インプットボックスで入力した値 値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To (対象列 - 17) b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub

  • VBAのデータ型に関する質問です。 以下のような宣言と処理をしました。

    VBAのデータ型に関する質問です。 以下のような宣言と処理をしました。 Dim 数値1 As Integer Dim 数値2 As Integer Dim 数値3 As Long 数値1=Range("b5").Value 数値2=Range("c5").Value 数値3=数値1*数値2 この式では、数値3がLongの型ではなくIntegerになってしまいオーバーフローのエラーになってしまいます。(10000×5の場合等)Long型のまま代入する方法がありましたら教えてください。よろしくお願いいたします。

  • vb.netでByte型の実配列サイズが大きい件

    vb.netでByte型の配列を100byteで宣言しましたが、実際の配列サイズは101byteになりました。 (例) Module Module1 Sub Main() Dim buffSize As Integer = 100 Dim inputBuff(buffSize) As Byte Dim ii As Integer = inputBuff.Length Console.WriteLine("バッファサイズ = {0}", ii) End Sub End Module ここで、iiは、101となります。 CとかC++では、有り得ない仕様ですが、どういう意味が有るのでしょうか? ご教示お願い致します。

  • VBA 乱数と配列

    VBA 乱数と配列 配列(0)~配列(5)の一次元配列の中に、1から6までの数字を重複しないように入れたいのですが、 上手くいきません。 ご指導の程、お願いします。 Sub rndsys() Dim 配列(5) As Integer Dim サイコロ As Integer Dim カウントA As Integer Dim カウントB As Integer Dim フラグ As Integer For カウントA = 0 To 5 Do サイコロ = Int(Rnd(1) * 6) + 1 For カウントB = 0 To 5 If 配列(カウントB) = サイコロ Then フラグ = フラグ + 1 End If Next カウントB Loop Until フラグ > 0 配列(カウントA) = サイコロ Next カウントA MsgBox 配列(0) & vbCrLf & 配列(1) & vbCrLf & 配列(2) & vbCrLf & 配列(3) & vbCrLf & 配列(4) & vbCrLf & 配列(5) End Sub

  • VBA "double"から0.1を引くと・・・

    エクセルVBAですが、double型で変数を定義し、-80を代入します。 そこから0.1ずつを引いていきます。すると、途中から桁がおかしくなってしまいます。 (注:別に-80からでなくても、どの値からでも、また、引いていっても足していっても、遅かれ早かれ どこかから桁がおかしくなってしまいます。) -80 -80.1 -80.2 …中略 -80.8 -80.8999999999999 -80.9999999999999 … といった感じです。 どうしてこのようになってしまうのでしょうか。 また、このようにならないためにはどうしたらよいのでしょうか。 いかにサンプルプログラムを載せます。 ------------------------------------------ Sub test() Dim test As Double Dim i As Integer test = -80 For i = 1 To 100 test = test - 0.1 Cells(i, 1) = test Next i End Sub ----------------------------------

  • VBAの変数について

    VBAでUserFormからデータを入力します。 入力された各データをTarget1~Target20に代入します。 各Targetにデータが入っている場合は、配列K(i)に「1」を格納します。 そこで、Target "1"~"20" を変数iであらわしたいのですが、どのように表現したらよいのでしょうか。 Dim i As Integer Dim K(20) As Integer Target1 = TextBox1.Value Target2 = ComboBox1.Value : : Target19 = TextBox12.Value Target20 = ComboBox8.Value For i = 1 To 20 If 『  ?   』 <> "" Then K(i) = 1 EndIf Next i

専門家に質問してみよう