Excel VBA質問箱 IV

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

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


2511 / 13646 ツリー ←次へ | 前へ→

【67585】個々のファイルを開かずにマクロの実行 はるな 10/12/16(木) 17:25 質問[未読]
【67586】Re:個々のファイルを開かずにマクロの実行 UO3 10/12/16(木) 20:45 発言[未読]
【67587】Re:個々のファイルを開かずにマクロの実行 UO3 10/12/16(木) 20:59 発言[未読]
【67598】Re:個々のファイルを開かずにマクロの実行 はるな 10/12/17(金) 10:27 発言[未読]
【67597】Re:個々のファイルを開かずにマクロの実行 はるな 10/12/17(金) 10:12 発言[未読]
【67590】Re:個々のファイルを開かずにマクロの実行 UO3 10/12/16(木) 23:31 回答[未読]
【67601】Re:個々のファイルを開かずにマクロの実行 UO3 10/12/17(金) 12:20 回答[未読]
【67602】Re:個々のファイルを開かずにマクロの実行 UO3 10/12/17(金) 12:22 発言[未読]

【67585】個々のファイルを開かずにマクロの実行
質問  はるな  - 10/12/16(木) 17:25 -

引用なし
パスワード
   フォルダ内にExcelファイル(100個)が格納されている場合
以下のような動作を行いたいのですが、可能でしょうか。

1.親ブックを作成
2.親ブックにマクロボタンを作成
  ※マクロの内容は、各ファイル内のシートをコピー・ファイル名を変更して保存。
3.マクロボタンを押すと、フォルダ内に格納されているExcelファイル(100個)全てにマクロが反映される
  ※この時、個々のファイルは開かない。

可能な場合は、どのようなマクロを記述したら良いのか
教えて頂けますでしょうか。

ご教授の程、よろしくお願い致します。

【67586】Re:個々のファイルを開かずにマクロの実行
発言  UO3  - 10/12/16(木) 20:45 -

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

こんばんは

・項番2まで、つまり親ブックを作りマクロを記述するまでの作業は手作業ですね。
 それとも、それもマクロで自動生成ですか?

・以下の意味がいまいち、不明です。
 具体的に教えていただけますか?

>各ファイル内のシートをコピー・ファイル名を変更して保存。

 各ファイルというのはフォルダに格納されている100個ぐらいの
 エクセルファイルですか。
 また、シートをコピーとありますが、どのブックのどのシートを、どこに
 コピーするのですか?

★親ブックとそのシート、フォルダ内のブックと、そのシート、これらに
 具体的な名前をつけて、もう一度説明いいただくとわかりやすいのですが。

【67587】Re:個々のファイルを開かずにマクロの実行
発言  UO3  - 10/12/16(木) 20:59 -

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

追伸です。

質問させていただいていることてゃ別に
ブックを開かないで、そのブックのシートをコピー、あるいは
何かのシートを、そのブックにコピーすることは、不可能ですので
いまから、あきらめて(?)おいてくださいね。

なぜ、開かないで処理をするのか、その理由をお聞かせ願えますか?
なんとなく、かっこいいからですか?

【67590】Re:個々のファイルを開かずにマクロの実行
回答  UO3  - 10/12/16(木) 23:31 -

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

こんばんは

各ブックのシートを、別ブックにコピーするのか、あるブックのあるシートを各ブックにコピーするのか
要件が理解できていませんので、とりあえず、前者で。はずしている確率、85%ぐらい?
勘違いしていたらすててください。

親ブックを作るとか、ボタンを配置するとか、それらは割愛しています。

指定フォルダの各エクセルブックのすべてのシートを1つのブックにまとめ まとめたブックを、
マクロブック名_作成.xls という名前で、マクロブックがあるフォルダに 保存します。
この間、各エクセルブックも、まとめたブックも表示されません。100個もブックがあると時間はかかると思いますが。
それと、シートの数が膨大になりますのでメモリーの関係で、悪名高い(?)1004のエラーが発生するかもしれません。

Sub Sample()
 Dim myPath As String
 Dim newWb As Workbook, workWB As Workbook
 Dim fsoFile As Object
 Dim sh As Worksheet
 Dim Fso As Object
 Dim xlApp As Excel.Application
 
 myPath = "C:\Test"  '<== 実際のフォルダ名に
 Set xlApp = New Excel.Application
 Set Fso = CreateObject("Scripting.FileSystemObject")
 
 For Each fsoFile In Fso.GetFolder(myPath).Files
  If LCase(Fso.GetExtensionName(fsoFile.Name)) = "xls" Then
   Set workWB = xlApp.Workbooks.Open(Filename:=myPath & "\" & fsoFile.Name)
   If newWb Is Nothing Then
    Set newWb = workWB
   Else
    For Each sh In workWB.Worksheets
     DoEvents
     sh.Copy after:=newWb.Sheets(newWb.Worksheets.Count)
    Next
    workWB.Close savechanges:=False
   End If
  End If
 Next
 
 Application.DisplayAlerts = False
 newWb.SaveAs ThisWorkbook.Path & "\" & ThisWorkbook.Name & "_作成.xls"
 newWb.Close
 Application.DisplayAlerts = True
 
 xlApp.Quit
 
 MsgBox "処理が終了しました"
 
End Sub

【67597】Re:個々のファイルを開かずにマクロの実行
発言  はるな  - 10/12/17(金) 10:12 -

引用なし
パスワード
   ご返信ありがとうございます。
説明が足りず申し訳ありません。

>・項番2まで、つまり親ブックを作りマクロを記述するまでの作業は手作業ですね。
はい。親ブックを作りマクロの記述は手作業で行います。

>★親ブックとそのシート、フォルダ内のブックと、そのシート、これらに
> 具体的な名前をつけて、もう一度説明いいただくとわかりやすいのですが。

親ブック:KANRI
シート名:管理シート

子ブック:管理1、管理2、管理3、・・・管理100(管理1〜管理100までは同一のフォーマットです)
シート名:管理シート上期、下期

・[KNRI]に作成したボタンをクリック
・[管理1〜管理100]の<管理シート上期>の右に<下期>という名のシートを追加
 ※100個のファイルデータが更新されるイメージです。

【67598】Re:個々のファイルを開かずにマクロの実行
発言  はるな  - 10/12/17(金) 10:27 -

引用なし
パスワード
   >なぜ、開かないで処理をするのか、その理由をお聞かせ願えますか?

100個のExcelファイルを1つ1つ開き、繰り返し同じ処理を行うコトは
時間がかかります。
そのため、簡単に処理を行える方法がないかと思い
ファイルを開かず処理を行えるか質問させて頂きました。

【67601】Re:個々のファイルを開かずにマクロの実行
回答  UO3  - 10/12/17(金) 12:20 -

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

Sub Sample2()
 Dim myPath As String
 Dim workWB As Workbook
 Dim fsoFile As Object
 Dim Fso As Object
 Dim xlApp As Excel.Application

 myPath = "C:\Test"  '<== 実際のフォルダ名に
 Set xlApp = New Excel.Application
 Set Fso = CreateObject("Scripting.FileSystemObject")

 For Each fsoFile In Fso.GetFolder(myPath).Files
  If LCase(Fso.GetExtensionName(fsoFile.Name)) = "xls" Then
   Set workWB = xlApp.Workbooks.Open(Filename:=myPath & "\" & fsoFile.Name)
   If Not IsError(xlApp.Evaluate("[" & workWB.Name & "]管理シート上期!A1")) Then
    workWB.Sheets("管理シート上期").Copy After:=workWB.Sheets("管理シート上期")
    With workWB.ActiveSheet
     If IsError(xlApp.Evaluate("[" & workWB.Name & "]下期!A1")) Then .Name = "下期"
     .Cells.ClearContents  'もし内容のクリアがだめならカットしてください
    End With
    xlApp.DisplayAlerts = False
    workWB.SaveAs myPath & "\" & workWB.Name & "_下期.xls"
    workWB.Close
    xlApp.DisplayAlerts = True
   End If
  End If
 Next

 xlApp.Quit

 MsgBox "処理が終了しました"

End Sub

【67602】Re:個々のファイルを開かずにマクロの実行
発言  UO3  - 10/12/17(金) 12:22 -

引用なし
パスワード
   補足です。

ご説明いただいた要件に書き直しました。(まだ誤解しているかもしれませんが)
ただし、やはりブックは(見えないところで)開きます。ですから処理時間は結構かかるでしょうね。

・フォルダ内の全てのエクセルブックを対象にしています。"管理nnn.xls"に絞るなら
 ブック名のチェックをいれることになります。
・フォルダ内にサブフォルダがあった場合、そこは無視しています。サブフォルダ内も同様に
 処理する必要があれば、ちょこっとコードを追加することになります。
・ブックに"管理シート上期"というシートがなければ処理をスキップします。
・ブックに、既に"下期"というシートが存在すれば、シートコピーの後、シート名はかえません。
 "管理シート上期(2)"といった名前で残ります。
・挿入後のブックは、そのフォルダに、"そのブック名_下期.xls"という名前で保存します。
 もし、同名のものがあれば上書きします。

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