性格悪い人が優勝

同一フォルダ下にある2つのブック A.xlms と B.xlms の(共に)Sheet1 シートのD1セルに今日の日時をを入れるマクロを、或るサイトのサンプルを元に書いて見たのですが、以下のような記述では無限ループになってしまいます。

Dim Wb As Workbook
Dim Ws As Worksheet
Dim dirName As String
Dim fileName As String
Do Until fileName = ""
Set Wb = Application.Workbooks.Open(dirName & fileName)
Set Ws = Wb.Worksheets("Sheet1")
Ws.Range("D1").Cells.Value = Format(Now, "yyyy/mm/dd hh:mm")
Set Ws = Nothing
Wb.Save
Wb.Close
Set Wb = Nothing
fileName = Dir
Loop

これを動作させてみると、2つのブック処理最終段階の
fileName = Dir
の個所で fileName が "" にならず、A.xlms となってしまい、無限ループに陥ってしまっているようです。
Wb.Save をコメントアウトすれば一応は動作します。
その他、試行錯誤したのですが解決できません。
どなたか教えて頂ければ幸いです。

質問者からの補足コメント

  • 申し訳ありません。以下の記述が抜けていました。
    dirName = "U:\World\国別\"
    fileName = Dir(dirName & "*.xlsm")
    又、上記フォルダ(国別)には先述の2つのブックだけが収納されていて、問題のマクロは他のフォルダの別のファイルから操作されています。

      補足日時:2018/05/02 19:02

A 回答 (2件)

ファイルシステムオブジェクトを使って、次のようなコードではだめですか?



Dim objFSO As Object
Dim objFolder as Folder
Dim objFile as File
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("U:\World\国別")
For each objFile in objFolder.Files
if right(objfile.name,4) = "xlsm" then
(処理)
    endif
Next
    • good
    • 0
この回答へのお礼

programmermas999macさん、サンプルを有り難うございました。
これを基に、(処理)の部分では fileName = Dir を削除して動作させたところ、正常に機能しました。
よろずやkinchanさんへのお礼でも書いた「Dir関数」の疑問が氷解したわけではありませんが助かりました。
また、機会があれば宜しくお願いします。

お礼日時:2018/05/03 12:00

Dir関数で得たファイル名を一旦配列に格納して、


実際の処理は、Dirの代わりに配列のファイル名を使えばよろしいかと。
    • good
    • 0
この回答へのお礼

よろずやkinchanさん、質問後1時間足らずでの迅速な回答を有り難うございました。
配列を使う方法も試してみます。
ただ、今回アップしたDir関数を使用するマクロは、このような目的では定番的なものではないかと思うのですが、それが何故うまく動作しないのかも知りたかったのです。
もし、ご存知でしたら教えて頂ければ幸いです。

お礼日時:2018/05/03 09:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!