dポイントプレゼントキャンペーン実施中!

エクセルのマクロについて教えていただきたいです。
以下のような状況なのですが、アドバイスいただけないでしょうか。

・同一フォルダに100個以上の同じ形式のエクセルファイルがある(ファイル名に規則性はなし)
・各ファイルは2つのシートから成り、そのうちの「データ」というシートに対して処理を適用したい
・適用したい処理のマクロは作成済み
なお、適用したい処理というのは、「データ」シートからある値以上のデータの平均を別のエクセルファイル(これは1つのファイル)に記入するという作業で、値を読み込むだけで書き込むことはありません。

このマクロをフォルダ内の全てのエクセルファイルに対して実行したいのですが、可能であれば各エクセルファイルを開かずにマクロを実行したいのです。(100個を越えるファイルを開いたり閉じたりする動作を避けたい)

マクロはしっかりと勉強したわけではなく、ネットから情報を集めつつなんとか作っているレベルで、特にファイルの読み書きがよく理解できていません・・・分かりやすいサイトなどがあればそれも教えていただきたいと思っています。

自分でも上手く説明できていないのはわかりますので、もし必要な情報がありましたら付け加えさせていただきます。
分かる方がいらっしゃいましたらどうぞよろしくお願いいたします。

A 回答 (2件)

Dir関数に対しもうひとつの方法として、FSOを使う方法がある。


ーー
Sub test01()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim objfs
Dim objfolder
Dim wb
Set objfs = CreateObject("scripting.filesystemobject")
Set objfolder = objfs.getfolder(CurDir)
MsgBox CurDir
For Each objfile In objfolder.Files
If objfs.getextensionname(objfile) = "xls" Then
MsgBox objfile.Name
Set wb = Workbooks.Open(objfile)
Windows(wb.Name).Visible = False
MsgBox wb.Sheets(1).Range("A1")
'ここで、捕まえた1ブックの処理
wb.Close
Set wb = Nothing
End If
Next
Application.DisplayAlerts = False
Application.ScreenUpdating = False
End Sub
ーー
上記のCurdirは
エクセルの既定のフォルダのことだが、これ以外の場合は、ここで""でフォルダ名を囲んで指定するフォルダ名を入れる。
----
上記は各ブックを開く。
Sub test02()
Application.DisplayAlerts = False
Application.ScreenUpdating = False

Dim objfs
Dim objfolder
Dim wb
Dim buf As String
Set objfs = CreateObject("scripting.filesystemobject")
Set objfolder = objfs.getfolder(CurDir)
MsgBox CurDir
For Each objfile In objfolder.Files
If objfs.getextensionname(objfile) = "xls" Then
'MsgBox objfile.Name
'On Error Resume Next
target = "'" & CurDir & "\[" & objfile.Name & "]" & "Sheet1" & "'!R1C1"
MsgBox target
buf = ExecuteExcel4Macro(target)
MsgBox buf
End If
Next
Application.DisplayAlerts = False
Application.ScreenUpdating = False
End Sub
をやると、私の少数例では、スムーズに行く。
質問者の場合も、うまく行くか自信が無い。
上記のSheet1というシート名を「データ」に変えてやってみてください。質問の場合は各ブックで「データ」というシートだから、定数として、指定できるが、Sheets(1)などの名前が各ブックで違うと、お手上げと思う(ただ良い方法があるかも。開かないで第1シート名は、多分取れないだろうと思うが)。
このシート名のシートがその全てのブックに無い場合は、処理が止まるかと思う。
===
ExecuteExcel4Macro(target)
というのは、使用を勧められる物ではない。
基本的にエクセルは、開いてデータを読んで使うもの。
この点経験も少なく私も手探りだが、情報も少なく、初心者が「エクセルファイルを開かずに・・」なんて言えることではない。
この質問も丸投げで、回答者頼りで、やりたいことだけ勝手に言っているが、こんな課題は初心者には早すぎる課題だと思う。
参考
詳しくは、Googleで「ExecuteExcel4Macro」で照会して勉強のこと。
http://officetanaka.net/excel/vba/tips/tips28.htm
    • good
    • 0
この回答へのお礼

おかげ様で無事実行できました!
どうしても仕事で急ぎで必要であったため、このように丸投げの質問となってしまいましたが・・・
今後少しずつ勉強していきたいと思います。
丁寧なご回答ありがとうございました。

お礼日時:2009/11/03 10:26

VBA Dir関数でネットで調べてみてください。


指定したフォルダ内にファイルを取得します。
以下は、A1セルでフォルダを指定して、エクセルファイルを順に開いて、閉じます。
Sub Sample1()
Dim buf As String, i As Long
buf = Dir(Range("A1").Value & "\*.xls")
Do While buf <> ""
Workbooks.Open Worksheets(1).Range("A1").Value & "\" & buf
ここに、やりたいことを記述してください。
Workbooks(buf).Close SaveChanges:=False
buf = Dir()
Loop
End Sub
    • good
    • 0
この回答へのお礼

簡潔なご回答ありがとうございます!
教えていただいた関数を色々調べてみて知識も多少は吸収できました。
無事今回の作業は片付きましたが、今後に備えてもっと勉強しておきたいと思います。

お礼日時:2009/11/03 10:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!