過去ログ

                                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つできてしまいます。
これは回避できるのでしょうか?
教えていただければと思います。
 ───────────────────────────────────────  ■題名 : Re:該当するファイルがあるまでファイルを探...  ■名前 : ひで  ■日付 : 02/10/17(木) 10:25  -------------------------------------------------------------------------
   ▼いぬだわん さん こんにちは

このようなことでしょうか?
いぬだわん さんのコードをちょっと変えてみましたが・・

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

他になにか良い方法があるとは思いますが
私も勉強中の為、これでいっぱいいっぱいです (^^;
 ───────────────────────────────────────  ■題名 : Re:該当するファイルがあるまでファイルを探...  ■名前 : yu-ji  ■日付 : 02/10/17(木) 11:08  -------------------------------------------------------------------------
   ひで さんへ:

かぶってしまいました(^^;
すみません。

ただひでさんの方法でも、ちゃんと動くと思いますが、
無意味に再帰を使ってます。

再帰が深くなっていくと、プログラムの内容によっては、メモリをたくさん
消費して、メモリ不足なんかになってしまいます。
#このプログラムだと、そんなに変なことをするユーザはいないと
#思うので、問題ないとは思いますが。

一応、念のため。
 ───────────────────────────────────────  ■題名 : Re:該当するファイルがあるまでファイルを探...  ■名前 : ひで  ■日付 : 02/10/17(木) 11:20  -------------------------------------------------------------------------
   ▼yu-ji さん こんにちは

>かぶってしまいました(^^;
>すみません。
気にしないで下さいね。(^^)

>ただひでさんの方法でも、ちゃんと動くと思いますが、
>無意味に再帰を使ってます。
はい、そのようで・・
ちょっと恥ずかしいんですが、”再帰 ”の事を知りませんでした。
教えてくれてありがとうございます。

>>S_File_Open関数の中で、S_File_Open関数を呼んでます。
>ので、いわゆる”再帰”ってやつになってます。
>デバッグモードで1つずつ処理を追っていけば分かると思いますが、
>このS_File_Openを呼ぶというのは、”戻る”という訳ではなくて、
>”深くなる”という感じです<分かりにくいかな。
>箱の中に箱を入れるみたいな感じ?

箱の中の箱の中の箱・・・・みたいにでいいんですよね(笑)

そーいえばデバックで確認したときに途中のEnd If に戻ってきてました
その為、私のコードはむりやりEnd If を 最後にもっていってました(^^;
いつもながら勉強になります。
yu-ji さんありがとうございま〜す。
 ───────────────────────────────────────  ■題名 : Re:該当するファイルがあるまでファイルを探...  ■名前 : yu-ji  ■日付 : 02/10/17(木) 10:49  -------------------------------------------------------------------------
   ▼いぬだわん さん:

こんにちは。
下記のプログラムですが、

********

>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


*********
 ───────────────────────────────────────  ■題名 : Re:該当するファイルがあるまでファイルを探...  ■名前 : いぬだわん  ■日付 : 02/10/17(木) 13:00  -------------------------------------------------------------------------
   yu-ji さん:
ひでさん:

こんにちは。

はじめのひでさんのでやってみて、
その後HPを見ていなかったのですが、
こんなことになっているとは、
質問した人間がびっくりです。

いろいろ勉強になりました。
ありがとうございました。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 218