- ベストアンサー
エクセルマクロ フォルダ内のファイル検索で
- エクセルマクロで指定フォルダ内のファイル名を検索する方法について教えてください。
- 条件の「ないなら」に反応して中断するハズが、ファイルを開いてしまいます。
- bufの設定にファイル名は指定できないのでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>上記(見つからないなら)の状態で実在ファイル名を指定すると「見つかりました」を返してしまい、ファイルもオープンしてしまいます。 んん~…?? このIf分岐って If buf = "" Then ("ないなら" の認識でよいのですよね?→YES) 終了 Else 開く End If ですよ? だから、実在ファイル名を指定すると、「見つかりました」を返す部分に行ってファイルを開くのは当然の話です。 んで、Ifの中だけ判定を逆にすると、ファイルがあるときに「見つかりません」を返して終了します。 このマクロ全体で言うと、 /* AAA.xlsのSheet1のA1セルに入っている値をファイル名として(以下B)、「C:\001\B.txt」をDir関数で探し、もし見つからなかったらA2に「Bは見つかりません」と表示して終了、見つかればA2に「Bが見つかりました」と表示してB.txtをExcelにて開く。 */ という処理です。そういう風に書かれています。 繰り返しますが、ファイルを「開いてしま」うのはファイルがそこにあるからで、Elseの部分を実行しているからです。ファイルがあるのだから「"ないなら"に反応して中断する」わけがありません。 ということなんですが…どこら辺が不明だったり期待と違ったりするんでしょうか?
その他の回答 (4)
- 米沢 栄蔵(@YON56)
- ベストアンサー率36% (37/102)
こんな感じでどうでしょうか。 Dim AA Dim AAA, BBB, CCC, DDD AA=Range("A1").Value ターゲットファイルが保存されているフォルダ名がセルA1に入力されているとしました。 Set AAA = CreateObject("Scripting.FileSystemObject") Set BBB = AAA.GetFolder(AA) Set CCC = BBB.files For Each DDD In CCC 'このForとNextの間にターゲットファイルファイルに対して、したいことを記述すればよい。 '例えば、ファイル名ならDDD.Nane、ファイルサイズならDDD.Sizeで取得できます。 Next
お礼
回答ありがとうございました。 丁度、戴いた内容で確認している時にANo.5に目が行き、確認し直しで問題なかった事に気づかされました。折角ですのでこちらも試してみますね! ありがとうございました。
- mu2011
- ベストアンサー率38% (1910/4994)
>ファイル名は指定できないのでしょうか? ⇒出来ます。 このマクロではファイルが見つかった場合、変数誤りでファイル名なしのコメント 表示をファイルなしと思い込んでいないでしょうか。 コメント表示のSelect~Activeは処理が重いのでこのような使い方はしない方が 良い。 例えば、Range("A2").Value = IptA & "が見つかりました" 又、何故ファイルオープンのパス名定数を使用しないのでしょうか。
お礼
ANo.5さん宛てに書きましたが私の勘違いでした。スミマセン。 今後もよろしくお願いします。
補足
回答ありがとうございます。 戴いた助言に基づき、Range("A2").Value = としてみましたが結果は同じでした。 定数にしないのは、フォルダにある多数のファイルからの選定名をA1に入力するようにしてある為です。
- temtecomai2
- ベストアンサー率61% (656/1071)
存在しないファイル名をセル A1 に入れてテストしても 「見つかった」 のロジックに言ってしまうということですか? If buf = "" Then の行にブレークポイントを仕掛けてコード実行を中断させて、buf の中に何が入っているか確認してみてはどうでしょうか? ワイルドカードを使っていて、思わぬファイルがヒットしてるってことも考えられますし。
お礼
補足の「逆の反応」は"="を"<>"に書き換えていた為でした。 詳しくはANo.5のお礼を確認下さい。 大変お騒がせしました。ありがとうございました。 今後もよろしくお願いします。
補足
回答ありがとうございます。ANo.1さん宛てにも書きましたが、仰る通り逆の反応をしてくれてます。ブレイクポイントでの内訳は「=""」でも「<>""」でも実在ファイルを指定すればそれを返し、架空ファイルを指定すればスペース""を返します。A1の指定ファイル名は他のプログラムで作成した3桁数字のファイルであり、ワイルドカードでは指定しません。
ん? ファイルを開くなら「無いなら」の条件に当てはまってないということだから正しいのでは?
お礼
眠気のせいか補足に誤記がありました。 上記(見つからないなら)の状態で実在ファイル名を指定すると「見つかりました」を返してしまい、ファイルもオープンしてしまいます。逆に If buf <> "" Then で 有るなら とすると 「見つかりません」で逆に反応してくれます(私が逆を指定してしまっているのでしょうが・・・)。
補足
回等ありがとうございます。 確認したいのですが、単純に If buf = "" Then は "ないなら" の認識でよいのですよね? 上記の状態で、実在するファイル名・しないファイル名のどちらを指定しても結果は「見つかりません」を返し、条件を If buf <> "" Then の、"あるなら"に書き換えると実在するファイルなら開き、無いものはエラーを返します。よって、上部ステートメントでの指定パスやファイルの指定の仕方に誤りがある気がするのですが、間違いを見つけられずにいます。 ちなみに「見つかりました」直前の"" & IptFN & "は"" & IptA & "の間違いです。
お礼
おはようございます。今頃目が覚めました。 起こして戴きましてありがとうございます。 元々書いてあった If buf = "" Then(ないなら) を、逆からの確認の為に If buf <> "" Then(あるなら)に書き換えた時に、実在ファイルを指定して、なおかつ(あるなら)なのに「見つかりません」とは何事だ?と眠れなくなっていました。次に架空ファイルを指定したら、今度はないハズなのに「見つかりました」と返してファイルオープンに行ってしまうので質問に至りました。これがANo.2さんへ書いた「逆の反応」の勘違いです。。。このレスを貰えずにいたら諦めていました。 では、今から再度会社行ってきます。ありがとうございました。 そしてお答え下さった皆さん、無駄な時間に尽力戴きましてありがとうございました。