Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6361 / 76734 ←次へ | 前へ→

【75974】Re:exvel2013でのFileSearchの代替について
発言  kanabun  - 14/8/14(木) 17:44 -

引用なし
パスワード
   ▼佐藤小次郎 さん:

前掲の File_Search() 修正版ですが、モジュール全体を読み返していて
おおよその利用法が分り、修正版の不具合が見つかりましたので、以下に
修正第2版を提示しておきます。
試されるときは こちらを使ってください。

'//New File_Search
Function File_Search()     'Dirコマンドによるファイル検索
  Dim LookIn As String
  Dim Filename As String
  Dim SearchSubFolders As Boolean
  Dim tmpPath As String
  Dim sCmd As String
  Dim ng As Long
  Dim j As Long
  Dim n As Long
  Dim io As Integer
  Dim buf() As Byte
  Dim FoundFiles() As String
 
  For j = Cnt(0) To 1 Step -1
    LookIn = Left(TL_Path, Cnt(j)) '検索するフォルダ
    SearchSubFolders = True     'Sub Folderも検索する
    Filename = WK_Name       '検索するファイル名
    If Right$(LookIn, 1) <> "\" Then LookIn = LookIn & "\"

  '---- Dirコマンドによるサブフォルダを含むファイル名の検索
    Filename = LookIn & Filename
    tmpPath = Environ$("Temp") & "\Dir.tmp" '一時ファイルパス

    sCmd = "DIR """ & LookIn & Filename & """ /b/s/a:-D > """ _
        & tmpPath & """"  '' /b ファイル名のみ
                  '' /s サブディレクトリも検索
            '' /a:-D サブディレクトリー名は表示しない
     
    'Dirコマンド実行(tmpファイルに出力)
    With CreateObject("WScript.Shell")
      ng = .Run("CMD /C " & sCmd, 7, True)
    End With
    If ng Then
      MsgBox "ファイル検索時にエラーが発生しました." & vbCr _
       & "処理を中断します", , LookIn & Filename
      Open_SW = "Error"
      Exit Function
    End If

    '----- Dirコマンドで取得したファイル名を配列に格納
    If FileLen(tmpPath) < 2 Then
      'このパスでは見つからなかったとき
      Debug.Print LookIn, Filename, "→ NO FILES"
      Open_SW = "Error" '次に検索パスに飛ぶ
    Else
      io = FreeFile()
      Open tmpPath For Binary As io
       ReDim buf(1 To LOF(io))
       Get #io, , buf
      Close io
      Kill tmpPath
      FoundFiles() = Split(StrConv(buf, vbUnicode), vbCrLf)
      '同名ファイルが存在した場合、フォルダのパスをセット
      For i = 0 To UBound(FoundFiles) - 1
        If FoundFiles(i) Like "*" & Filename & "*" Then
          WK_Path = FoundFiles(i)
          Open_SW = "OK"
          Exit For
        End If
      Next
    End If
  Next j
  If Open_SW <> "OK" Then
    MsgBox "【" & WK_Name & "】対象ファイルなし" & vbCr _
          & "対象ファイルを準備後、処理して下さい。"
  End If
End Function

前任者の方が コードにコメントをつけておいてくださったので、プログラム
の流れがつかめたのですが、それによりますと、
まず このマクロが書いてあるBookを立ち上げると、
2つのBook
    "TEC103イベント一覧.xls"
    "TEC104イベント対応.xls"
を開いて、UserForm上で更新処理をするようですね?

で、2つのBookが 最初に開くこのBook(ThisWorkbook) の保存されている
フォルダと同じフォルダにあればいいのですが、何らかの事情で、このBook
のあるフォルダのサブフォルダとか、このBookのあるフォルダと同列の別フォ
ルダとかに保存されていたばあい、それを探しに行くために

> Function File_Search()

があるようなのですね。

一つ目が "TEC103イベント一覧.xls" の存在チェックで、これがこのBook と
同じフォルダ内になかったばあい、
以下で、他のフォルダ(近所からだんだん上位フォルダに範囲を広げて)に
検索に行っています。

>' イベント一覧.xlsの存在チェックで、NGの場合、再度検索を行う。
>' └イベント一覧 検索
>  If Open_SW1 = "NG" Then
>    WK_Name = "TEC103イベント一覧.xls"
>    WK_Path = ""
>  
>    File_Search   'イベント一覧.xlsの検索
>  
>    If Open_SW = "Error" Then Exit Sub
>  
>    AD_Name1 = WK_Name
>    AD_Path1 = WK_Path '検索出来たイベント一覧.xlsの絶対パスをセット
>  End If

2つめは イベント対応.xls のほうで、以下です。

> ' イベント対応.xlsの存在チェックで、NGの場合、再度検索を行う。
> ' └イベント対応 検索
>  If Open_SW2 = "NG" Then
>    WK_Name = "TEC104イベント対応.xls"
>    WK_Path = ""
>  
>    File_Search   'イベント対応.xlsの検索

>    If Open_SW = "Error" Then Exit Sub
>    AD_Name2 = WK_Name
>    AD_Path2 = WK_Path '検索出来たイベント対応.xlsの絶対パスをセット
>  End If

そしてこれ以外に FileSearch を呼び出しているところはありません。
作られた方は 「自動で」必要なファイルを開く、ということにたいへんこだわって
いらっしゃるようで、そのようなコーディングが随所にみられます。
その代わり、
対象とするBookのファイル名は
>    "TEC103イベント一覧.xls"
>    "TEC104イベント対応.xls"
に固定ですから、事情があって、他のファイル名で同じ処理をしようとしても
それができません。
ぼくがつくるなら、Application.GetOpenFilename メソッドをつかって
イベント一覧用Bookと イベント対応用Book を ユーザーにダイアログ使って
選択させます。
そうすれば、名前が変更されていても、マクロブックと同じフォルダになくても
ユーザーが指定したファイルをもとに処理ができるようになります。
このなが〜いプログラムはほとんど数行に簡素化できるでしょう。

13 hits

【75965】exvel2013でのFileSearchの代替について 佐藤 小次郎 14/8/12(火) 23:15 質問
【75966】Re:exvel2013でのFileSearchの代替について kanabun 14/8/12(火) 23:23 発言
【75967】Re:exvel2013でのFileSearchの代替について 佐藤小次郎 14/8/13(水) 0:37 質問
【75968】Re:exvel2013でのFileSearchの代替について γ 14/8/13(水) 8:27 発言
【75971】Re:exvel2013でのFileSearchの代替について 佐藤小次郎 14/8/13(水) 12:02 お礼
【75969】Re:exvel2013でのFileSearchの代替について kanabun 14/8/13(水) 9:40 発言
【75970】Re:exvel2013でのFileSearchの代替について 佐藤小次郎 14/8/13(水) 12:00 お礼
【75972】Re:exvel2013でのFileSearchの代替について kanabun 14/8/13(水) 15:05 発言
【75973】Re:exvel2013でのFileSearchの代替について 佐藤小次郎 14/8/13(水) 15:56 お礼
【75974】Re:exvel2013でのFileSearchの代替について kanabun 14/8/14(木) 17:44 発言
【75975】Re:exvel2013でのFileSearchの代替について 佐藤 小次郎 14/8/14(木) 18:52 お礼
【75976】Re:exvel2013でのFileSearchの代替について 佐藤 小次郎 14/8/14(木) 19:52 お礼
【75977】Re:exvel2013でのFileSearchの代替について kanabun 14/8/14(木) 20:37 発言
【75978】Re:exvel2013でのFileSearchの代替について kanabun 14/8/14(木) 23:05 発言

6361 / 76734 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free