月別: 1月 2014

文字列をまとめて構造体にコピー CopyMemory

投稿日: 更新日:

仕事でAccess VBAでデータを処理するシステムを毎月一つ程度開発しています。

現在は、QRコードから読み込んだデータを処理するのですが、いくつかの情報がつながってスキャナーから取得できるので、分解するのにTypeでユーザー定義してみました。
(固定長の1レコードのテキストのようにスキャナーで取得できました。)

構造体というらしいですが、初めて使いました。
フォームにスキャナからのデータを入力するテキストボックスを設置して、更新後処理で分解して、各コードのテキストボックスにセットしようとしました。
しかし、ユーザー定義型にした変数には、テキストボックスの値は直接は転送できませんでした。
構造体の中の項目一つずつに対して代入しないといけないようです。

W_TP_QR.HINNO = Mid(Me!TXT_SCAN01,1,7)
W_TP_QR.HINMEI = Mid(Me!TXT_SCAN01,8,25)

項目も

Public Type TP_QR
HINNO As String * 7
HINMEI As String * 25
End Type

とかして、項目の長さ指定したのが無駄に。

ネットでいろいろ調べました。
そしたら、Windows API を使えばいいことがわかりました。

以下を参考にしました。
構造体の内容を変数にコピーする

コピーの方向が逆ですが、なんとかなりました。

気を付けるのは、引数の1つ目は受け取り用構造体。
2つ目は、今回はテキストボックス。
3つ目はテキストボックス内の文字列のバイト数。

使用してるのが、Access2007なので、内部処理はUnicodeです。
LEN使っても、LENB使っても、見た目上正しいようですが、内部でUnicodeなので、各文字が1文字と数えられてました。(実際は、Unicodeなので各文字は2Byte使ってます。)
StrConvでvbFromUnicodeしてからLENBしてもだめでした。
なのでCopyMemoryの結果が半分しかできてない。
仕方ないので、* 2しました(^_^.)

引数はすべてByValで値渡しにしました。
引数の2つ目は、StrPtrで囲みました。

これでなんとか、文字列を構造体にセットできました。
各項目でテキストボックスにセットして、確認できました。

標準モジュールの頭で、

'API定義
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

'ユーザー定義型
Public Type TP_QR
  HINNO As String * 7
  HINMEI As String * 25
End Type

'パブリック変数定義
Public W_TP_QR As TP_QR

プロシージャの中で、

'文字列のバイト数取得

Dim W_LENB As Long



W_LENB = LenB(StrConv(Me!TXT_SCAN01,VbFromUnicode))



'構造体に文字列コピー

Call CopyMemory(ByVal W_TP_QR, ByVal StrPtr(Me!TXT_SCAN01), ByVal W_LENB * 2)



Me!TXT_HINNO = W_TP_QR.HINNO

とかやってたかと思います。

ソースとか持ち出せないので、記憶で書いてますので間違いあるかも。

LenBは結局意味なかったかも。

素直にLENで文字列長取得して* 2でもいいかも。

今回は、半角英数しかなかったのでこれでいいんですが。

2013年のまとめ

投稿日:

WordPress.com 統計チームは、2013年のあなたのブログの年間まとめレポートを用意しました。

概要はこちらです。

シドニーにあるオペラハウスのコンサートホールには2,700人が収容できます。2013年にこのブログは約9,900回表示されました。オペラハウスのコンサート4回分になります。

レポートをすべて見るにはクリックしてください。