通貨型はバイト型に変換可能?

このQ&Aのポイント
  • 通貨型(Currency)をバイト型に変換する方法について知りたいです。
  • 構造体に通貨型を含めるとバイトがずれていく現象について解決方法を教えてください。
  • 通貨型を使用せずに構造体にLong型を超えるデータを格納する方法について教えてください。
回答を見る
  • ベストアンサー

通貨型はバイト型に変換可能?

構造体に入っている通貨型(Currency)をバイト型に変換したいのですが 思ったように変換されません。 どのように変換すればよいのでしょうか? -------------------- 通貨型を含まない場合 -------------------- Type tpSample nint1 As Integer ' 2バイト nInt2 As Integer ' 2バイト End Type Sub Main() Dim LudtpSample As tpSample Dim LbyteBuff(100) As Byte With LudtpSample .nint1 = 1 .nInt2 = 1 End With ' バイト配列にコピー Call CopyMemory(ByVal VarPtr(LbyteBuff(0)), LudtpSample, Len(LudtpSample)) End Sub [LbyteBuffの中身] LbyteBuff(0) = 1 LbyteBuff(1) = 0 LbyteBuff(2) = 1 LbyteBuff(3) = 0 -------------------- 通貨型を含む場合 -------------------- ' 構造体に通貨型を追加 Type tpSample nint1 As Integer ' 2バイト cCur As Currency ' 8バイト? nInt2 As Integer ' 2バイト End Type Sub Main() Dim LudtpSample As tpSample Dim LbyteBuff(100) As Byte With LudtpSample .nint1 = 1 .cCur = 1 .nInt2 = 1 End With ' バイト配列にコピー Call CopyMemory(ByVal VarPtr(LbyteBuff(0)), LudtpSample, Len(LudtpSample)) End Sub [LbyteBuffの中身] LbyteBuff(0) = 1 LbyteBuff(1) = 0 LbyteBuff(2) = 0 LbyteBuff(3) = 0 LbyteBuff(4) = 16 LbyteBuff(5) = 39 LbyteBuff(6) = 0 LbyteBuff(7) = 0 LbyteBuff(8) = 0 LbyteBuff(9) = 0 LbyteBuff(10) = 0 LbyteBuff(11) = 0 LbyteBuff(12) = 0 LbyteBuff(13) = 0 通貨型を構造体に含めるとバイトがずれていきます。 通貨型はバイト型に変換不可能なのでしょうか? その場合、構造体にLong型を超えるデータを格納したい場合、通貨型(Currency)を使用する以外の方法がありますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

> バイト配列にコピー LenはLenB を使うべし。 >通貨型を構造体に含めるとバイトがずれていきます。 ずれる原因はInteger型を使っているから。 APIに渡す構造体は4の倍数バイトの変数を使用するべし。 IntegerはLongを使うべし。

iimm0814
質問者

お礼

通貨型が悪いわけじゃなかったんですね。 ありがとうございます。早速試してみます。

iimm0814
質問者

補足

追加で質問させていただきます。 CopyMemoryを使用する場合、4の倍数の変数を使うとはString型などは使用できないということでしょうか?

関連するQ&A

  • Currency (通貨型)に関して教えてください

    Currency (通貨型)に関して教えてください。(VB5です) Private Sub Command1_Click() Dim a As Currency a = 222222 For i = 1 To a Next i End Sub 上のコードではFor文が一度も実行されずに終わってしまいます。 Private Sub Command1_Click() Dim a As Currency a = 22222 For i = 1 To a Next i End Sub これだとちゃんとiが22222まで実行されます。 一体どうしてでしょうか。 よろしくお願いします。

  • 単純【エクセルVBA】なぜオーバーフローになる?

    環境 Excel2003 Win7 64bit -------------- Const C as Currency = 50000000 Sub Test()   Dim A as Currency   Dim B as Currency   B = 6823695200   A = B \ C '←ここでオーバーフロー End Sub --------------- 「A = B \ C」 ↑この式はオーバーフロー時、ウォッチ式上では、 型: Integer と表示されますが、これも不思議。 また、「A = B \ C」を、 A = CCur(B) \ CCur(C) としても、オーバーフロー。 それと、 「Const C as Currency = 50000000」を、 「Const C = 50000000」 としても、同様にオーバーフロー。 Currency型は、 -922,337,203,685,477.5808~922,337,203,685,477.5807 のはず。 このオーバーフローは、一体なぜ?

  • InputBox  String型・Variant

    VBAです。 InputBox  String型・Variant型がエラーにならない理由がわかりません。 Sub 日付型() Dim 日 As Date 日 = InputBox("値をいれてください") End Sub Sub 数値型() Dim i As Long i = InputBox("値をいれてください") End Sub Sub 通貨型() Dim 円 As Currency 円 = InputBox("値をいれてください") End Sub Sub String型() Dim a As String a = InputBox("値をいれてください") End Sub Sub Variant型() Dim v As Variant v = InputBox("値をいれてください") End Sub String型・Variant型以外は、 「実行時エラー '13'; 型が一致しません。」になります。 String型・Variant型はならない理由を教えてください。ご回答よろしくお願いします。

  • VBAのシートイベントで教えてください

    シートのN4以下で、既に同じ番号があれば「既に同じ番号があります」 と表示するようにしたく、下のように書きましたが、肝心な部分 の、どのように同じ番号をみつけるようにすのかわかりませんでした。 教えていただけないでしょうか。宜しくお願いします。 Private Sub worksheet_change(ByVal target As Range) Dim 範囲左 As Integer Dim 範囲右 As Integer Dim 範囲上 As Integer 範囲左 = 1 範囲右 = 16 範囲上 = 4 With target 'if '指定した範囲の列Nに既に同じ番号や文字列があれば MsgBox "既に同じ番号があります。" End If End With End Sub

  • 構造体配列

    こんにちわ。VB.NET初心者です。伝授お願いします。 VB6では Type Tpn_Index IdxSu As Integer idx(MAXTPN-1) As Integer End Type と定義できますが、VB.netでは構造体の中の配列部分が定義できません。 どのように書けばよろしいでしょうか? Public Structure Tpn_Index Dim IdxSu As Integer Dim idx() As Integer End Structure 上記の Dim idx() As Integer の部分です 宜しくお願いします

  • Double→Integerへの変換で「意図しない変換を防ぐ」

    'もう一質問。頻繁に考えていたこと Class himajin100000 Shared Sub Main Dim hoge As Integer Dim fuga As Double = 5.5 hoge = System.Convert.ToInt32(5.5) System.Diagnostics.Debug.Print(hoge.ToString) hoge = CType(5.5,Integer) System.Diagnostics.Debug.Print(hoge.ToString) 'という変換を防ぎたいです。 'Double値が5.0など、整数として切りの良い数字のときのみ変換したい 'それ以外はプログラマのミスとしてエラーが検出できるように。 'なお、 'hoge = DirectCast(5.5,Integer) 'とか 'hoge = DirectCast(System.Math.Floor(5.5),Integer) 'はエラーが出ます。 '今まで私は, hoge = Integer.Parse(System.Math.Floor(5.5).ToString) System.Diagnostics.Debug.Print(hoge.ToString) 'という風に書いてきました。 'Integer.Parse((5.5).ToString) System.FormatException '何かString型を介している地点で冗長な気がするので 'もっといい方法・わかりやすい方法等があれば教えてください End Sub End Class

  • 漢数字に変換するプログラム

    入力した数字を漢数字に変換する例題なのですが、回答のサンプルコードは以下になっています。 number = Math.Abs(number)以下のコードの意味が分かりません。詳しく教えていただけませんでしょうか。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim kanji() As String = New String() {"○", "一", "二", "三", "四", "五", "六", "七", "八", "九"} Dim number As Integer Dim kansuji As String = "" Dim sign As String = "" If Integer.TryParse(TextBox1.Text, number) Then If number < 0 Then sign = "-" End If number = Math.Abs(number) Do kansuji = kanji(number Mod 10) & kansuji number \= 10 Loop Until number < 1 Label2.Text = sign & kansuji Else Label2.Text = ("整数を入力してください") End If End Sub End Class

  • AVIから映像を1/60フィールドごとにBMP形式で保存する

    こんにちは。他の質問掲示板にも載せていますが、たくさん の方から情報を頂くため、こちらにも投稿させて頂きます。 現在、VB.net(2008)でAVIファイルから映像を1/60フィールドごとに BMP形式で保存するソフトを作成しています。以前、VB6.0で 同様のソフトを作っていましたが、Vista以降、ソフトがうまく 作動しなくなったので、VB2008での作成を始めました。 いろいろなサイトを検索して、vb2008でAVIから1/30ごとの映像を BMP形式で取り出すところまではできましたが、どうしてもvb2008で 1/30から1/60に分割するところがうまくできません(下記VB6.0の ソース中のプロシジャー「SeparateDIB」)。 そこで、みなさまのお知恵をお借りしたいと思い、投稿させて 頂きました。どうかよろしくお願い致します。 下記、VB6.0のソースです。 Public Sub AVI_to_BMP(ByVal strAVIFileName As String, ByVal strBMPFileName As String, ByVal lngAVIFrameNo As Long, ByVal intSeparateType As Integer) Dim pAVIFile As Long Dim pAVIStream As Long Dim pGetFrameObj As Long Dim pDIB As Long Dim bmpIH As BITMAPINFOHEADER AVIFileInit AVIFileOpen pAVIFile, strAVIFileName, OF_READ, 0& AVIFileGetStream pAVIFile, pAVIStream, streamtypeVIDEO, 0 With bmpIH .biSize = 40 .biWidth = 0 .biHeight = 0 .biPlanes = 1 .biBitCount = 24 .biCompression = 0 .biSizeImage = 0 .biXPelsPerMeter = 0 .biYPelsPerMeter = 0 .biClrUsed = 0 .biClrImportant = 0 End With pGetFrameObj = AVIStreamGetFrameOpen(pAVIStream, bmpIH) pDIB = AVIStreamGetFrame(pGetFrameObj, lngAVIFrameNo) GetPackedDIBPointer pDIB SeparateDIB intSeparateType PutToBMPFile strBMPFileName ErrorOut: AVIStreamGetFrameClose pGetFrameObj AVIStreamRelease pAVIStream AVIFileRelease pAVIFile AVIFileExit wdt(d) = bmpIH.biWidth hgt(d) = bmpIH.biHeight End Sub Public Function AVIFrameMax(strAVIFileName As String) As Long Dim pAVIFile As Long Dim pAVIStream As Long Call AVIFileInit Call AVIFileOpen(pAVIFile, strAVIFileName, OF_READ, 0&) Call AVIFileGetStream(pAVIFile, pAVIStream, streamtypeVIDEO, 0) AVIFrameMax = AVIStreamLength(pAVIStream) - 1 Call AVIStreamRelease(pAVIStream) Call AVIFileRelease(pAVIFile) Call AVIFileExit End Function Private Sub GetPackedDIBPointer(ByRef pDIB As Long) Call CopyMemory(ByVal VarPtr(m_BmpIH.biSize), ByVal pDIB, Len(m_BmpIH)) ReDim m_memBits(0 To m_BmpIH.biSizeImage - 1) Call CopyMemory(m_memBits(0), ByVal pDIB + 40, m_BmpIH.biSizeImage) With m_BmpFH .bftype = "BM" .bfSize = 55 + m_BmpIH.biSizeImage .bfReserved1 = 0& .bfReserved2 = 0& .bfOffBits = 54 End With End Sub Private Sub PutToBMPFile(ByVal strFileName As String) Dim intFileNumber As Integer intFileNumber = FreeFile() Open strFileName For Binary As intFileNumber Put intFileNumber, 1, m_BmpFH Put intFileNumber, Len(m_BmpFH) + 1, m_BmpIH Put intFileNumber, , m_memBits Close intFileNumber End Sub Private Sub SeparateDIB(ByVal intSeparateType As Integer) Dim j As Long Dim k As Long Dim l As Long Select Case intSeparateType Case 0 For j = 0 To m_BmpIH.biHeight - 2 Step 2 k = j * m_BmpIH.biWidth * 3 l = (j + 1) * m_BmpIH.biWidth * 3 Call CopyMemory(m_memBits(l), m_memBits(k), Len(m_memBits(k)) * m_BmpIH.biWidth * 3) Next Case 1 For j = 1 To m_BmpIH.biHeight - 2 Step 2 k = j * m_BmpIH.biWidth * 3 l = (j + 1) * m_BmpIH.biWidth * 3 Call CopyMemory(m_memBits(l), m_memBits(k), Len(m_memBits(k)) * m_BmpIH.biWidth * 3) Next End Select End Sub

  • 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の初心者です。教えてください。 Sub ex() Dim a As Integer Dim b As Integer a = 2 a a, b MsgBox b End Sub Sub a(a As Integer, b As Integer) b = a End Sub 上記のプログラムを実行するとうまくいきません。VBAのプロシージャーと変数って同じ名前を使うとだめなのですか?教えてください。