Excel VBA質問箱 IV

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

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


1157 / 13645 ツリー ←次へ | 前へ→

【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 発言[未読]

【75965】exvel2013でのFileSearchの代替について
質問  佐藤 小次郎 E-MAIL  - 14/8/12(火) 23:15 -

引用なし
パスワード
   excel2003〜excel2013にしましたら
それまで使っていたツールが動かなくなりました。

FileSearchが使えません。
FilesystemObjectを使えばよいそうなのですが
どのように直せばよいのか分かりません。

下記のものなのですが、お時間を頂ける方がおられましたらお教えください。

誠に恐縮ですが、よろしくお願いいたします。


Function File_Search() ' ファイル検索
  Open_SW = "OK"
  Set fs = Application.FileSearch
  j = Cnt(0)
  Do Until j = 0
    With fs
     .LookIn = Left(TL_Path, Cnt(j)) '検索するフォルダのセット
     .SearchSubFolders = True 'フォルダ配下のフォルダ内も検索する
     .Filename = WK_Name '検索するファイル名のセット
      
     '検索出来たファイル数が0以下のときは、エラー
     If (.Execute < 1) And (j = 1) Then
       MsgBox "【 " & WK_Name & " 】 対象ファイルなし" _
         & vbCr & vbCr _
         & "対象ファイルを準備後、処理して下さい。"
       Open_SW = "Error"
       Exit Function
     
     ElseIf .Execute > 0 Then '検索出来たファイル数が1以上のとき
       For i = 1 To .Execute
         '検索出来たファイル中に、同名ファイルが存在した場合、
         'フォルダのパスをセット
         If "\" & .Filename = Right(.FoundFiles(i), 17) Then
           WK_Path = .FoundFiles(i)
           Exit Do
         End If
       Next
     End If
    End With
    j = j - 1
  Loop
End Function

書き換えをお願いできないでしょうか。
よろしくお願いいたします。

【75966】Re:exvel2013でのFileSearchの代替につい...
発言  kanabun  - 14/8/12(火) 23:23 -

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

ht tp://moug.net/faq/viewtopic.php?t=70050
でコメントしましたように、
何をしようとしているのか、日本語で説明を!お願いします。

  j = Cnt(0)
  Do Until j = 0

Cnt ってなんですか?
Cnt(0) には 通常何が入っているのですか?

【75967】Re:exvel2013でのFileSearchの代替につい...
質問  佐藤小次郎 E-MAIL  - 14/8/13(水) 0:37 -

引用なし
パスワード
   ▼kanabun さん:

大変申し訳ありません。

Option Explicit

  Public TS_Sht      As Worksheet    ':  Set Ts_Sht = Worksheets("テスト用")

  Public AD_Sht      As Worksheet     ' 管理設定シート
  Public EL_Sht      As Worksheet     ' イベント一覧シート(Event-List)[List:表]
  Public EC_Sht      As Worksheet     ' イベント対応シート(Event-Cope)[Cope:対処]
  Public WK_Sht      As Worksheet     ' ワーク用シート

  Public fs        As Variant
  Public fi        As Variant

  Public Open_SW     As String      ' オープンエラー確認[エラー有:Error エラー無:OK]
  Public Open_SW1     As String      ' 現在の設定イベント一覧確認[有:OK 無:NG]
  Public Open_SW2     As String      ' 現在の設定イベント対応確認[有:OK 無:NG]
  Public TL_Name     As String      ' 起動ツール名(ファイル名)
  Public TL_Path     As String      ' 起動ツールのフルパス名
  Public WK_Name     As String      ' ワーク用イベント一覧名(ファイル名)
  Public WK_Path     As String      ' ワーク用イベント一覧のフルパス名
  
  Public WK_Path2     As String      ' 参照のフルパス名
  
  Public WK_Date1     As String      ' ワーク用更新日1
  Public WK_Date2     As String      ' ワーク用更新日2
  Public AD_Name1     As String      ' 現在の設定イベント一覧内容(ファイル名)
  Public AD_Name2     As String      ' 現在の設定イベント対応内容(ファイル名)
  Public AD_Path1     As String      ' 現在の設定イベント一覧内容のフルパス名
  Public AD_Path2     As String      ' 現在の設定イベント対応内容のフルパス名
  Public AD_Proc1     As String      ' イベント一覧の更新処理(ON:処理あり OFF:処理なし)
  Public AD_Proc2     As String      ' イベント対応の更新処理(ON:処理あり OFF:処理なし)
  Public Name1      As String      ' イベント一覧名(ファイル名)
  Public Name2      As String      ' イベント対応(ファイル名)
  Public Path1      As String      ' イベント一覧のフルパス名
  Public Path2      As String      ' イベント対応のフルパス名
  Public Folder_Name   As String      ' 当ツールの上位フォルダ名
  Public AD_Date1     As String      ' 管理設定シート上のイベント一覧表の更新日
  Public AD_Date2     As String      ' 管理設定シート上のイベント対応表の更新日
  Public Cnt(60)                ' カウンタの配列(イベント表検索にて使用)

  Public WK_Box1     As String      ' 検索画面 クラス  選択コンボボックス用
  Public WK_Box2     As String      ' 検索画面 メッセージ選択コンボボックス用
  Public WK_Box3     As String      ' 対応画面 クラス  選択コンボボックス用
  Public WK_Box4     As String      ' 対応画面 対応クラス選択コンボボックス用

  Public Search_Code1   As String      ' 検索画面にて選択した障害の対応コード引渡し用(対応表示用)
  Public Search_Code2   As String      ' 検索画面にて選択した障害の対応コード引渡し用(対応種類用)

  Public List_End, Cope_End          ' ワークエリア
  Public EL_Cnt, EC_Cnt
  Public EL_Disp_S, EL_Disp_E, EC_Disp_S, EC_Disp_E
  Public i, j, k                ' 添字エリア

Sub Auto_Open()

  Application.DisplayAlerts = False  ' Display 非表示
'  Application.DisplayAlerts = True  ' Display 表示

  Application.Visible = False

'  Application.ScreenUpdating = False

' 初期値設定処理
  Variable_Set

' ファイルチェック(当ツールで使用するExcelの、イベント一覧.xls・イベント対応.xls がオープンされている時は、クローズする)
  i = Workbooks.Count
  Do Until i = 1
    If (Workbooks(i).Name = "TEC103イベント一覧.xls") Or _
      (Workbooks(i).Name = "TEC104イベント対応.xls") Then
      Workbooks(i).Close SaveChanges:=False
    End If
    i = i - 1
  Loop

' 現在の設定ファイルの有無確認
  Open_SW1 = "NG"
  Open_SW2 = "NG"
  
' イベント一覧.xls・イベント対応.xls の存在チェック
' 存在する場合は、Open_SWにOKがセットされる

  File_Open_CHK

' ファイル 検索
' └フォルダ 検索
  i = 1
  j = 1
  Do Until InStr(i, TL_Path, "\") = 0    'TL_Path = 当ツールのフルパス名 (¥全てを検索し終わるまで繰り返す)
    Cnt(j) = InStr(i, TL_Path, "\")    'Excelブック名の前に付いている¥の位置をセットする
    i = Cnt(j) + 1             'i = 当ツール名の先頭の位置
    j = j + 1               'j = ¥検索の為に繰り返した回数 = カウンタ配列のセットされたカウンタの位置
  Loop
  Cnt(0) = j - 1
  
' イベント一覧.xlsの存在チェックで、NGの場合、再度検索を行う。
' └イベント一覧 検索
  If Open_SW1 = "NG" Then
    WK_Name = "TEC103イベント一覧.xls"
    WK_Path = ""
    
    File_Search   'イベント一覧.xlsの検索
    
    If Open_SW = "Error" Then
      Exit Sub
    End If
    
    AD_Name1 = WK_Name
    AD_Path1 = WK_Path '検索出来たイベント一覧.xlsの絶対パスをセット
  End If
  
' イベント対応.xlsの存在チェックで、NGの場合、再度検索を行う。
' └イベント対応 検索
  If Open_SW2 = "NG" Then
    WK_Name = "TEC104イベント対応.xls"
    WK_Path = ""
    
    File_Search   'イベント対応.xlsの検索
    If Open_SW = "Error" Then
      Exit Sub
    End If
    AD_Name2 = WK_Name
    AD_Path2 = WK_Path '検索出来たイベント対応.xlsの絶対パスをセット
  End If

  Set fs = CreateObject("Scripting.FileSystemObject")       ' 日付取得

' イベント一覧・対応の更新日チェック
  For i = 1 To 2
    Select Case i
      Case 1:   Set fi = fs.getfile(AD_Path1)        ' イベント一覧セット
            WK_Date1 = AD_Date1             
      Select Case i
        Case 1:   AD_Proc1 = "ON"             ' イベント一覧更新処理あり
              AD_Sht.Cells(2, 3) = WK_Date2      ' 管理情報シートの最新データに、イベント一覧の最終更新日をセット
              
        Case 2:   AD_Proc2 = "ON"             ' イベント対応更新処理あり
              AD_Sht.Cells(3, 3) = WK_Date2      ' 管理情報シートの最新データに、イベント対応の最終更新日をセット
      End Select
    End If
  Next

'  Application.WindowState = xlMinimized    ' テストの為に最小化
  
' 当ツールの保持する2つのExcelの最終更新日よりも、実際の更新日が新しい場合のみ、更新用のフォームを開く
  If (AD_Proc1 = "ON") Or (AD_Proc2 = "ON") Then
    Uf_Main.Show
  Else
    Uf_Search.Show
'    MsgBox "Search"
  End If

End Sub

' * Function領域 スタート
'
Function Variable_Set()                  ' シート名・パス名等のセット

' シート設定
  Set AD_Sht = Worksheets("管理設定")
  Set EL_Sht = Worksheets("イベント一覧")
  Set EC_Sht = Worksheets("イベント対応")

' ツール情報設定
  TL_Name = ActiveWorkbook.Name               'Excelの名前のセット
  TL_Path = ActiveWorkbook.FullName             'Excelのフルパス&名前のセット

' 管理設定シート情報セット
  AD_Path1 = AD_Sht.Cells(6, 2)  'TEC103イベント一覧.xlsのパス
  AD_Path2 = AD_Sht.Cells(7, 2)  'TEC104イベント対応.xlsのパス
  AD_Name1 = AD_Sht.Cells(6, 5)  'TEC103イベント一覧
  AD_Name2 = AD_Sht.Cells(7, 5)  'TEC104イベント対応
  AD_Date1 = AD_Sht.Cells(2, 2)
  AD_Date2 = AD_Sht.Cells(3, 2)
  AD_Proc1 = "OFF"
  AD_Proc2 = "OFF"

End Function

Function File_Open_CHK()          ' 関連Excelの、イベント一覧・イベント対応のオープン・クローズによって、存在をチェックする

On Error GoTo Open_Error          ' オープンエラーの場合、Open_Errorに飛ぶ

  Dim SW

'存在チェックのため、イベント一覧.xlsを開いて閉じる
'AD_Path1 : イベント一覧.xlsのフルパス名(管理設定シート内)

Open_Event1:
  SW = 1
  Workbooks.Open Filename:=AD_Path1  'TEC103イベント一覧.xlsのオープン
  ActiveWorkbook.Close
  Open_SW1 = "OK"

'存在チェックのため、イベント対応.xlsを開いて閉じる
'AD_Path2 : イベント対応.xlsのフルパス名(管理設定シート内)

Open_Event2:
  SW = 2
  Workbooks.Open Filename:=AD_Path2  'TEC104イベント対応.xlsのオープン
  ActiveWorkbook.Close
  Open_SW2 = "OK"

  Exit Function

Open_Error:
  If Err.Number <> 1004 Then  'ファイルが存在しないとき以外のエラーの場合
    MsgBox Err.Description
    Exit Function
  End If

  If SW = 1 Then        '2つ目のファイルのオープンが行われていない場合
    Resume Open_Event2    'Open_Event2に飛ぶ
  End If

End Function

Function File_Search()                   ' ファイル検索

  Open_SW = "OK"

  Set fs = Application.FileSearch
  j = Cnt(0)
  Do Until j = 0
    With fs
      .LookIn = Left(TL_Path, Cnt(j))    '検索するフォルダのセット
      .SearchSubFolders = True        'フォルダ配下のフォルダ内も検索する
      .Filename = WK_Name          '検索するファイル名のセット
      
      If (.Execute < 1) And (j = 1) Then   '検索出来たファイル数が0以下のときは、エラー
        MsgBox "【 " & WK_Name & " 】 対象ファイルなし " & Chr(10) & Chr(10) & _
            "対象ファイルを準備後、処理して下さい。"
        Open_SW = "Error"
        Exit Function
      End If

      If .Execute > 0 Then          '検索出来たファイル数が1以上のとき
        For i = 1 To .Execute       '検索出来たファイル中に、同名ファイルが存在した場合、フォルダのパスをセット
          If "\" & .Filename = Right(.FoundFiles(i), 17) Then
            WK_Path = .FoundFiles(i)
            Exit Do
          End If
        Next
      End If
    End With
    j = j - 1
  Loop

End Function

【75968】Re:exvel2013でのFileSearchの代替につい...
発言  γ  - 14/8/13(水) 8:27 -

引用なし
パスワード
   FileSearch は Office2007以降は含まれていませんから、
「FileSearch 2007」などとネット上で検索すれば、いくらでも
見つかります。
例えば、
ht tp://d.hatena.ne.jp/language_and_engineering/20090429/p1
はどうですか?

これほどのコードを書けるかたが、
>書き換えをお願いできないでしょうか。
というのはどうなんでしょうか?

上のサイトの記事を参考に、自分で書換えてください。
コンパイルエラーがでるようなコードを、
下請けして書き換える暇もないです。
# まあ、私のコメントも労力節約型だから、同じ穴の狢ですけど。

【75969】Re:exvel2013でのFileSearchの代替につい...
発言  kanabun  - 14/8/13(水) 9:40 -

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

>  Public WK_Name  As String'ワーク用イベント一覧名(ファイル名)
>  Public WK_Path  As String ' ワーク用イベント一覧のフルパス名

>  Public Cnt(60)  ' カウンタの配列(イベント表検索にて使用)

>  Public i, j, k                ' 添字エリア
>
>Sub Auto_Open()

ぼくは Cnt(0) って何ですか?と聞いたのですから、〜用カウンタの配列
で Cnt(0) には 通常 5〜10くらいのカウンタが入っています... とか、
そういうことが知りたかったのですが。

元の Function File_Search() を
Function File_Search_Old()
とかに名前を変えてから、
以下の あたらしい Function File_Search() を挿入して、
試してみてください。

このコードは
ht tp://www.vbalab.sakura.ne.jp/vbaqa/c-board.cgi?cmd=one;no=74578;id=excel
を参考に、DirコマンドによりFileSearch代替処理を行っています。

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
  
  Open_SW = "OK"
  j = cnt(0)
  Do Until j = 0
    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 FileLen(tmpPath) < 2 Then ng = -10 'ファイルなし
    If ng Then
      MsgBox "【" & WK_Name & "】対象ファイルなし" & vbCr _
          & "対象ファイルを準備後、処理して下さい。"
      Open_SW = "Error"
      Exit Function
    End If

    '----- Dirコマンドで取得したファイル名を配列に格納
    Dim n As Long
    Dim io As Integer
    Dim buf() As Byte
    Dim FoundFiles() As String
    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)
    n = UBound(FoundFiles) - 1
    ReDim Preserve FoundFiles(n)
    '同名ファイルが存在した場合、フォルダのパスをセット
    For i = 0 To n
      If "\" & Filename = Right$(FoundFiles(i), 17) Then
        WK_Path = FoundFiles(i)
        Exit Do
      End If
    Next
    
    j = j - 1
  Loop

End Function

Public 変数が多用されているので、
何がどう関係しているのか、サッパリ分りませんので、コードの字面だけ
Dirコマンドに置換しただけです。
うまく行くかどうかは たぶん 半々です。

それにしても

> Public i, j, k

はどうみてもおかしいですね?

【75970】Re:exvel2013でのFileSearchの代替につい...
お礼  佐藤小次郎 E-MAIL  - 14/8/13(水) 12:00 -

引用なし
パスワード
   ▼kanabun さん:

お手数をおかけいたしました。

ありがとうございました。

なんとか修正してみます。

今はいないものが作っておいていったものでした。

親身になりご心配していただき、とても嬉しかったです。

【75971】Re:exvel2013でのFileSearchの代替につい...
お礼  佐藤小次郎 E-MAIL  - 14/8/13(水) 12:02 -

引用なし
パスワード
   ▼γ さん:

ありがとうございます。

なんとか、みてみます。

【75972】Re:exvel2013でのFileSearchの代替につい...
発言  kanabun  - 14/8/13(水) 15:05 -

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

>親身になりご心配していただき、とても嬉しかったです。

他の掲示板の方にもレスがついています。

ここの掲示板の基本ポリシーにもありますように、
> 質問しっぱなし、というのはモラルに反します。
> 解決したからいいや」というのではありません。

善処してください。

【75973】Re:exvel2013でのFileSearchの代替につい...
お礼  佐藤小次郎 E-MAIL  - 14/8/13(水) 15:56 -

引用なし
パスワード
   ▼kanabun さん:
 
大変失礼いたしました。

早急に対処いたします。

ありがとうございました。

【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 を ユーザーにダイアログ使って
選択させます。
そうすれば、名前が変更されていても、マクロブックと同じフォルダになくても
ユーザーが指定したファイルをもとに処理ができるようになります。
このなが〜いプログラムはほとんど数行に簡素化できるでしょう。

【75975】Re:exvel2013でのFileSearchの代替につい...
お礼  佐藤 小次郎  - 14/8/14(木) 18:52 -

引用なし
パスワード
   ▼kanabun さん:

ありがとうございます。

先程から教えていただきましたとおりにやっております。

なかなかうまくできなく、ご報告が遅れてしまっております。

結果が分かり次第、ご報告させて頂きます。

親身なご指導、ありがとうございます。

【75976】Re:exvel2013でのFileSearchの代替につい...
お礼  佐藤 小次郎  - 14/8/14(木) 19:52 -

引用なし
パスワード
   ▼kanabun さん:

ご高配、ご心配ありがとうございます。


>    If ng Then
>      MsgBox "ファイル検索時にエラーが発生しました." & vbCr _
>       & "処理を中断します", , LookIn & Filename
>      Open_SW = "Error"
>      Exit Function
>    End If

のところで、

D:\運行管理¥Tpt300運行支援TOOL¥D:運行管理¥Tpt300運行支援TOOL
ファイル検索時にエラーが発生しました.
処理を中断します

表示されエラーとなってしまいます。

kanabunさまの大切なお時間をいただきましてありがとうございます。

これ以上、ご迷惑をおかけすることに心が痛むと同時に、kanabunさまに
書いていただいたものを見ながら、考えていきたいと思います。

できたら、ご報告させて頂きます。

ありがとうございました。

【75977】Re:exvel2013でのFileSearchの代替につい...
発言  kanabun  - 14/8/14(木) 20:37 -

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

ひまだから、デバッグにお付き合いしますよ(^^

>▼kanabun さん:

>D:\運行管理¥Tpt300運行支援TOOL¥D:運行管理¥Tpt300運行支援TOOL
>ファイル検索時にエラーが発生しました.
>処理を中断します

↑のファイルパス、全然おかしいですね

\がとちゅうから¥に代わり、
また D:\運行管理¥Tpt300運行支援TOOL と
   D:運行管理¥Tpt300運行支援TOOL とが結合していますね!
なぜそうなるのか、
どこから呼び出したときにそうなるのか 考えてみましょう。

Mainのほうで 先ほどコメントしたとうり、 File_Search を呼び出している
ところは 2か所ありますね?

その2か所に ブレークポイントを置きましょう。(その行をマウスでポイント
して、ファンクションキーの[F9]を押してください。そうするとその行で
プログラムの実行がSTOP します)

Sub Auto_Open() を[F5]キーで実行します。
プログラムの実行は ブレークポイントで一時中断します。
そしたら [F8]キーを押してください。
[F8]キーはコードを一行だけ実行します。
コードの実行が Function File_Search() のほうに移ったら、コードを一行
[F8]で実行するたびに、実行行の変数が どのような値になったかを マウスを
変数のところにあてがって確認してください。
たとえば、
>   LookIn = Left(TL_Path, Cnt(j)) '検索するフォルダ
を実行した後の LookIn の値、

また、
>    Filename = WK_Name       '検索するファイル名
を実行した後の Filename の値。

>  If Right$(LookIn, 1) <> "\" Then LookIn = LookIn & "\"
を実行した後の LookInの値。


>    Filename = LookIn & Filename

な、なんと!! 原因が分りました。↑ココです。
ここで Filename を LookIn & Filename としていますが、実は この行は
不要な行だったのです。

すぐ後の行で
> sCmd = "DIR """ & LookIn & Filename & """ /b/s/a:-D > """ _
        & tmpPath & """"  '' /b ファイル名のみ

としていますから、先行して

>    Filename = LookIn & Filename

としておく必要はなかったんです。

ごめんなさい。とりあえず

>    Filename = LookIn & Filename

の一行削除してください。
こういうのを デバッグといいます。

【75978】Re:exvel2013でのFileSearchの代替につい...
発言  kanabun  - 14/8/14(木) 23:05 -

引用なし
パスワード
   なんどもスミマセン m(_ _)m

また不具合が見つかりました。
主な変更は ◆か所ですが、他もあちこちブラッシュアップしてますので、
そっくり差し替えてください。

Function File_Search()  'Dirコマンドによるファイル検索(Ver.3)
  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 ss As String
  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コマンドによるサブフォルダを含むファイル名の検索
    tmpPath = Environ$("Temp") & "\Dir.tmp" '一時ファイルパス

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

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

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