- ベストアンサー
VBAで次のような処理をできるかどうか教えてください
あるフォルダにエクセルファイルが複数入っています。また同時にサブフォルダがあり、その中にもファイルが入っていて、その中もサブフォルダがはいっていて・・・この時、全てのファイルのA1に数値が入っているとして、このA1の数値を全部足したモノを新規のExcelブックを作り、そのA1に値を表示させたいみたいな事はできるでしょうか?もしくは実現するにはVBのような言語を使わないといけないのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
やり方としては、以下の形になります。 必要なAPIは以下の3つです。 'ファイル検索 Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long '次ファイル検索 Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long '検索ハンドル開放 Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long APIで使用する構造体は以下の通りです Private Type WIN32_FIND_DATA dwFileAttributes As Long 'ファイル属性 ftCreationTime As FILETIME '作成日 ftLastAccessTime As FILETIME '最終アクセス日 ftLastWriteTime As FILETIME '更新日 nFileSizeHigh As Long 'ファイルサイズ(上位) nFileSizeLow As Long 'ファイルサイズ(下位) dwReserved0 As Long ' dwReserved1 As Long ' cFileName As String * MAX_PATH 'ファイル名 cAlternate As String * 14 'ファイル名(8.3Ver) End Type Private Function mSheachFile(ByVal vstrRoot As String) Dim lngHndle As Long '検索ハンドル Dim lngRet As Long '検索結果 Dim usrWin32Fnd As WIN32_FIND_DATA 'ファイル情報 Dim intStLen As Integer '文字検索値 Dim strFileName As String 'ファイル名 'パス符号追加 If Right(vstrRoot, 1) <> "\" Then vstrRoot = vstrRoot & "\" 'フォルダ検索 lngHndle = FindFirstFile(vstrRoot & "*.*", usrWin32Fnd) If lngHndle <> INVALID_HANDLE_VALUE Then '検索結果あり Do 'NULL文字を削除する intStLen = InStr(usrWin32Fnd.cFileName, vbNullChar) - 1 If intStLen > 0 Then '文字があれば取得ファイルの属性を調査 strFileName = Left(usrWin32Fnd.cFileName, intStLen) If usrWin32Fnd.dwFileAttributes = vbDirectory Then '取得ファイルの属性がフォルダ If strFileName <> "." And strFileName <> ".." Then 'フォルダ内を検索する Call mSheachFile(vstrRoot & strFileName) End If Else 'ファイル内を検索する Call mFileChek(vstrRoot & strFileName) End If End If '次検索 usrWin32Fnd.cFileName = String(Len(usrWin32Fnd.cFileName), vbNullChar) lngRet = FindNextFile(lngHndle, usrWin32Fnd) Loop While lngRet <> 0 End If FindClose (lngHndle) '検索終了 End Function
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 Office カテゴリでも同じような内容がありましたが、 FileSearch オブジェクトか、1番さんの再帰の方法(私は使わないけれど)とか、他にも方法があります。ただ、FileSearch オブジェクトは使い勝手が悪いです。 できないわけではありませんが、ただ、こう言っては実も蓋もありませんが、Office 系では、フォルダを掘り下げていくということはあまりしませんね。せいぜい、ファイル検索までで、開けたりはしません。
- nicotinism
- ベストアンサー率70% (1019/1452)
『あるフォルダ』の指定が一番のネックだと思います。 (OS(IE)のバージョンによって回答も替わると思いますよ) OS と Excel のバージョンを明記されたら宜しいのでは? > そのA1に値を表示させたいみたいな事はできるでしょうか? はい > VBのような言語を使わないといけないのでしょうか? いいえ VBA で可能です
- tsukasa-12r
- ベストアンサー率65% (358/549)
VBA の DIR() 関数を使用して、再帰呼び出しの関数 ( 自分で自分を呼び出す関数 ) を作ればできると思います。