- ベストアンサー
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と帰って来るので 値が入ってないのが悪いとはわかるんですが…。
- tarinko_06
- お礼率71% (179/252)
- Visual Basic
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
間違いないように見えますが、 試しに、下の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
その他の回答 (2)
- pkh4989
- ベストアンサー率62% (162/260)
もしかして、データの書き込み時、データ設定を以下のようにしたのではないのかな~ TEST_DAT = "ABBCCC" →スペースが設定されるので長さチェックでは分からない。 ↓ (正解) Dat.TEST_A = "A" Dat.TEST_B = "BB" Dat.TEST_C = "CCC"
お礼
回答ありがとうございます。 正解どおりにやってたんですが 何故かできませんでした。 色々いじってたのがいけないんでしょうか…。
- imogasi
- ベストアンサー率27% (4737/17068)
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--> ・・・ の順に次々表示されたが。
お礼
回答ありがとうございました。
関連する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 どちらもメッセージを表示させられるのですが コードを書く際はどちらを使った方がいいのでしょうか? 独学のためよくわかりません。 宜しくお願いいたします。
- ベストアンサー
- Visual Basic
- 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
- 締切済み
- Excel(エクセル)
- 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 以上よろしくお願いします。
- ベストアンサー
- Visual Basic
- 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・・・」となり、微妙に誤差が出てしまいます。 小数点を整数にして計算→元の桁数に戻す、という 処理を行うと、誤差なく求めることが出来ましたが、 「もっとスマートなコードにして」と言われてしまいまして どうしたものかと思っております。 この誤差を解決する方法は無いでしょうか?
- ベストアンサー
- Visual Basic
- サブフォームに変数を代入し、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" になってるはずですが。 よろしくお願い致します。
- ベストアンサー
- Visual Basic
お礼
お礼遅くなってすみません。 書いてもらったコードを新しいブックに張ったら問題解決しました! 結局何が原因で読めなかったのかわかりませんでした。 ありがとうございます。