Re: 複数のファイルを1つのシートに貼り付ける
鴻池です。
"Yoshiaki Kawajiri" <kawa_y@d1.dion.ne.jp> wrote in message
news:3F23B693.8285313@d1.dion.ne.jp...
> 川尻@札幌です。
> 自分の欲望として、マクロ(VBA)を起動すると *_NAME集計2.xls
> だけを参照し自動的に 合計シートの張り付けられるのが自分でやってみたのです
が
> なかなか難しいです。以前 kounoikeさんから教えていただいた物を使ってみまし
たが
> 自分の考えている物とどういうふうに組むかが解りません。
以前のは,データが無いシートがある場合の動きが間違っていたので,修正したのを
下記に書きました。(まだ,間違いがあるかも知れません。また,エラー処理は不十
分。)
川尻さんが,コピーしたいファイルを開くマクロは作成しているというので,それを
前提に以前のマクロは作成しました。また,コピーするシート名(下記では,
"sheet1")も全て同じという条件です。組み合わせる場合は,若干マクロを変更した
方が,使用勝手がよいような気がします。変更したものを下記に書きます。
組み合わせとしては,川尻さんが作成したマクロ名を仮に,open_allfileとすれば,
これをマクロだけ記述するファイル(ファイル名は適当に付ける。)のモジュールに
コピーします。また,以下のコードも同じモジュールにコピーします。
そして,そのモジュールに例えば次のようなマクロ,
sub start_test()
Dim tobook As Workbook
Dim tosheet As Worksheet
Set tobook = ActiveWorkbook
Set tosheet = ActiveSheet
open_allfile
start_copysheet tobook, tosheet
end sub
を作成します。
そして,集計するファイルの合計のシートをアクティブにした状態で,上の
start_testを実行する。といった感じで試して見てはどうでしょうか。
この場合,最大で33(データ,集計用,マクロ用)のファイルが一度に開かれるこ
とになり,それが嫌なら,一個ずつ目的のファイルを開いてコピーし,終わればファ
イルを閉じるようにすればいいと思います。データファイルを同一ディレクトリに保
存するようにすれば,そう複雑にはならないと思います。例えば,
-----------------一個づつ開いてコピーの場合-----------------
Sub file_copy()
Dim tobook As Workbook
Dim tosheet As Worksheet
Dim foldername As String
Set tobook = ActiveWorkbook
Set tosheet = ActiveSheet
'ここにinput文でフォルダを選択する方法をとるべき?。
foldername = "C:\My Documents\data" 'データの保存場所
open_and_copy foldername, tobook, tosheet
End Sub
Sub open_and_copy(folderspec As String, tobook As Workbook, tosheet As
Worksheet)
Dim fs, f, s
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFolder(folderspec)
Set fc = f.Files
For Each f1 In fc
Workbooks.Open f1.Name
start_copysheet tobook, tosheet
Workbooks(f1.Name).Close SaveChanges:=False
Next
End Sub
-------------------以上------------------------------------
を作成。そして集計するファイルの合計のシートをアクティブにした状態で,上の
file_copyを実行する。なお,start_copysheet は下記を利用。
--------------------組み合わせ用マクロ----------------------
Sub start_copysheet(tobook As Workbook, tosheet As Worksheet)
#Const beta = 1 '確認が不要の場合は値を0にする。
Dim lrto As Long
Dim lrfrom As Long
Const sh = "sheet1" '特定のシート名はここで変更する。Sheet(1)ではない。
For Each bk In Workbooks
tobook.Activate
tosheet.Select
lrto = find_last_row()
bk.Activate
If Not ThisWorkbook Is bk And Not tobook Is bk Then
On Error GoTo errnotfind
Sheets(sh).Select
lrfrom = find_last_row()
If lrfrom > 0 Then
Rows(Trim(Str(1)) & ":" & Trim(Str(lrfrom))).Select
Selection.Copy
tobook.Activate
tosheet.Activate
On Error GoTo errov
#If beta Then
Cells(lrto + 2, 1).Select
Selection.PasteSpecial
Application.CutCopyMode = False
Cells(lrto + 1, 1).Value = bk.Name & " + (シート名: " &
sh & ")"
Cells(lrto + 1, 1).Font.ColorIndex = 3
#Else
Cells(lrto + 1, 1).Select
Selection.PasteSpecial
#End If
End If
End If
ne:
Next
Exit Sub
errnotfind:
MsgBox bk.Name & " のシート " & sh & " が見つかりません。"
Resume ne
errov:
MsgBox "コピー行数が多すぎます。"
End Sub
Function find_last_row() As Long
Dim sm As Range
Dim pre As Range
Dim n, m As Integer
On Error GoTo errfs
Set pre = ActiveCell
Cells.SpecialCells(xlCellTypeConstants, 23).Select
Set sm = Selection
n = sm.Areas.Count
sm.Areas(n).Select
Set sm = Selection
If sm.Count > 1 Then
sm.End(xlDown).Select
n = Selection.Row
Else
n = Selection.Row
End If
fs:
On Error GoTo errse
Cells.SpecialCells(xlCellTypeFormulas, 23).Select
Set sm = Selection
m = sm.Areas.Count
sm.Areas(m).Select
Set sm = Selection
If sm.Count > 1 Then
sm.End(xlDown).Select
m = Selection.Row
Else
m = Selection.Row
End If
se:
pre.Activate
If n > m Then
find_last_row = n
Else
find_last_row = m
End If
Exit Function
errfs:
n = 0
Resume fs
errse:
m = 0
Resume se
End Function
--------------------以上------------------------------------
--
******************************
keizi kounoike
******************************
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735