プロが教える店舗&オフィスのセキュリティ対策術

VBA(Access)でバイナリデータから日付を取得したい。日付は生年月日なのですが、VC++で行っていた作業を今度はVBA(Access)でやる事になり困っています。
<C++>
int n,fd;
char str[805],birthday[20],*p;
fd = open(path, O_RDONLY);
n = read(fd, str, 0x800);
p=&buf[5*16+5+(16*21+6)];
sprintf(birth,"%08d",*((unsigned int*)(p-4)));
上記だと西暦がちゃんと取れます。 例>1990年4月5日だと⇒19900405のように取れます。

<VBA>
VBA(Access)の場合どのように作成すれば良いでしょうか。
Dim b As String * 800
Dim str As String * 20
Open "Path.dat" For Binary As FreeFile
Get # FreeFile, , b

*適当に書いてしまいました。
str = mid$(b,55,8)   '←分からない部分

C++だと分かるのですが、VBAではどのように記述するのでしょうか。
とても雑で見にくいプログラムになっていますが、ご了承ください。
どのようにデータを取得しても化け文字で表示されてしまいます。

宜しくお願いします。

A 回答 (2件)

質問文に掲載されている C のソースでは int は 4 byte のようですが、VBA では Integer は 2 byte なので、4 byte の Long を使用して読み込むことができます。



Dim lngDate As Long
Dim iFileNo As Integer

iFileNo = FreeFile
Open "Path.dat" For Binary As #iFileNo
Seek #iFileNo, 5 * 16 + 5 + (16 * 21 + 6) - 3
Get #iFileNo, , lngDate
Close #iFileNo
Debug.Print lngDate
    • good
    • 0

C言語のchar型は文字列ではなく本当はバイト型なのです。


また、VB,VBAのString型は文字に出来ないバイナリデータを捨ててしまいます。
なので、VBではバイト型の配列に読込みます。

Dim buf(800) As Byte '''ファイルサイズ以上の配列を宣言すること。
Dim p as Long
Dim d as Long
Open "Path.dat" For Binary As FreeFile
Get # FreeFile, , buf
p = 5*16+5+(16*21+6) - 4
d = 16777216*buf(p+3)+65536*buf(p+2)+256*buf(p+1)+buf(p)
Print d

pはデータファイル内の日付データが始まる位置(0から始まるバイト位置)を指定します。
cのソースを参考にしたが、ずれているかも知れません。
dの値がおかしかったら調整してください。

この回答への補足

ご回答ありがとうございます。
Longタイプの"d"の項目がオーバーフローで落ちてしまします。
>d = 16777216*buf(p+3)+65536*buf(p+2)+256*buf(p+1)+buf(p)
上記の計算は何を指しておりますか?

補足日時:2010/06/05 11:54
    • good
    • 0

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