Search

  毎日にもっと楽~を! BLOG Tokyo

2006年8月30日

【エクセル】複数のブックを一つにまとめる 2

ひとつのシートじゃなくて、別々のシートにまとめたい?

むしろそういう場合の方が多いかもしれません。複数のブックを別シートにまとめるマクロ作っちゃいました。

Sub 複数のブックをまとめる()
Dim myWorkbook As Workbook, i As Long
Dim theName, theDir As String

Application.ScreenUpdating = False
'現在のカレントパスのtenkiフォルダに移動する
theDir = ThisWorkbook.Path & "\tenki"
'拡張子xlsのファイル名を取り出す
theName = Dir(theDir & "\*.xls")

Do While theName <> ""
Set myWorkbook = Workbooks.Open(theDir & "\" & theName)
myWorkbook.Worksheets(1).Copy After:= _
ThisWorkbook.Worksheets(Worksheets.Count)
ActiveSheet.Name = theName
myWorkbook.Close
theName = Dir()
Loop

Application.ScreenUpdating = True
Set myWorkbook = Nothing

Call 拡張子をとる

End Sub

Sub 拡張子をとる()

Dim i As Long
Dim cnt As Long

cnt = Worksheets.Count

For i = 2 To cnt

Worksheets(i).Name = Left(Worksheets(i).Name, InStr(Worksheets(i).Name, ".") - 1)

Next i

End Sub

------------
2008.9.11
どうもこれでは15-30ブックくらいまでしかまとめられない。リソース不足とエラーが出る。今のところ新規のブックで複数回にわけるくらいしか解決策は思いつかない。抜本的にコードを見直す必要がありそうだ。コピーするところがエラーになるので、その辺かと思う。クリップボードのコピーを解放するコードをネットで見つけたが、効果は不明である。

------------
2008.9.12
まとめられるブック、シートの数は、マシンの性能とワークシートのデータ量に依存している。色とかそのような細かいセルの書式設定も当然サイズに関係している。使用しているセルの領域が大きければ大きいほど、リソースを占有しています。まとめ先のブックに既定で15ワークシートある状態から実行しても、最初の一枚でリソース不足となってしまう。これを解決するのはなかなか難しい。

Private Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function CloseClipboard Lib "user32" () As Long

Sub ClipClear()
Dim lngRtn As Long

lngRtn = OpenClipboard(0)
lngRtn = EmptyClipboard
lngRtn = CloseClipboard
End Sub

出典:Programing of なりさん(Java,VBA,Sybase)
http://programing.narisan.com/?eid=188455

統合したバージョン


Private Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function CloseClipboard Lib "user32" () As Long

Sub 複数のブックをまとめる()
Dim myWorkbook As Workbook, i As Long
Dim theName, theDir As String

Application.ScreenUpdating = False
'現在のカレントパスのtenkiフォルダに移動する
theDir = ThisWorkbook.Path & "\tenki2"
'拡張子xlsのファイル名を取り出す
theName = Dir(theDir & "\*.xls")

Do While theName <> ""
Set myWorkbook = Workbooks.Open(theDir & "\" & theName)
myWorkbook.Worksheets(1).Copy After:= _
ThisWorkbook.Worksheets(Worksheets.Count)
Call ClipClear
ActiveSheet.Name = theName
myWorkbook.Close
theName = Dir()

Loop

Application.ScreenUpdating = True
Set myWorkbook = Nothing

Call 拡張子をとる

End Sub

Sub 拡張子をとる()

Dim i As Long
Dim cnt As Long

cnt = Worksheets.Count

For i = 2 To cnt

Worksheets(i).Name = Left(Worksheets(i).Name, InStr(Worksheets(i).Name, ".") - 1)

Next i

End Sub

Sub ClipClear()
Dim lngRtn As Long

lngRtn = OpenClipboard(0)
lngRtn = EmptyClipboard
lngRtn = CloseClipboard
End Sub



Bookmark and Share


編集長のおすすめの一冊!2010

comments

comment form

(BLOG Tokyo にはじめてコメントされる場合、不適切なコメントを防止するため、掲載前に管理者が内容を確認しています。適切なコメントと判断した場合コメントは直ちに表示されますので、再度コメントを投稿する必要はありません。)

comment form