Page 218 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼該当するファイルがあるまでファイルを探... いぬだわん 02/10/16(水) 22:57 ┣Re:該当するファイルがあるまでファイルを探... ひで 02/10/17(木) 10:25 ┃ ┗Re:該当するファイルがあるまでファイルを探... yu-ji 02/10/17(木) 11:08 ┃ ┗Re:該当するファイルがあるまでファイルを探... ひで 02/10/17(木) 11:20 ┗Re:該当するファイルがあるまでファイルを探... yu-ji 02/10/17(木) 10:49 ┗Re:該当するファイルがあるまでファイルを探... いぬだわん 02/10/17(木) 13:00 ─────────────────────────────────────── ■題名 : 該当するファイルがあるまでファイルを探... ■名前 : いぬだわん ■日付 : 02/10/16(水) 22:57 -------------------------------------------------------------------------
こんばんは。 質問です。 あるテキストまたはxlsファイルを開くのですが、 テキストまたはxlsファイルにはある特定の文字が入っていて (テキストを開いた場合はA1に特定の文字が入り、 xlsもA1に特定の文字が入っています)、 そのテキストまたはxlsファイル以外は開かずに閉じます。 見つかった場合は、そのワークシートをコピーして、 新しいBookを作成し、それをActiveにします。 コピーされたワークシートは閉じます。 見つからない場合は、 その該当するテキストファイルが見つかるまで テキストファイルを探すprogを作っています。 そして、 もし、そのファイルのある場所や名前がどうしてもわからない場合や、 探すのが面倒になった場合は、 キャンセルボタンを押して、そのprogは終了します。 そこで、下記のprogを作ったのですが・・・ 'ここから Sub S_File_Open() Dim myFName As String,myFName2 As String '--ファイルの指定-- myFName = Application.GetOpenFilename("指定のファイル(*.txt; *.xls;),*.txt;*.xls;", Title:="処理するファイルの指定") If myFName <> "False" Then Workbooks.OpenText Filename:=myFName, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=True, _ Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), Array( _ 3, 1), Array(4, 1)) myFName = ActiveWorkbook.Name '該当しないファイルの場合 If Range("A1").Value = "<Voltage>" = False Then Select Case MsgBox("処理データファイルに該当しません。ファイルを選択しなおしますか?", vbExclamation + vbYesNo) Case vbYes Workbooks(myFName).Close S_File_Open Case vbNo End End Select End If Worksheets.Copy myFName2 = ActiveWorkbook.Name Workbooks(myFName).Close Workbooks(myFName2).Activate 'ファイルキャンセルした場合 Else MsgBox "ファイルを指定しなかったため、中止します。", vbInformation + vbOKOnly, "処理の中止" End End If End Sub 'ここまで 該当するファイルではなかった時に、 選択しなおし、選択しなおしたファイルが該当した場合、 Workbooks(myFName).Close でエラーが出てストップしてしまいます。 また、ワークシートをコピーされたBookが2つできてしまいます。 これは回避できるのでしょうか? 教えていただければと思います。 |
▼いぬだわん さん こんにちは このようなことでしょうか? いぬだわん さんのコードをちょっと変えてみましたが・・ Sub S_File_Open() Dim myFName As String, myFName2 As String Dim ans myFName = Application.GetOpenFilename("指定のファイル(*.txt; *.xls;),*.txt;*.xls;", Title:="処理するファイルの指定") If myFName <> "False" Then Workbooks.OpenText FileName:=myFName, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=True, _ Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), Array( _ 3, 1), Array(4, 1)) Else MsgBox "ファイルを指定しなかったため、中止します。", vbInformation + vbOKOnly, "処理の中止" Exit Sub End If myFName = ActiveWorkbook.Name '該当しないファイルの場合 If Range("A1").Value = "<Voltage>" <> False Then Worksheets.Copy myFName2 = ActiveWorkbook.Name Workbooks(myFName).Close Workbooks(myFName2).Activate Else ans = MsgBox("処理データファイルに該当しません。ファイルを選択しなおしますか?", vbExclamation + vbYesNo) If ans = vbYes Then Workbooks(myFName).Close S_File_Open Else Workbooks(myFName).Close End If End If End Sub 他になにか良い方法があるとは思いますが 私も勉強中の為、これでいっぱいいっぱいです (^^; |
ひで さんへ: かぶってしまいました(^^; すみません。 ただひでさんの方法でも、ちゃんと動くと思いますが、 無意味に再帰を使ってます。 再帰が深くなっていくと、プログラムの内容によっては、メモリをたくさん 消費して、メモリ不足なんかになってしまいます。 #このプログラムだと、そんなに変なことをするユーザはいないと #思うので、問題ないとは思いますが。 一応、念のため。 |
▼yu-ji さん こんにちは >かぶってしまいました(^^; >すみません。 気にしないで下さいね。(^^) >ただひでさんの方法でも、ちゃんと動くと思いますが、 >無意味に再帰を使ってます。 はい、そのようで・・ ちょっと恥ずかしいんですが、”再帰 ”の事を知りませんでした。 教えてくれてありがとうございます。 >>S_File_Open関数の中で、S_File_Open関数を呼んでます。 >ので、いわゆる”再帰”ってやつになってます。 >デバッグモードで1つずつ処理を追っていけば分かると思いますが、 >このS_File_Openを呼ぶというのは、”戻る”という訳ではなくて、 >”深くなる”という感じです<分かりにくいかな。 >箱の中に箱を入れるみたいな感じ? 箱の中の箱の中の箱・・・・みたいにでいいんですよね(笑) そーいえばデバックで確認したときに途中のEnd If に戻ってきてました その為、私のコードはむりやりEnd If を 最後にもっていってました(^^; いつもながら勉強になります。 yu-ji さんありがとうございま〜す。 |
▼いぬだわん さん: こんにちは。 下記のプログラムですが、 ******** >Sub S_File_Open() 中略 > '該当しないファイルの場合 > If Range("A1").Value = "<Voltage>" = False Then > Select Case MsgBox("処理データファイルに該当しません。ファイルを選択しなおしますか?", vbExclamation + vbYesNo) > Case vbYes > Workbooks(myFName).Close > S_File_Open 後略 ********** S_File_Open関数の中で、S_File_Open関数を呼んでます。 ので、いわゆる”再帰”ってやつになってます。 デバッグモードで1つずつ処理を追っていけば分かると思いますが、 このS_File_Openを呼ぶというのは、”戻る”という訳ではなくて、 ”深くなる”という感じです<分かりにくいかな。 箱の中に箱を入れるみたいな感じ? >該当するファイルではなかった時に、 >選択しなおし、選択しなおしたファイルが該当した場合、 > Workbooks(myFName).Close >でエラーが出てストップしてしまいます。 >また、ワークシートをコピーされたBookが2つできてしまいます。 これは、つまり 1.S_File_Open(仮に関数A1とする)起動 2.関数A1の処理(処理データ以外のファイルを読んで、再指定するを選択) 3.S_File_Open(仮に関数A2とする)起動 4.関数A2の処理→終了(処理データを読み込んで、処理終了) 5.関数A1でS_File_Openの次の行から再スタート 6.関数A2の処理→終了 という流れになります。 なので、コピーを2回してるので、Bookも2つできます。 ということで、もとのプログラムをもとに、以下のように修正してみました。 ************ Sub S_File_Open() Dim myFName As String, myFName2 As String Dim C_Flag As Boolean Do C_Flag = False '一応、初期化 '--ファイルの指定-- myFName = Application.GetOpenFilename("指定のファイル(*.txt; *.xls;),*.txt;*.xls;", Title:="処理するファイルの指定") If myFName <> "False" Then Workbooks.OpenText Filename:=myFName, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=True, _ Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), Array( _ 3, 1), Array(4, 1)) myFName = ActiveWorkbook.Name '該当しないファイルの場合 If Range("A1").Value = "<Voltage>" = False Then Select Case MsgBox("処理データファイルに該当しません。ファイルを選択しなおしますか?", vbExclamation + vbYesNo) Case vbYes Workbooks(myFName).Close C_Flag = False Case vbNo End End Select Else C_Flag = True End If Else 'ファイルキャンセルした場合 MsgBox "ファイルを指定しなかったため、中止します。", vbInformation + vbOKOnly, "処理の中止" End End If Loop Until C_Flag = True Worksheets.Copy myFName2 = ActiveWorkbook.Name Workbooks(myFName).Close Workbooks(myFName2).Activate End Sub ********* |
yu-ji さん: ひでさん: こんにちは。 はじめのひでさんのでやってみて、 その後HPを見ていなかったのですが、 こんなことになっているとは、 質問した人間がびっくりです。 いろいろ勉強になりました。 ありがとうございました。 |