Private Sub mnuFileOpen_Click()
Dim sdata As String 'データ読み込み用
Dim yn As VbMsgBoxResult 'メッセージボックス用
Dim FileNum As Integer
FileNum = FreeFile
Dim s
Dim t
Dim r
'保存の確認と保存処理
If Henkou = True Then 'データに変更あり?
yn = MsgBox("まだ保存されていません。保存しますか。", vbYesNo, "保存確認")
If yn = vbYes Then
FileSave '保存の処理を呼び出す
End If
End If
'開くファイル名選択
On Error GoTo Err 'エラーが発生したらErrへ処理を移す
CommonDialog1.ShowOpen '開くのダイアログを表示
CommonDialog1.Filter = "DXF(*.dxf)|*.dxf|すべてのファイル(*.*)|*.*"
Filename = CommonDialog1.Filename 'ファイル名を設定
RichTextBox1.Text = "" 'テキストを消去
'データを読み込む (c)
Open Filename For Input As #FileNum 'ファイルを開く
Do
If EOF(FileNum) Then 'ファイルの終わり?
Exit Do 'Do-Loopを抜け出す
End If
Line Input #FileNum, sdata 'データを1行(改行まで)読み込む
r = r & sdata & vbCrLf
s = InStr(r, "ENTITIES")
RichTextBox1.Text = Mid$(r, s)
Loop
Close #FileNum 'ファイルを閉じる
Henkou = False '変更なし
Exit Sub 'プロシージャを抜け出す
Err:
MsgBox "ファイルが開けませんでした。"
End Sub
とプログラムをうったのですがmid$のところでエラーがおきます
sではなくて数字を入れたら普通に表示されるのですが・・・
いったいなにがいけないんでしょうか?
(´Д`;)<メモ帳にコピペしても見づらかったゾ…
@mnuってメニューのサフィックスだったのか。
で、肝心の「質問」ですが、
これは単純な「デバックしてください」というお願いに帰着されます。
が、一応ヒント。
・エラーが起こったときのsの値は-1ではありませんか?
→MSDNを探し回ったりして、例外の起こる可能性を全て捜査しましょう。
→貴方が「トラップされると思っているエラー」は「ファイルが開けない」だけらしいですが、
本当にそれだけですか?と言うことです。
ぁ…良く見ると
> s = InStr(r, "ENTITIES")
となっているけど…InStrの引数ってさ…
※InStr([Start], [String1], [String2], [Compare As VbCompareMethod = vbBinaryCompare])
じゃないか…モウ馬犬 目 ぽ..._〆(゜▽゜*)
※ちゃんとヘルプ見ながら作(ry
》蚊さん
> mid$のところでエラーがおきます
エラーが起きるのは、指定した変数の値に問題があるからです。
VBのメニューから [表示]-[ローカルウィンドウ]や
[表示]-[イミディエイト ウィンドウ]などを呼び出して、
エラー発生時に、Mid$関数にどのような値を
渡しているのかを確認してみましょう。
たとえば、変数 r に "ENTITIES" という文字列が含まれる場合と、
含まれない場合とで、どのように結果が変わってくるのかを
調べてみてください。
> FileNum = FreeFile
FreeFile()関数の呼び出しは、『Openステートメントの直前』で
行うように心がけましょう。
たとえば、複数ファイルを同時に開く場合などは、
F1 = FreeFile()
F2 = FreeFile()
Open FilePath1 For Input As #F1
Open FilePath2 For Inout As #F2
のようにするのではなく、FreeFile()関数の呼び出しを
F1 = FreeFile()
Open FilePath1 For Input As #F1
F2 = FreeFile()
Open FilePath2 For Inout As #F2
のように、『それぞれのOpenステートメントの直前』で利用して
あげないと、エラーになってしまいますよね。
> Dim s
> Dim t
> Dim r
変数を宣言する際には、必ず「As データ型」を付けるようにしましょう。
》ガッさん
> となっているけど…InStrの引数ってさ…
InStrの引数指定には、下記の3パターンがあります。
今回の場合は、パターン1 の使い方ですね。
1 : InStr(元の文字列, 検索する文字列)
2 : InStr(検索開始位置, 元の文字列, 検索する文字列)
3 : InStr(検索開始位置, 元の文字列, 検索する文字列, 検索モード)
> 魔界の仮面弁士さん
> InStrの引数指定には、下記の3パターンがあります。
> 今回の場合は、パターン1 の使い方ですね。
>
> 1 : InStr(元の文字列, 検索する文字列)
> 2 : InStr(検索開始位置, 元の文字列, 検索する文字列)
> 3 : InStr(検索開始位置, 元の文字列, 検索する文字列, 検索モード)
情けないですが初めて知りました(orz
情報ありがとうございます。
※MSDNに軽く載っていました。
…というかこのメソッドだけちょっと特殊…?
ともかく、どうもありがとうございました(_ _
エラーの解決策は他の方々が書いてくださっているので、問題ないと思う
という訳で、オレは中身に関して少々
もし、ファイルの中身に"ENTITIES"という文字列が複数あるような仕様であるとすると、1回目の発見で処理が終了してしまうがよろしいだろうか?
もし、複数回同じような処理をしたいでのあれば、次のワードで調べてみるといいかもしれない
・Split
・UBound()
みなさんありがとうございます。やってみます。
私も突っ込みをすこし。。。。。
>Do
> If EOF(FileNum) Then 'ファイルの終わり?
> Exit Do 'Do-Loopを抜け出す
> End If
> Line Input #FileNum, sdata 'データを1行(改行まで)読み込む
これは普通
Do While Not EOF(FileNum)
Line Input #FileNum, sdata
........
Loop
こうじゃない。
コメントが適切でない。
>Exit Sub 'プロシージャを抜け出す
こんなコメントは要らない。
>s = InStr(r, "ENTITIES")
>RichTextBox1.Text = Mid$(r, s)
ここになぜコメントが無いの?
>ENTITIES
ってもしかして、
ENTITLES
のこと。。。orz
》ねろさん
> Do While Not EOF(FileNum)
私なら、Do Until EOF(FileNum) と書くかな……。
いずれにしても、
Do
If 脱出条件 Then
Exit Do
End If
処理
Loop
という書き方は、あまり一般的ではありません。>蚊さん
ねろさんが書かれたように、
Do While 継続条件
処理
Loop
または、
Do Until 終了条件
処理
Loop
という書き方の方が一般的かと思います。
ただし、
Do
前処理
If 脱出条件 Then
Exit Do
End If
後処理
Loop
のような使い方であれば、さほど珍しくもありませんけれどね。
>> ENTITIES
> ってもしかして、
> ENTITLES
何故? ENTITIES(エンティティ)で良いのでは? (^_^;)
蚊さんが操作しているのは、Data eXchange Format File(*.DXF)ですよ。
# ちなみに、entity/entities には、「実体」という意味があります。
[R14 DXF Reference]
http://www.autodesk.com/techpubs/autocad/acadr14/dxf/
[DXF ENTITIES Section]
http://www.autodesk.com/techpubs/autocad/acadr14/dxf/entities_section_al_u05_c.htm
>何故? ENTITIES(エンティティ)で良いのでは? (^_^;)
なるほど、これは失礼しました。orz
失礼します、勝手に私の観点を言います。
>> s = InStr(r, "ENTITIES")
>> RichTextBox1.Text = Mid$(r, s)
もし、rは検索文字列に探し当てていないならば、取得したS値は0になっている。
Mid$(String,Start as Long,[Length])関数ですが、第二引数は1から使っていいです、0だならば、エラーを出たと思っています。
と言うことです
魔界の仮面弁士さんの言ってくれたようにローカルウィンドウで調べたらsの値は0になってます>ガッさん (↓のやり方だと)
r = r & sdata & vbCrLf
s = InStr(r, "ENTITIES")
RichTextBox1.Text = Mid$(r, s)
そこで以下のように試したりしました
↓
text1.text=instr(r,"ENTITIES")
と打てば4590がでるのでて、その下で
RichTextBox1.text=Mid$(r,4590)とか打ちました。
そしたら、4590番目の文字列がでました。
でも、(r,4590)ところの4590に(text1.text)を入れた場合はtext1.textの値は0になってファイルを開くことはできませんでした。
>text1.text=instr(r,"ENTITIES")
>と打てば4590がでるのでて、その下で
>RichTextBox1.text=Mid$(r,4590)とか打ちました。
>そしたら、4590番目の文字列がでました。
>でも、(r,4590)ところの4590に(text1.text)を入れた場合は
>text1.textの値は0になってファイルを開くことはできませんでした
すみません。意味がわからなかったです。
text1.text=instr(r,"ENTITIES")
としたら数値が出るのに
text1.text=instr(r,"ENTITIES")
RichTextBox1.text=Mid$(r,text1.text)
としたら出ないってことですか??
はい>ぶぶ
はい>ぶぶさん
>text1.text=instr(r,"ENTITIES")
として数値が出た時のrと
>text1.text=instr(r,"ENTITIES")
>RichTextBox1.text=Mid$(r,text1.text)
とした時のrは確かに同じ内容が設定されているのでしょうか?
debug.print でイミディエイトに出力して確かめてみて下さい。
同じ内容が入っているとすると、なんででしょうね??
FREEFILEやwhile文などいろいろアドバイスいただき有難う御座いました。LOOPのつける場所がまちがっていました。皆さんにはご迷惑をおかけしました。
あとrichtextbox1.textに表示されている内容を配列にすることってできるんでしょうか?教科書とか読んだんですが、内容が薄くてのってないのですが・・・なにか良い参考資料があれば、どなたか教えていただけませんか?
Dim a() As String
a = Split(RichTextBox1.Text, vbCrLf)
それと、コモンダイアログの使い方も間違っているようですよ。
> CommonDialog1.ShowOpen '開くのダイアログを表示
> CommonDialog1.Filter = "DXF(*.dxf)|*.dxf|すべてのファイル(*.*)|*.*"
ShowOpenしてから Filter をセットするのではなく、
Filter をセットしてから ShowOpenするようにしましょう。
ねろさん魔界の仮面弁護士さん本当にありがとうございました。
だから Split を調べてみてと書いたのに・・・少し凹んだよ
有難う御座います通ってみたさん
ツイート | ![]() |