• ベストアンサー

VBAで次のような処理をできるかどうか教えてください

あるフォルダにエクセルファイルが複数入っています。また同時にサブフォルダがあり、その中にもファイルが入っていて、その中もサブフォルダがはいっていて・・・この時、全てのファイルのA1に数値が入っているとして、このA1の数値を全部足したモノを新規のExcelブックを作り、そのA1に値を表示させたいみたいな事はできるでしょうか?もしくは実現するにはVBのような言語を使わないといけないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#118114
noname#118114
回答No.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)
回答No.3

こんにちは。 Office カテゴリでも同じような内容がありましたが、 FileSearch オブジェクトか、1番さんの再帰の方法(私は使わないけれど)とか、他にも方法があります。ただ、FileSearch オブジェクトは使い勝手が悪いです。 できないわけではありませんが、ただ、こう言っては実も蓋もありませんが、Office 系では、フォルダを掘り下げていくということはあまりしませんね。せいぜい、ファイル検索までで、開けたりはしません。

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

『あるフォルダ』の指定が一番のネックだと思います。 (OS(IE)のバージョンによって回答も替わると思いますよ) OS と Excel のバージョンを明記されたら宜しいのでは? > そのA1に値を表示させたいみたいな事はできるでしょうか? はい > VBのような言語を使わないといけないのでしょうか? いいえ VBA で可能です

回答No.1

VBA の DIR() 関数を使用して、再帰呼び出しの関数 ( 自分で自分を呼び出す関数 ) を作ればできると思います。

関連するQ&A

  • VBA

    ACCESS2003やEXCEL2003のVBAでプログラムしようとしています。 所定のフォルダ内にあるファイルを、ファイル名を指定して検索する方法を教えてください。 【条件】 (1)所定のフォルダ  このフォルダには、大量のファイルがあります。  サブフォルダも存在して、その中にも検索するファイルがあります。  サブフォルダの階層もランダムです(サブフォルダの中にさらに  フォルダがあり、その中にもファイルがある場合があります)。  探すファイルは、複数存在する場合(フォルダ違いで)も  ありますが、すべて検索します。 条件が酷のような気がしますが、なるべく早い検索方法はあれば 幸いです。よろしくお願いします。

  • EXCEL2000でのVBAについて

    お世話になります。 EXCEL2000のVBで下記のことをしたいのですが、うまく出来ないところがあり対処方法を教えて頂きたいです。 (1)アクティブブックの名前を取得   (2)ブックのセルA1の値を取得 (3)保存ダイアログでA1の値をファイル名にし保存 (4)保存したファイルを閉じる (5)基のアクティブブックを再度開く 以上です。 今できていないのは(1)と(5)です。 基のアクティブブックの名前をプログラム上に直接入力する分には出来るのですが、 ファイル名が変更になった時に、いちいちVBを書き換えるのが面倒なだけです… コードを提示しますので、ご教授願えればと思います。 Sub 保存() Dim ファイル名 As String, フォルダ名 As Object, フォルダ選択 As Object, ファイル名2 As Workbook Set ファイル名2 = ActiveWorkbook ファイル名 = Range("A1").Value Set フォルダ選択 = CreateObject("Shell.Application") Set フォルダ名 = フォルダ選択.BrowseForFolder(0, "保存フォルダを選んでください", 1) ActiveWorkbook.SaveAs Filename:=フォルダ名.items.Item.Path & "\" & ファイル名 & ".xls" MsgBox ファイル名 & ".xls", vbOKOnly, フォルダ名 & "に保存しました" Workbooks.Open "C:\test\" & ファイル名2 Workbooks(ファイル名 & ".xls").Close End sub ファイル名の取得が間違っていると思うのですが、ネットなどで調べてみましたが、よくわかりませんでした。

  • Excel VBAマクロで複数のファイルから読み出し

    Excel2002を使用して、以下のような処理を実現しようとしています。 1. ある特定のフォルダに格納されている複数の *.xls ファイルを順番に開く 2. 先頭のシートの特定のセル(例えばA1~D1)の値をコピーして、適当なBOOKのSheet1に上から順に貼り付け、表にする。(最初はA1~D1に貼り付け、次はA2~D2、A3~D4・・・とファイルの数だけ繰り返す) 上記1.の実現方法がよく分かりません。ヘルプを見てもどうも要領を得なくて。 JavaやC,C++のプログラミング経験はあります。 また、VBAマクロも簡単なものなら作成経験があります。 よろしくおねがいします。

  • 【Excel VBA】1つのファイルにまとめる方法

    1つのフォルダの中に複数のExcelファイルが保存されています。 seat1だけを1つに集めたExcelファイルを新規で作成したいです。 ※シート1をどんどん追加させるイメージです。 ※フォルダの中に入っているExcelファイル数は毎月変わります。 手順(1)フォルダに入っているExcelシートを開く 手順(2)sheet1を【シートの移動またはコピー】新規BOOKにコピー 手順(3)フォルダに入っているExcel分繰り返す。 手順(4)シート名を変更する。    どういう風にVBAコードを記入すればいいかわからないので教えていただきたいです。どうぞよろしくお願いいたします。

  • VBAでのファイル削除処理

    excelの表の第一列目にファイル名が複数(数は任意)かかれたリストがあるとします.この表を表Aと呼ぶことにします. 別にフォルダーがあり,そのフォルダーの中に複数(任意)のファイルが入っているとします.このフォルダーをフォルダーBとします. 次の処理を行うプログラムを考えていますが,VBAで可能でしょうか.できるとすれば,基本的な部分だけでも教えて頂ければありがたいのですが. フォルダーBを指定して,さらに表Aに書かれているxlsファイルを指定して,Bに書かれているファイル名の中に表Aに書かれたファイル名が一致するものがあれば,ファオルダーBの中から削除する.

  • フルパスの取得

    あるフォルダの中にあるすべてのファイル(サブフォルダ内のファイルを含めて)のフルパスを取得するにはどうしたらよいのでしょうか?これはFSOで実現できるのでしょうか?それともFSOなど使わなくてもできるのでしょうか? よろしくお願いします。 (使っているのはVB6.0です)

  • Excel VBA インデックスが有効範囲にない

      よろしくお願いします。 Excel VBA 初心のものです。 プログラムを作ってみたのですが、 「インデックスが有効範囲にありません」となってその先に進めません。 ソースですが ------------------------------------------------------ Private Sub CommandButton1_Click() Dim buf As String, cnt As Long Dim TMP As Variant Const Path As String = "D:\Excel\sample\" buf = Dir(Path & "*.xls*") Set TMP = Workbooks(buf).Sheets("testdata").Range("A1").Value Do While buf <> "" cnt = cnt + 1 Cells(cnt, 1) = buf Cells(cnt, 2) = FileDateTime(Path & buf) Cells(cnt, 3) = TMP buf = Dir() Loop End Sub ------------------------------------------------------ エラーになる箇所は Set TMP = Workbooks(buf).Sheets("testdata").Range("A1").Value のところです。 このプログラムで何をしたいかと言いますと DドライブのExcel>sample というフォルダの中にある ・すべてのエクセルブック名(ファイル数は3個)と、 ・そのブックの作成日時と、 ・testdataというシート(各ブックに必ずあるシートです)のセルA1に入っている値 を実行ファイルのSheet1に書き出す、 というものです。 プログラムの実行ファイルはExcelフォルダ直下にあります。 どこが問題でエラーになっているのか分かりません。 ご指南よろしくお願いします。   

  • Excel VBAでサブフォルダ内のファイルを呼び出したい

    フォルダの下に複数階層のサブフォルダがあり、その下に複数のエクセルブックがあります。これらのブックのシート複数ですが、名前は統一されています。 これらのファイルを呼び出した上でのある特定の名前のシートを呼出し、それぞれ1枚のシートに上から順に貼り付けたいと考えています。 よろしくご教授お願いします

  • VBA どのように記述すれば良いか教えてください。

    はじめて、質問させていただきます。 まだExcel VBAの勉強を始めたばかりの者です。 下記のようなツールを作ることになったのですが、非常に困っています。どなたかわかる方がみえましたら、どうか教えて下さい。(Excel2003を利用) <すべてAという同じフォルダ内> book1.xls book2.xls ・  ・ book*.xls →ファイル数は変動します。集計.xls以外のファイルはすべて同じシート名で構成されて         います。すべてのファイルのシート名 ”結果”が対象です。 集計.xls →このファイルにマクロを作りたいです。        シート名が1、2、3・・と116まで用意されています。 __________________________________________________________________________________________________________________________________ Aフォルダ内の複数ファイルの同じシート名(”結果”)というシートのみコピーをし、同じフォルダ内のファイル「集計.xls」のシートへ値貼り付けをしたいのですが、 一番初めにコピーしたシートを「集計.xls」の1という名のシートへ値貼り付け、2番目にコピーしたシートは「集計.xls」の2という名のシートへ値貼り付け。。3番目にコピーしたシートは「集計.xls」の3という名のシートへ値貼り付け。。というのを、シート数分繰り返す。。という記述を教えて頂きたいのです。 ループ??ですが、【一番初めにコピーしたシートを「集計.xls」の1という名のシートへ値貼り付け】 次に【2番目にコピーしたシートは「集計.xls」の2という名のシートへ値貼り付け】というのを一連の流れにしてループ処理したいのです。 こんなこと出来るのでしょうか??  初心者とはいえ丸投げは駄目だと、1週間ほどネットやいろいろなテキストで自分で何とかできないかと頑張ってみたのですが、部分部分しか記述できず時間だけが過ぎていき。。すっかり行き詰ってきてしまいました。 どうかお力を貸してください。宜しくお願い致しますm(uu)m

  • 複数ブックの特定のセルを合計したいです

    中を見ていただき、ありがとうございます。 似たような質問・ご回答があるのは重々承知しておりますが できるだけシンプルなコードを教えていただきたく、質問させていただきました。 さて、いま1つのフォルダ内に,複数のブック(ファイル)が入っています。 すべてのブックはExcel2007で作成しており、目的の作業もExcel2007で行いたいです。 なお、それぞれのブックの名前に規則性はありません。 ブックの中身は統一されており、1ブック1シート、シート名は Sheet1 です。 このシートのB4からP4(横一列15個のセル)には、画像上段のように数値が入っています。 ここでやりたいのは、すべてのブックに入っているそれらの数値を平均して、 別に用意しておいた集計用のブックの同一セル(B4からP4)に入れるという作業です。 ブックを結合してから串刺し演算をしても良いのですが、できればマクロ一発で しかもできるだけシンプルなコードで以上を実現できれば嬉しいです。 過不足等ございましたら補足させて頂きますので、どうかお知恵をお貸しください。

専門家に質問してみよう