• ベストアンサー

DATファイルが読めません(VB・VBA)

DATの読書きをしなくちゃいけない事になって 元のコードを元に書き出す事はできたのですが 読込みができなくて困っています。構造体の中に値を入れてるんですが msgboxで値を表示しても、空白しか返ってきません。 ネットでも検索してみたんですが、どこがおかしいの分からなくてお手上げです。 どなたか宜しければおかしい所を教えて下さい。 Type TEST_DAT  TEST_A as string * 1  TEST_B as string * 2  TEST_C as string * 3 End Type Sub a ()  Dim Dat as TEST_DAT  Dim Fn as integer  Fn = FreeFile  Open ThisWorkbook.path & "\Test.dat" For Random as #Fn Len = 6  Get #Fn , , Dat  Msgbox Dat.TEST_A  Msgbox Dat.TEST_B  Msgbox Dat.TEST_C  Close #Fn  End Sub Datファイルの方には、上の構造体を使ってPut #Fn,,Dat の様に書いて1行出力した物をそのまま使っています。 なので、データが無いって事はありません。 元のコードとネットで調べはしたのですが、上で問題無い様な気がして おかしい場所がさっぱりわかりません。エラー等は一切返ってきてません。 Msgbox Len(Dat.TEST_A)の様にすると1,2,3と帰って来るので 値が入ってないのが悪いとはわかるんですが…。

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

  • ベストアンサー
回答No.1

間違いないように見えますが、 試しに、下のtest()を動かすとどうなりますか。 sub a() はなにも変更していません。 Type TEST_DAT TEST_A As String * 1 TEST_B As String * 2 TEST_C As String * 3 End Type Sub test() Call b Call a End Sub Sub a() Dim Dat As TEST_DAT Dim Fn As Integer Fn = FreeFile Open ThisWorkbook.Path & "\Test.dat" For Random As #Fn Len = 6 Get #Fn, , Dat MsgBox Dat.TEST_A MsgBox Dat.TEST_B MsgBox Dat.TEST_C Close #Fn End Sub Sub b() Dim Dat As TEST_DAT Dim Fn As Integer Dat.TEST_A = "A" Dat.TEST_B = "BB" Dat.TEST_C = "CCC" Fn = FreeFile Open ThisWorkbook.Path & "\Test.dat" For Random As #Fn Len = 6 Put #Fn, , Dat Close #Fn End Sub

tarinko_06
質問者

お礼

お礼遅くなってすみません。 書いてもらったコードを新しいブックに張ったら問題解決しました! 結局何が原因で読めなかったのかわかりませんでした。 ありがとうございます。

その他の回答 (2)

  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.3

もしかして、データの書き込み時、データ設定を以下のようにしたのではないのかな~ TEST_DAT = "ABBCCC" →スペースが設定されるので長さチェックでは分からない。 ↓ (正解) Dat.TEST_A = "A" Dat.TEST_B = "BB" Dat.TEST_C = "CCC"

tarinko_06
質問者

お礼

回答ありがとうございます。 正解どおりにやってたんですが 何故かできませんでした。 色々いじってたのがいけないんでしょうか…。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

Getは昔のBasic時代には良く使ったが、最近あまりVBAなどでは使わないので、十分の知識は無いが、 (用意) メモ帳で axyyyzbzwwwqcuwwwrdwrrrt を打ち込み、test.datで保存。 ーーー (VBA) エクセルVBAで、標準モジュールに Sub a() Dim Dat As TEST_DAT Dim Fn As Integer Fn = FreeFile MsgBox ThisWorkbook.Path Open ThisWorkbook.Path & "\Test.dat" For Random As #Fn Len = 6 MsgBox LOF(1) For i = 1 To LOF(1) / 6 Get #Fn, i, Dat MsgBox Dat.TEST_A MsgBox Dat.TEST_B MsgBox Dat.TEST_C Next i Close #Fn End Sub と入れて、Book.xlsで保存(名前は何でも可)。 保存してからで無いと(新規作成中に実行してみると)、MsgBox ThisWorkbook.Pathが空白になって出るから注意。 実行する。 (結果) a ー->xy--> yyz--> b -->zw -->wwq--> ・・・ の順に次々表示されたが。

tarinko_06
質問者

お礼

回答ありがとうございました。

関連するQ&A

  • 【1】と【2】のvbaは同じ意味ですか?

    【1】 Option Explicit Sub test1() Call test2("aaa") End Sub Sub test2(MyStr As String) MsgBox MyStr End Sub 【2】 Option Explicit Dim MyStr As String Sub test1() MyStr = "aaa" Call test2 End Sub Sub test2() MsgBox MyStr End Sub 結果は同じですが、中身が違います。 今後コードを作っていく上で どちらの方式の方が良いのでしょうか?

  • Const に dim は使えない?

    標準モジュールに ''''''''''''''''''''''''''''''''''''''''''' Dim Const moji As String = "a" Sub test1() MsgBox moji End Sub Sub test2() Dim Const moji As String = "a" MsgBox moji End Sub ''''''''''''''''''''''''''''''''''''''''''' とするとエラーになりますが ''''''''''''''''''''''''''''''''''''''''''' Public Const moji As String = "a" Sub test3() MsgBox moji End Sub ''''''''''''''''''''''''''''''''''''''''''' なら大丈夫です。 Const に対してdimは使えないのでしょうか?

  • 二つの違い・どちらを使った方がいいでしょうか?

    Sub test1() Dim a As String a = MsgBox("aaa") End Sub Sub test2() MsgBox "aaa" End Sub どちらもメッセージを表示させられるのですが コードを書く際はどちらを使った方がいいのでしょうか? 独学のためよくわかりません。 宜しくお願いいたします。

  • VBA LENの使い方

    Lenを使う際にStrings.Lenとしないとエラーとなる場合があります。 Lenを使う際にクラスを明記すればいいんだと理解しましたが、別の問題が発生しました。 ユーザー定義のバイト数を求めるときにStringsをつけるとエラーになります。(いかにエラーになるコードを記載しました。) (LenはLenBとしてもエラーになります) そもそも、 クラスを明記しないとLenが探せない場合があってエラーになると思っていましたが、違うのでしょうか? オブジェクトブラウザでLenを検索してもVBAのStringしか出てきません。 Type a aa As Integer bb As Integer End Type Dim b As a Sub test() Dim a As Integer b.aa = 100 a = Strings.Len(b) End Sub

  • Excel2007VBA時間の書式とLen関数

    ●質問の主旨 文字列の長さを返すLen関数の引数に 時間を設定すると戻り値が一定しないのはなぜでしょうか? また下記に示すように20や17などの数字がかえってくるの でしょうか? ●質問の補足 A1セルに入力されている時間が以下の通りだとします。 例1)1:11→20 例2)13:59→17 ●コード Sub test() Dim i as String i=Range("A1") Msgbox Len(i) End Sub 以上よろしくお願いします。

  • vbaでCountIf関数を使いたい(エクセル)

    A1セルにa-a-aがはいっています。 この場合aは3つですよね。 これをvbaで取得するコードを作っているのですがうまくできません。 Sub test() Dim myStr As String myStr = "a" MsgBox WorksheetFunction.CountIf(Cells(1, 1), "*" & myStr & "*") End Sub これをすると、なぜか1が返ってきます。 Aは3つあるのになぜ1が返るのでしょうか? A1にaaaaaを入れて実行しても1が返ります。

  • VB6.0での小数点の扱いについて

    現在、VB6.0を使用しており、小数点の扱いに困っています。 Sub Keisan() Dim A As String Dim B As String Dim C As String A = 1.29033 B = 1.91458 C = CStr(A + CDec((B - A) / 6) * 3) MsgBox C End Sub 上記のプログラムを実行すると、 「1.602455000000001」と表示されますが、 電卓を用いて計算すると、 「1.602454998・・・」となり、微妙に誤差が出てしまいます。 小数点を整数にして計算→元の桁数に戻す、という 処理を行うと、誤差なく求めることが出来ましたが、 「もっとスマートなコードにして」と言われてしまいまして どうしたものかと思っております。 この誤差を解決する方法は無いでしょうか?

  • サブフォームに変数を代入し、RecordSourceの値を取得したい

    サブフォームに変数を代入し、RecordSourceの値を取得したいのですがうまくいきません。 Sub test1() Dim サブフォーム As String Dim フォーム As String フォーム= "土台" サブフォーム = "フォーム1" MsgBox Form_フォーム1.RecordSource End Sub ******************************************************************* Sub test2() Dim サブフォーム As String Dim フォーム As String フォーム= "土台" サブフォーム = "フォーム1" MsgBox Form_フォーム1.RecordSource MsgBox Forms(フォーム).Controls(サブフォーム).RecordSource End Sub オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438) ******************************************************************* Sub test3() Dim サブフォーム As String Dim フォーム As String フォーム = "土台" サブフォーム = "フォーム1" MsgBox Forms(サブフォーム).RecordSource End Sub 実行時エラー'2450' マクロの式またはVisual Basic コート゛で参照されている 'フォーム名'フォームが見つかりません。 ******************************************************************* test1~3のうち test1のみはうまくいくのですが 変数を代入したいです。 ヘルフ゜のには Forms![受注]![受注サブフォーム].Formとなってますが これじゃ変数を代入できないですよね。 どうすればサブフォームに変数を代入しつつ、RecordSourceの値を取得できるのでしょうか? よろしくお願いします。

  • 「Xor」と「Or」の違い(vba)

    こんばんは。 よくわからないので教えてください。 Option Explicit Sub Xorのtest() Dim フルーツ As String フルーツ = "りんご" If フルーツ = "りんご" Xor フルーツ = "イチゴ" Then MsgBox フルーツ End If End Sub '**************************************** Sub Orのtest() Dim フルーツ As String フルーツ = "りんご" If フルーツ = "りんご" Or フルーツ = "イチゴ" Then MsgBox フルーツ End If End Sub 上記のコードなのですが どちらも結果は同じです。 「Xor」と「Or」の違いがよくわからないのですが 何が違うのでしょうか? 調べてみると「Xor」は「排他的理論和」だそうです。 よろしくお願いします。

  • VBAについて質問させて下さい。

    VBAについて質問させて下さい。 Sub Exsample() Dim a As String a = "aaa" MsgBox Ketugou(a) End Sub Function Ketugou(x As String) Ketugou = x End Function このサンプルコードについて質問が2つあります。 【質問1】 なぜ x=a、 と言う式はないのに xにが代入されるのでしょうか? 【質問2】 なぜ MsgBox Ketugou(a) では aaa(aaa) とならないのでしょうか? a = "aaa" Ketugou= "aaa" になってるはずですが。 よろしくお願い致します。

専門家に質問してみよう