VBA(Access)でバイナリデータから生年月日を取得!

このQ&Aのポイント
  • VBA(Access)でバイナリデータから生年月日を取得する方法が知りたいです。
  • C++で行っていた作業をVBA(Access)で行う必要があり困っています。具体的なコード例も教えてください。
  • データを取得しても化け文字で表示され、どのように処理すればいいかわかりません。アドバイスをお願いします。
回答を見る
  • ベストアンサー

VBA(Access)でバイナリデータから日付を取得したい。日付は生年

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

その他の回答 (1)

回答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の値がおかしかったら調整してください。

r32yokoyok
質問者

補足

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

関連するQ&A

  • VBA での日付の計算

    お世話になってます。 Access VBA 初心者です。 string型変数に日付(YYYYMMDD)がセットされています。 その日付に1日プラスした日付を算出したいのですが、 どうすればよいのかよく分かりません。 たとえば Dim w_Date As String w_Date = "20070726" としたならば、 w_Dateは"20070727"となるようにしたいのですが。。。 よろしくお願いいたします。

  • access 日付名でバックアップ

    accessでファイルをコピーして日付の名前をつけて保存したいのですがうまくいきません。 ------------------------------------------------------ Dim objFSO As FileSystemObject Dim str元ファイル As String Dim str新ファイル As String Set objFSO = CreateObject("Scripting.FileSystemObject") str元ファイル = "C:\sample.mdb" str新ファイル = "C:\format(date(),"yymmdd").mdb" objFSO.copyFile str元ファイル, str新ファイル, True Set objFSO = Nothing ------------------------------------------------------- どうも新ファイル名の指定の仕方が悪いようですがどこを直していいかわかりません。 どなたか教えてください。

  • Access VBA コントロール 型違い

    Access VBAについてお尋ねいたします。 VBAの標準モジュールからフォームに設置したコントロールを変更したいのですが、型違いというエラーが発生しました。どのように修正すればよろしいでしょうか? Dim Fname As Form:Dim str As String Set Fname = Forms!F99_メイン str = "Toggle_201" Forms(Fname).Controls(str).Visible = False という記述

  • VBAでバイナリエディタを作ろうとしています

    テキストファイルを内部でバイナリとして開いて 16進数のダンプファイルとして新たなテキストに保存することはできたのですが 逆がどうしてもできません。 やり方としては、 03 E3 BD 71 80… のようなテキストデータをバイナリにして16進数にして保存したテキストファイルをダイアログから呼び出してもう一度元のテキスト文章に戻すという作業です。 とりあえず、まずは以下のコードでエクセル内で16進数を元の文章データに変換しようとしています。 Sub binaryToText() Dim fname As String Dim str() As Byte Dim row As Integer row = 1 fname = "Test.txt" '16進数ファイル Open fname For Binary As #1 Do Until EOF(1) ReDim Preserve str(row) Get #1, , str(row) row = row + 1 Loop Close #1 End Sub hex関数やchr関数を使う必要があるのでしょうか? VBAは始めたばかりで根本的なところで間違っているかもしれませんがよろしくお願いします。

  • VBAでバイナリデータが上手く読めない。

    VBAでバイナリデータが上手く読めない。 もともとC言語でバイナリデータを加工していた事をVBAでやる事になったのですが、上手く読めない。 <VBA> Open inputFileName For Binary As #mFileNo のようにオープンして、 <VBA> Dim a(800) As Byte Get #1, , a のように記述すればC言語のように取得出来ると思ったのですが、上手く取得出来ません。 なんとなく分かった事ですが、800バイトの中に改行文字があった場合、そこまでを変数aに入れるようにすると出来そうなので、Getで改行コードがあった場合はそこまでを読み込むみたいな手段はありますでしょうか。inputだとデータがまったく見れませんでしたのでGetにて対応したいと思っています。 宜しくお願い致します。

  • テキストファイルへの書き出し

    ExcelVBAについて教えてください。 Dim path As String Dim FullPath As String Path ="C:\" Dim FN As String FN ="abc.txt" Dim intFF As Integer intFF = FreeFile FullPath = Path & "\" & FN Open FullPath For Output As #intFF Print #intFF, FullPath Close #intFF とやると、Open FullPathのところで、実行時エラー 76、パスが見つかりませんと表示されてしまいます。 やりたいことは、Excel VBAでテキストファイルを新規につくり、そこへ書き出し、保存したいです。ファイル名はFullPathで指定したファイル名を新規で作り出し、それに対して書き出し、保存をしたいです。 何が間違っているのでこのようなエラーが表示されてしまうのでしょうか?回避方法がありましたらご教授お願いいたします。

  • ActiveBasic 動画の画面のサイズを取得したい(Fieldの使い方)

    お世話になっています。 今回、動画の画面のサイズを取得したく、方法を探していたところ、 以下のようなページを見つけました。 http://tokyo.cool.ne.jp/kanain/APIHTM/AVI_Size.html しかし、Fieldのところで詰まってしまい、先へ進めません・・・ #N88BASIC Dim path As String Dim str As String Dim width As Double Dim height As Double Input"動画ファイルへのパス:",path Open path As #1 Field #1,3 Get #1,65,str Close #1 とりあえず、ここまで書きましたが、 数値が返ってきません・・・ (mpgで実験しました) やり方をご存知の方、お手数ですがご教授いただければ幸いです。 AB 4.23.00 Win XP

  • Accessの入力データをWordへ取り込む

    Accessに入力したデータをWordにとりだしているのですが,Wordを立ち上げるまでにとても時間がかかります。 Dim woApp As Word.Application Dim woDoc As Word.Document Dim strPath As String 'ファイルのパス Dim strTXT As String 'フィールドデータ strPath = Application.CurrentProject.Path 'Current Path Set woApp = CreateObject("Word.Application") Set woDoc = woApp.Documents.Open(strPath & "\" & “ファイル名”) 'TemplateとなるWORDファイル woApp.Visible = False として,テンプレートとして前もって作ってあるWordファイルを開き,バックグラウンドでAccessのデータをWordへ貼り付けていっています。 この(Set woDoc = woApp.Documents.Open(strPath & "\" & “ファイル名”)の部分がとても時間がかかってしまいます。 他のアプリケーションを立ち上げるのにはどうしても時間がかかってしまうのかもしれませんが,少しでも早くする方法はないでしょうか? 宜しくお願いいたします。

  • Excel VBAの文字列と数値の分類

    txtファイルで取り込んだ2行にまたがっている数値・英文字・ひらがななどを、数値だけのtxtファイルとそれ以外のtxtファイルを別々に作成し、保存するプログラムを組みたいのですが、よく分かりません。 ちなみに、使っているOSとAPはWinXP、Excel2003です。 InputData.txtの内容 A34bFg7p0 あ 1ylut890 B45LK4L え Number.txtの完成形 34701890454 String.txtの完成形 AbFgp あ ylutBLKL え '変数の宣言 Dim myFile As String Dim CC As Integer Dim XX As Integer Dim WW As Variant Dim str As String Dim tempStr As String Dim B As String Dim C As String myFile = Dir("InputData.txt") 'ファイルの読み込み If myFile = "InputData.txt" Then Open myFile For Input As #1 Do While Not EOF(1) Input #1, myText Loop '書き込みファイルの作成 Open "Number.txt" For Output As #2 Open "String.txt" For Output As #3 '数字・文字列の分類 CC = Len(myFile) For XX = 1 To CC str = Mid(myFile, XX, 1) If str >= 0 And str <= 9 Then B = B & str Else C = C & str End If Next Print #2, B Print #3, C Close #1, #2, #3 'エラーメッセージの表示 Else MsgBox "ファイルは存在しません。" End If ここまでやっている状態です。よろしくお願いします。

  • ExcelからVBAを使ってAccess2007のデータをコピーしたいのですが、うまくできません

    Access2000のDBをAccess2007に移行しましたが、Excel2007からAccessのDBを呼び出す事ができなくなりました。 DBを呼び出す方法はExcelからVBAでDBに接続し、オブジェクトを開く方法をとっていました。 AccessのDBの拡張子が○○.mdbならば接続できますが、○○.accdbになると接続できません。 VBAをDAOからADOに変更してみましたが、やはり、だめでした。 何かいい方法はないでしょうか。 お忙しいところ、申し訳ございませんが、何卒、よろしくお願い致します。 ちなみに下記のようなVBAを組んでいます。 Dim objDB As New ADODB.Connection Dim rcsTQ As New ADODB.Recordset Dim DBname Dim TQname Dim dbCol As Integer Dim rf As Field DBname = "\データの整理1.accdb" 'パス名とデータベース名を指定する。 TQname = "T受付データ" 'テーブル名、クエリー名を指定する。 'データベースに接続する objDB.Open _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & ThisWorkbook.Path & DBname 'テーブル、クエリを開く rcsTQ.Open TQname, objDB '書き出しをする Range("a10").Value = "テスト書き出し" dbCol = 0 For Each rf In rcsTQ.Fields dbCol = dbCol + 1 Cells(11, dbCol).Value = rf.Name Next rf Range("a12").CopyFromRecordset rcsTQ objDB.Close Set objDB = Nothing End Sub

専門家に質問してみよう