[[20180206210745]] 『dirの入れ子のエラー解消について』(vo) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『dirの入れ子のエラー解消について』(vo)

 宜しくお願いします。

 フォルダ存在の有無
 同名ファイル存在の有無
 ファイル保存
 次のファイルへ

 という様な動きを作りたいです。

 ファイル = Dir()でエラーが出てしまい、調べると記事は沢山あるのですが、
 どの記事を見ても今一つ理解が出来ないので、以下のコードの修正部分をご教示頂ければと思います。 

 Sub test()

 Dim ファイル, SaveDir, fp, namae
 ファイル = Dir("C:\Users\vo\Desktop\" & "*.xlsx")

 Do While ファイル <> ""

    Workbooks.Open "C:\Users\vo\Desktop\" & ファイル
    namae = ActiveWorkbook.name

    SaveDir = "C:\Users\vo\Desktop\集計"
    If Dir("C:\Users\vo\Desktop\" & "集計", vbDirectory) = "" Then
    MkDir SaveDir
    End If

    If Dir("C:\Users\vo\Desktop\集計\" & namae) = "" Then
    ActiveWorkbook.SaveAs "C:\Users\vo\Desktop\集計\" & namae
    ActiveWorkbook.Close
    Else
    ActiveWorkbook.Close
    End If

 ファイル = Dir()
 Loop

 End Sub

< 使用 Excel:unknown、使用 OS:unknown >


 If Dir("C:\Users\vo\Desktop\集計\" & namae) = "" Then
↓
If namae = "" Then
と
If Dir("C:\Users\vo\Desktop\" & "集計", vbDirectory) = "" Then
    MkDir SaveDir
End If
をコメントアウトで

最初のDirでフォルダもファイルも無ければループしませんので
不必要かと
二回目以降はパラメータ指定だと""が返っています。

呼び出し元ファイルでなければとの条件は記述された方が良いかと。

外してましたら。すみません。

(隠居じーさん) 2018/02/06(火) 22:40


>dirの入れ子

フォルダの有無は、最初に1回でよいのでは?

(マナ) 2018/02/06(火) 22:55


> Workbooks.Open "C:\Users\vo\Desktop\" & ファイル

ファイルを開く必要があるのですか?

(マナ) 2018/02/06(火) 22:59


↑後のほうのコメントはエラーとは関係ありませんでした。無視してください。

(マナ) 2018/02/06(火) 23:04


Dir関数って、OS上に1つしかファイル位置を記憶できないのです。DOS時代の名残りですね。 このため、ファイル名を得るDirの後にファイル存在を確認するDirを行うと、前のDirの結果を忘れてしまうのです。 だから、ファイル名を得るDirだけ先に全ファイル分済ませておいて、これを配列にでもセットしておき、配列数分ループする中で存在確認のDir関数を使用しましょう。

私なりのコーディングで、整形した例なぞ。(すいませんが、小技を使って横着してます)

 Sub test()
    Dim SaveDir As String
    Dim LoadDir As String
    Dim cFiles As Variant
    Dim i As Long

    LoadDir = CreateObject("WScript.Shell").SpecialFolders("Desktop")
    SaveDir = LoadDir & "\集計"
    If Dir(SaveDir, vbDirectory) = "" Then
        MkDir SaveDir
    End If

    cFiles = Split(CreateObject("WScript.Shell").Exec("CMD /C DIR /A:-D/B """ & LoadDir & "\*.xlsx""").StdOut().ReadAll(), vbNewLine)
    For i = 0 To UBound(cFiles) - 1
        If Dir(SaveDir & "\" & cFiles(i)) = "" Then
            With Workbooks.Open(LoadDir & "\" & cFiles(i))
                .SaveAs SaveDir & "\" & cFiles(i)
                .Close False
            End With
        End If
    Next i
 End Sub

ファイルオープンしてから存在確認するのは、存在していたらクローズするだけであり開くだけ無駄なので、無いときだけ出力に変えました。 それにしても、オープンしてからセーブするだけなら、FileCopy文で良さそうに見えるのですが、何故いちいち保存するのでしょうね?
(???) 2018/02/07(水) 09:26


ん。単に新しいフォルダーにファイルをコピーしているだけですよね?
マクロ必要ですかね?

マクロ使おうとすると、
余分にエクセルを開かないといけないような気が。。。。

Ctrlキーを押しながらマウスでデスクトップ上で選択して、
フォルダーにドラッグするだけのような気がします。。。。
(まっつわん) 2018/02/07(水) 09:38


。。。<< _ _ >> とんだ早とちりで 。。。 ^^;
(隠居じーさん) 2018/02/06(火) 22:40の
私のコメントは没にして下さい。
すみませんでした。

(隠居じーさん) 2018/02/07(水) 11:58


 皆様ありがとうございます。

 ファイルを開くのは不要では?という疑問で少し混乱させてしまいごめんなさい。
 本来は開けて特定の列のみコピーし新しくその特定の項目で集めたファイルを作成する
 というようなことをしたかったのですが、ここでは何故dirが使えないのかというところを
 突き止めたかったので説明とコードを省略させて頂いたのです。

 隠居じーさん様
 いつもありがとうございます。
 確かに何度隠居じーさん様の説明を読んでも理解ができず、
 もしかしたら誤認識されてるのかなと思ってました。
 お気遣い嬉しいです!今後もお願いします。

 マナ様
 ありがとうございます!
 仰る通りフォルダ有無は一回で良かったです。
 言われて気付きました(^^;
 おかげで修正できました。

 ???様
 ありがとうございます!
 dirの説明とても勉強になりました。覚えておきます。
 また、頂いたコードで思った通り動きました。
 助かりました!

 まっつわん様
 ありがとうございます!
 仰る通りです(^^;
 私の省略した説明のせいですみませんでした。

(vo) 2018/02/10(土) 00:45


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.