かなり多くのプロシージャ(100個くらい)から特定ひとつに検索をかけて
SubA2X()
〜〜〜
End Sub
を切り抜いて他のテキストファイルにペーストするというプログラムを作りたいのですが、イメージがわきません。かなり苦しんでいます。関数などヒントをいただけませんか
検索対象の100個くらいのプロシージャはテキストファイルに書いてあります
InStr関数で『Sub XXX』を探して
更にそこから
InStr関数で『End Sub』を探して
その範囲をMid関数で切り取る。
すみません。ヘルプなどで見てみたのですが関数の使い方などがわかりません。使用例に載っているような文字列を対象としたものではなくファイル全体に対して行うとなるとどのような構成になるのでしょうか?
お手数ですがお願いします
ファイルを一行ずつ読み込んで、ねろさんが提示してるような方法をとる。
というのではダメなのですか?
おそらくトッシーさんの質問の仕方だと質問内容が間違ってる気がしてしょうがない
>関数の使い方などがわかりません
あってる間違ってるにかかわらず使い方の調べ上げた関数を記述してください
そのヘルプの何が理解できないのかを記述してください
そうでない場合の質問の仕方は・・・
どの関数を使えばいいのかがわかりませんが正しくなる
手作業ならどうやってやったら実行できるか
その手順の中で何がわからないのかを教えてください
(トッシーさんがどこまで理解しているのかが皆にわかるようにするため)
本来ならば・・・
>どのような構成になるのでしょうか?
ここを考えるのがプログラマだと思います
過去に文字列系の質問は多々出ているので検索してみてはいかがでしょうか?
(極々最近もあった気がするし・・・)
私なり解決なら
とりあえずファイルシステムオブジェクトでOKじゃないの?
ファイルシステムオブジェクトって何?って質問は無しの方向で・・・
処理系を問わないなら、
awkかperlあたりでフィルタ風に作ったほうが手取り早いような・・・。
すいません。自分はかなりの初心者です、つまりは一行ずつループさせて一行ずつに検索をかけるということでしょうか?ほんとにゼロからわからないのです。InStrのヘルプにある使用例はわかるのですが、これをかなりの行数があるファイル全体に対して行うとはどういうことなのでしょうか。
サンプルコードをひとつでもいただければと思います。
ご迷惑かけて申し訳ありません
一行ずつ検索をかけるということは・・・
Open 目的ファイル For Input As #iFileNo
Line Input #intFileNo, str変数
Do Until EOF(FileNo)
If str変数 = "目的文字列" Then
blnフラグ = True
ElseIf str変数 = "End Sub" And blnフラグ = True Then
blnフラグ = False
Exit Do
Enf If
If blnフラグ = True Then
str変数をどこかに退避する処理
End If
Line Input #intFileNo, str変数
Loop
これで一行ずつ読みながら進めるはず・・・
デバッグはしていないのであくまで設計程度にサンプルを捕らえてください
サンプルで必要な変数の宣言とかは自分で考えてね・・・
これは私のイージーミス・・・
EXITする前にEndsubも書き出してね
FileNo変数もいろんな名前がついてしまいました・・・ごめんない
どれかに統一してください・・・
intFileNo か iFileNo か FileNoかに・・・
あと6.0のコードでもよかったのだろうかとふと疑問・・・
もしRichTextBoxが使えるんだったら、RichTxtBoxと普通のTextBoxを2つ、
コマンドボタンを1つ置いて、Text1に探す文字を入れて
Option Explicit
Private Sub Command1_Click()
Dim t1 As Long, t2 As Long
RichTextBox1.LoadFile App.Path + "\" + "test.txt" '読み込むファイル名
t1 = InStr(1, RichTextBox1.Text, Text1.Text, vbTextCompare)
If t1 > 0 Then
t2 = InStr(t1, RichTextBox1.Text, "End Sub", vbTextCompare)
Text2.Text = Mid(RichTextBox1.Text, t1, t2 - t1 + Len("End Sub"))
End If
End Sub
こんな手もあるかも。
>サンプルコードをひとつでもいただければと思います。
同じような質問を過去ログ検索せずに質問し、同じような
コードを何度も要求すると、今後、過去ログ検索した時に
同じキーワードで同じようなソースコードが大量に引っかかる
こととなり、効率が悪くなります。たいへん迷惑しますので
過去ログ検索はするようにして下さい。
で、できました。理想の形です!!!!!!!!!
ネロさんありがとうございます。
そこでお願いなのですがコードにもう少しコメントをつけていただきたいのですがよろしいでしょうか?
追記・・・
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200409/04090048.txt
↑のsayさんの案なんてそのまんまじゃない?
FileStreamってやつ
葉月さんの上レスの書き方だとかなりの初心者さんみたいなんで混乱しそうですね。
>↑のsayさんの案なんてそのまんまじゃない?
>FileStreamってやつ
ここの記述は「ファイルから内容を読み込む」部分という意味でそのまんまですね。
検索は別ロジックで。
>じゃいあんさん
そうですね、失礼しました
上記発言は
テキストをライン(1行)で読むのではなく、改行も含めて読込を行うというものです
コントロールを使っている、ねろさんの考えに類似し
改行も含めて一括で取り込んでしまう方法が記述されているだけです
でも・・・
>トッシーさん
>そこでお願いなのですがコードにもう少しコメントをつけていただきたいのですがよろしいでしょうか?
いくら初心者とはいえちょと努力が足りない気がするのは私だけでしょうか・・・
一体何がわからなくてコメントをつけてほしいのかがわからないです・・・
わからないポイント絞って再度質問することをお勧めします
おそらく今度はリッチテキストボックスとか他の関数のはずだし
検索すればわからないポイントは出てくるはずです
コメントと言うか解説してほしいと言うことでしょうか。
今回の検索文字列には改行が含まれていますので、
一行ずつ読み込むのでは処理が面倒でしょう。
ファイルを全て読み込むとなるとFSO(FileSystemObject)
となりますが、初心者の方はRichTextBoxを使って見るのも一興です。
RichTextBoxは結構優れたコントロールで、特にファイルの読み書きに関しては、
RichTextBox1.LoadFile ファイル名一行で読み込みます。又書き込みは
RichTextBox1.SaveFile ファイル名の一行で書き込んでしまいます。
一見遅い様に思われますが、処理は高速です。
また普通のTextBoxのような64Kの長さ制限もありません。
>t1 = InStr(1, RichTextBox1.Text, Text1.Text, vbTextCompare)
ここがわからないのでしょうか?
RichTextBox1にのテキストの中から、Text1.Textに書かれている文字の
最初の位置を返します。
t2 = InStr(t1, RichTextBox1.Text, "End Sub", vbTextCompare)
はt1で見つけた文字列の位置から検索して最初の"End Sub"の位置を見つけます。
これは"E"の位置なので、切り出したい文字列の"nd Sub"までの6文字分をこれに
足さなくてはなりません。
t2 - t1 + Len("End Sub") となっていますが、実際は
t2 - t1 + 1 + Len("End Sub") - 1 をまとめています。
InStrに関してはご自分でMSDNで調べ見て下さい。使用例が出ていますので
わかると思いますが、解らなかったらその項目を質問してください。
vbTextCompareを指定すると大文字小文字関係なく検索します。
>いくら初心者とはいえちょと努力が足りない気がするのは私だけでしょうか・・・
葉月さん、このレスが付く前に殆ど書いてしまったので、このまま投稿させてもらいます。
プログラムを書くのに2分、説明を書くのに20分。(^^;
ほんとに申し訳ありませんでした。皆様のおっしゃるとおりです。
お恥ずかしい限りです。以後慎みたいと思います。
ツイート | ![]() |