• ベストアンサー

FileSystemObject & For Eachループで・・・

KojiSの回答

  • KojiS
  • ベストアンサー率46% (145/312)
回答No.6

》エラーを引っ掛けたい最小のコードにOnErrorをかけないと予期せぬ別のエラー 》でもエラー処理を行うバグを生むと以前聞いたのでコピー処理だけ挟み込んでいる 》のですが、これは良くないことなのでしょうか? 》  「予期せぬ別のエラー」の事も考えたエラー処理のコーディングをすべきでしょう。「その他のエラーの場合はエラーメッセージが出てアプリケーションが終了」でも良いのですか?という事です。  「最小のコードに On Errorを」というのは、コーディングする人の好みも入ってきますが、僕は、関数ごとに1つの On Errorで、関数1つをある程度短く、ですね。 》>CopyErr処理部での resume ????が無い? 》OnErrorで飛んだ先からはどこかにResumeで戻るべきなのでしょうか? 》大体関数自体を抜けてしまう事が多いんですが・・・ 》  あくまでも僕の考えですが、  関数自体を抜ける場所(出口)をいくつも作らない方が良いと思います。  関数は、入り口と出口があります。出来れば、入り口が1つなので、出口も1つにするべきだと思います。  経験上、関数の出口が複数ある場合ほど、バグが発生する可能性も大きくなります。  ですので、Resumeで終了処理部分に戻るようにすると。#2の方へ言った事はこういう理由からです。  オブジェクトの破棄(Nothing)は明示的にやっておいた方が良いですしね。

Plemo
質問者

お礼

参考にします。ありがとうございました。

関連するQ&A

  • セレクトボックスに表示されたファイル名を変数に格納する方法

    すみません、説明が足りませんでした。 あるフォルダに存在するファイルをセレクトボックスに 1行毎に1ファイル名表示させています。 そのファイル名の中から1つのファイル名を選択し、 実行ボタンを押したタイミングで、選択されたファイル名を Dimで定義した変数に格納したいのです。 私の記述では<option>タグは1つのみで複数のファイル名を 表示させています。 ///////////////////////////////////////////////////////// 現在以下のソースを記述しています。 <% Set objFS = CreateObject("Scripting.FileSystemObject") Set objFolder = objFS.GetFolder("C:\TEMP") For Each objFile In objFolder.Files str = str & objFile.Name & vbCR next %> <SELECT SIZE=20 ID=select1 NAME=select1 STYLE="width:320px" MULTIPLE TABINDEX=70> <% For Each objFile In objFolder.Files %> <option><%= objFile.Name%></option> <% Next %> </SELECT>

    • ベストアンサー
    • HTML
  • VBSのGetFolderメソッドについてですが

    VBSで質問です。環境はXP Proです。 GetFolderメソッドでFolderオブジェクトを取得し、Filesプロパティを For Eachでチェックしている時に、フォルダ内ファイルが削除された場合は、例外処理が起こるのでしょうか? それとも、削除処理自体が排他制御されてしまうのでしょうか? ----------------------------- ' 環境設定 Const strRootPath = "D:\" '監視対象フォルダ Dim objFso,objFolder,objFile,count Set objFso = CreateObject("Scripting.FileSystemObject") Set objFolder = objFso.GetFolder(strRootPath) count = 0 ' メインスクリプトの実行開始 For Each objFile In objFolder.Files     ' このタイミングでファイルが削除されてしまったら? If objFso.GetExtensionName(objFile) = "txt" Then count = count + 1 End If Next 皆様のお知恵をお貸しください。

  • 選択したファイル名を取得する方法について -再度質問します-

    ASPとVBScript、JavaScriptを使用した開発を行っています。 あるフォルダに存在するファイルをセレクトボックスに 1行毎に1ファイル名表示させています。 そのファイル名の中から1つのファイル名を選択し、 実行ボタンを押したタイミングで、選択されたファイル名を Dimで定義した変数に格納したいのです。 当方ASPでの開発は初心者でして、クライアント側、サーバ側の 処理の区別がまだつかない状況で申し訳ないのですが FORMタグなどを使用しているので、サーバ側処理になると思うのですが 教えて頂けると有り難いです。 私の記述では<option>タグは1つのみで複数のファイル名を 表示させています。 ///////////////////////////////////////////////////////// 現在以下のソースを記述しています。 <% Set objFS = CreateObject("Scripting.FileSystemObject") Set objFolder = objFS.GetFolder("C:\TEMP") For Each objFile In objFolder.Files str = str & objFile.Name & vbCR next %> <SELECT SIZE=20 ID=select1 NAME=select1 STYLE="width:320px" MULTIPLE TABINDEX=70> <% For Each objFile In objFolder.Files %> <option><%= objFile.Name%></option> <% Next %> </SELECT>

    • ベストアンサー
    • HTML
  • 複数のフォルダ内の名前や作成日等をリスト化する方法

    複数のフォルダ内の名前や作成日等をリスト化する方法 こんにちは。 以下に示しますマクロは フォルダ内の名前や作成日等(サブディレクトリを含む)をリスト化するもので 以前同サイト内で教えて頂きました。 現在このマクロでは シート1のAセルにフォルダのパスを入力して実行すると、 シート2にフォルダ内の情報がリスト化されます。 このマクロでは1つのフォルダ内の情報をリスト化することが可能ですが、 今回は更に、 エクセルのA列にフォルダのパスを複数個入力し、 それらのフォルダ内の情報を、それぞれ別シートに 一気にリスト化したいと考えています。 ご存じの方がいらっしゃいましたら よろしくお願いいたします。 Sub makeFileList()   Call fileList   MsgBox "終了しました" Columns.AutoFit 'すべての列幅を自動調整する End Sub    Function fileList(Optional trgDir As String = "", Optional fCnt As Long = 0)   On Error GoTo err   Dim objFs As Object   Dim objDir As Object   Dim objFile As Object   Dim i As Long      Set objFs = CreateObject("Scripting.FileSystemObject")      If trgDir = "" Then     Set objDir = objFs.Getfolder(Sheets("sheet1").Range("a1"))   Else     Set objDir = objFs.Getfolder(trgDir)   End If      Set objFile = objDir.Files        With Sheets("sheet2")     For Each objFile In objDir.Files         fCnt = fCnt + 1 .Cells(fCnt, 1).Offset(1, 0) = fCnt .Cells(fCnt, 2).Offset(1, 0) = objFile.DateCreated .Cells(fCnt, 3).Offset(1, 0) = objFile.DateLastModified .Cells(fCnt, 4).Offset(1, 0) = objFile.Path .Range("A1").Value = "No" .Range("B1").Value = "作成日" .Range("C1").Value = "更新日" .Range("D1").Value = "ファイル名"     Next objFile          For Each objDir In objDir.SubFolders       If objDir.Attributes <> 22 Then   'システムフォルダ除外                      '--------------サブフォルダの再帰検索             Call fileList(objDir.Path, fCnt)           '--------------サブフォルダの再帰検索                End If     Next objDir   End With      Set objFile = Nothing   Set objDir = Nothing   Set objFs = Nothing Exit Function err:   Select Case err.Number     Case 76 ' path がない       MsgBox "path 指定が間違っています"     Case Else       MsgBox err.Number & vbCrLf & err.Description   End Select      Set objFile = Nothing   Set objDir = Nothing   Set objFs = Nothing End Function

  • ファイル名をエクセルにリスト化するマクロの応用

    ファイル名をエクセルにリスト化するマクロの応用 こんにちは。 以下に示しますマクロは フォルダ内の名前や作成日等(サブディレクトリを含む)を エクセルにリスト化するもので 以前同サイト内で教えて頂きました。 現在このマクロでは シート1のAセルにフォルダのパスを入力して実行すると、 シート2にフォルダ内の情報がリスト化されます。 このマクロでは1つのフォルダ内の情報をリスト化することが可能ですが、 今回は更に、 エクセルのA列にフォルダのパスを複数個入力し、 それらのフォルダ内の情報を、それぞれ別シートに 一気にリスト化したいと考えています。 ご存じの方がいらっしゃいましたら よろしくお願いいたします。 プログラミングに関する知識はほとんどありません… 具体的に、どこに何を入力するのかを教えていただけると嬉しいです。 お手数をおかけし、すいません。 ※以下は以前nicotinismさんに回答いただいたマクロを 参考にさせていただいております。 Sub makeFileList()   Call fileList   MsgBox "終了しました" Columns.AutoFit 'すべての列幅を自動調整する End Sub    Function fileList(Optional trgDir As String = "", Optional fCnt As Long = 0)   On Error GoTo err   Dim objFs As Object   Dim objDir As Object   Dim objFile As Object   Dim i As Long      Set objFs = CreateObject("Scripting.FileSystemObject")      If trgDir = "" Then     Set objDir = objFs.Getfolder(Sheets("sheet1").Range("a1"))   Else     Set objDir = objFs.Getfolder(trgDir)   End If      Set objFile = objDir.Files        With Sheets("sheet2")     For Each objFile In objDir.Files         fCnt = fCnt + 1 .Cells(fCnt, 1).Offset(1, 0) = fCnt .Cells(fCnt, 2).Offset(1, 0) = objFile.DateCreated .Cells(fCnt, 3).Offset(1, 0) = objFile.DateLastModified .Cells(fCnt, 4).Offset(1, 0) = objFile.Path .Range("A1").Value = "No" .Range("B1").Value = "作成日" .Range("C1").Value = "更新日" .Range("D1").Value = "ファイル名"     Next objFile          For Each objDir In objDir.SubFolders       If objDir.Attributes <> 22 Then   'システムフォルダ除外                      '--------------サブフォルダの再帰検索             Call fileList(objDir.Path, fCnt)           '--------------サブフォルダの再帰検索                End If     Next objDir   End With      Set objFile = Nothing   Set objDir = Nothing   Set objFs = Nothing Exit Function err:   Select Case err.Number     Case 76 ' path がない       MsgBox "path 指定が間違っています"     Case Else       MsgBox err.Number & vbCrLf & err.Description   End Select      Set objFile = Nothing   Set objDir = Nothing   Set objFs = Nothing End Function

  • vba pdfファイル順番に印刷

    セルC5から、下にファイル名が入っています。上から順に印刷したいのですが、下記だとvbaが動かないです。 Dim z As Object Dim i As Long Dim f, p As String Set z=CreateObject("WScript.Shell") p=Application.ActivePrinter For i=5 To Range("C1").End(xlDown).Row f="C:¥フォルダパス" & Cells(i,1).Value & ".pdf" ここから、行ごとに進んだ時に、黄色くならず反応しませんでした↓ If Dir (f)<>""Then z.Run("Acrobat.exe /t" & f) ↓ここにとびました。 Else End if Next i Set z=Nothing End Sub それ以前に、adobe acrobatが、更新されてから動いていたバッチファイルですら反応しなくなりました Adobeの環境設定をネットで見た通り見直ししたりしたのですが、全く成功しません。フォルダ内のpdfファイルを、全て印刷するvba(Acrobat.exe)を記載しない方法は成功したのですが、どうすれば、上手くいきますか? 教えていただきたいです。印刷の順番を指定したいです。 初心者なのでお手柔らかにお願いします。ちなみに動いているほうのvbaは下記です。 フォルダ内のファイルを全て印刷する、(順番関係なし)です。 Dim FolderPath As String Dim Filename As String Dim objShell As Object Dim objFolder As Object Dim objFile As Object FolderPath=ThisWorkbook.Path Set objShell=CreateObject("Shell.Application") Set objFolder=objShell.Namespace(ThisWorkbook.Path) For Each objFile In objFolder.items If Right(objFile.Name,4)=".pdf"Then objFolder.ParseName(objFile.Name) .InvokeVerbEx("print") End If Next objFile Set objFile=Nothing Set objFolder=Nothing Set objShell=Nothing End Sub 上記は全てネットから引用しています。 adobe acrobatを使うと反応しないので下記、上記に付け足ししたりして自身で初めて考えました。 Sub Test() Dim FolderPath As String Dim Filename As String Dim objShell As Object Dim objFolder As Object Dim objFile As Object FolderPath=ThisWorkbook.Path Set objShell=CreateObject("Shell.Application") Set objFolder=objShell.Namespace(ThisWorkbook.Path) For i=5 To Range("C1")End(xlDown).Row ObjFile.Name=FolderPath&Cells(i,1).value&".pdf" If Dir objFile.Name<>""Then objFolder.ParseName(objFile.Name).InvokeverbEx("print") Else End if Next i Set objFile=Nothing Set objFolder=Nothing Set objShell=Nothing MsgBox"印刷が完了しました" End Sub どこか文書変でしょうか?? 添削してくださいませんか。 順番に印刷、、できるとすごく仕事がはかどるため、成功させたいです。 お力添え、何卒お願いいたします。

  • For Each Nextにつきまして

    Dim a As Chart  For Each a In Charts   a.Delete  Next a Setステートメントを用いないという事は、aはすべてのグラフシートが代入されている事になりますか。しかしeachという事は、結局二行目で行っているのは、全グラフシート中の一枚の確認…ですか?グラフシートを一枚ずつ確認して、一枚ずつ削除しているのですか? またグラフシートが一枚も無い状態でもエラーが起きないのはなぜ? 無ければ、For Each~Next内の処理が実行されないのですか。 宜しく、お願いします。

  • WSH_フォルダ内の処理について

    昨日から作成しているのですが、 新しく質問を立ち上げます。 下記のように、フォルダ内に格納してあるファイルを 取得できるのですが、フォルダ内で作成日時を見て 最新のファイル以外は削除させたい処理をやりたいです。 ファイル名を明示的に記載し比較はできるのですが、 フォルダ内の中から作成日時の最新のファイルを取得する っていうのができません。 下記ソースはイメージです。 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objFolder = objFSO.GetFolder("C:\test") For Each objFile In objFolder.Files If objFile.type = ファイルタイプ Then   上記ファイルタイプで最新の日付のファイルを出力 上記ファイル以外削除 Else  上記ファイルタイプが存在しなければ何も処理を行わないず フォルダ内のファイル一覧を取得 WScript.Echo " " & objFile.Name Wscript.Echo "NG" End If Next 調べているのですが、簡単なソースしか作れません。 お願いします

  • ファイルを探すプログラムで c:\のみ動かない

    ファイルを探すプログラムをネット頂き テストしたのですが c:\ のみ 動かず c:\*** は そのフォルダーから下を探します e:\ は 全てのフォルダーを探します。 WIN8 ですが どこで間違ってるのでしょうか? よろしくどうぞ Option Explicit Private g_dteDate As Date Private g_strEXT As String '参照設定 M-Scripting.Runtime Cells(1, 2).Value に 探すアドレス 記載 c:\  e:\  c:\*** など Sub Sample_FileSearch2()   Dim vntF As Variant Dim objFSO As FileSystemObject Dim dteDate As Date Dim GYO As Long Dim cntFound As Long Set objFSO = New FileSystemObject ' FSO Rows("5:65536").ClearContents GYO = 4 ’ g_dteDate = DateAdd("m", Cells(3, 2).Value * -1, Date) 更新 不要 g_strEXT = UCase(Trim(Cells(2, 2).Value)) ' ルートフォルダから探索開始 Call Sample_FileSearch2_SUB(objFSO, _ objFSO.GetFolder(Trim(Cells(1, 2).Value)), GYO, cntFound) Set objFSO = Nothing ' 処理結果の表示 If cntFound = 0 Then MsgBox "見つかりません" Else MsgBox cntFound & "個見つかりました" End If End Sub '''******************************************************************************* ''' ファイル探索処理(再帰動作) '''******************************************************************************* Private Sub Sample_FileSearch2_SUB(objFSO As FileSystemObject, _ ByVal objFolder As Folder, _ GYO As Long, cntFound As Long) Dim objFolder2 As Folder Dim objFile As File ' サブフォルダの探索 For Each objFolder2 In objFolder.SubFolders ' サブフォルダ個々の探索(再帰動作) Call Sample_FileSearch2_SUB(objFSO, objFolder2, GYO, cntFound) Next objFolder2 ' このフォルダ内のファイルの探索 For Each objFile In objFolder.Files ' ここから条件判断 With objFile If (UCase(objFSO.GetBaseName(.Path)) = g_strEXT) Then GYO = GYO + 1 Cells(GYO, 1).Value = .Name Cells(GYO, 2).Value = .DateLastModified Cells(GYO, 3).Value = _ Left(.Path, Len(.Path) - Len(.Name) - 1) cntFound = cntFound + 1 End If End With Next objFile End Sub

  • VBSで、テキストファイルに対して、全体の途中に文字列を追加したい

    こんばんわ VBSについて質問です。 テキストファイルを開いて、文字列を追加するスクリプトを作成したいのですが、 以下のようなプログラムであれば、行の一番下に文字を追加できると思います。 ########ここから Dim objFS,objText,objFile Set objFS = CreateObject("Scripting.FileSystemObject") Set objFile = objFS.GetFile("C:\test\vbs\test.txt") Set objText = objFile.OpenAsTextStream(8,-2) objText.WriteLine("新しい行") Set objFILE = Nothing Set objText = Nothing ############ここまで しかし今やりたいのは分の途中に文字をいれたい。 たとえばテキストファイルが A B C D というファイルだったら、 "B"を検索して、Bの下に”新しい行”という文字列を追加したいです。 いろいろ調べましたがどうもうまくいきません。 わかる方ご教授願います。