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ではどのように記述するのでしょうか。
とても雑で見にくいプログラムになっていますが、ご了承ください。
どのようにデータを取得しても化け文字で表示されてしまいます。
宜しくお願いします。
No.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
No.1
- 回答日時:
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)
上記の計算は何を指しておりますか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Excel(エクセル) エクセルVBA、ファイル名をセルの値で保存の方法を教えてください。 おそれいります。こちらで数々のエ 6 2023/06/30 22:17
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Android VBA、フォルダのパスに環境文字 ㉑ があり、VBAが機能しません。 2 2022/07/27 09:16
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) 【VBA】先月分の取得ができない理由が分かりません。 2 2022/04/24 11:16
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) Excel VBA でデータ転記について 1 2023/03/07 19:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムによく出てくるst...
-
nullと""、\\0とEOFの違いにつ...
-
C#でstringをポインタとして渡す
-
バイナリファイル中の日本語文...
-
C++で文字列の右端から特定の文...
-
Shift_JIS(16進)を文字に変換す...
-
数字の入った配列をファイルへ...
-
WSH(VBS)でJSONの文字列を読み...
-
char型配列の最大要素数
-
VBを2008を用いてCSVを取り込む...
-
%dなどの違い
-
関数から配列を返すには?
-
init関数の意味
-
C言語 配列の長さの上限
-
long型のデータをバイト型の配...
-
配列の要素数に変数を入れたい...
-
セグメントエラー
-
配列を使わずに、変数名を動的...
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C++で入力した文字列から数字を...
-
nullと""、\\0とEOFの違いにつ...
-
プログラムによく出てくるst...
-
%dなどの違い
-
WSH(VBS)でJSONの文字列を読み...
-
TCL言語で文字列検索方法を教え...
-
C#でstringをポインタとして渡す
-
16進数を2文字ずつ配列に格納し...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
C++で文字列の右端から特定の文...
-
シリアル通信で0x00を送信した...
-
VBA-DLLの引数受け渡しについて
-
数字の入った配列をファイルへ...
-
c#で他のアプリの文字入力フォ...
-
構造体→文字列→構造体 をする方法
-
Shift_JIS(16進)を文字に変換す...
-
バイナリファイル中の日本語文...
-
C言語の課題で困っています;
-
[C++]WCHARの1文字目しか表示で...
-
VB6.0でのバイナリデータの扱い...
おすすめ情報