パスワードを忘れた? アカウント作成
203613 journal

patagonの日記: [コンピュータ]CopyAllSheets New Excel Book VBA

日記 by patagon

Excelを使わないようにしようと思った時期もあったが、それは無理とわかった。
Excelを諦めるのを諦めた。
必要があれば適度に使うことにした。

かなり前に作ったExcel VBAをメモしていく。

わざわざアプリケーションインストールするまでもない、と思いネットを探したが、思うようなのがなかったので作った。
統一がとれてなかったり、ダサダサなんだけど、まぁ、よしとするか。
特にDirとか書いているところ、この関数使わずに書き直したいんだけど。

Public Sub CopyAllSheets()
 
'CopyAllSheets New Excel Book VBA
 
'指定したブック(Excelファイル)のシート、またそれと同じフォルダ内のブックのシートをこのブックにコピーするマクロ
'シート名に重複があるときはシート名(2)という具合にコピーする
'結果はシート名で昇順に並び変える。また空シートは削除する(コピーしない)
 
'*** 注意 *** 2007形式のブック(ファイル)を対象にする時は、本ブック(ファイル)を xlsm(マクロ有効な2007ブック形式)形式で保存しなおすこと
 
'画面の表示更新を止める(処理を速くするために)
Application.ScreenUpdating = False
 
'ダミーシート作成(Excelブックは最低1シートは存在してなければいけない)
Dim sh1 As Worksheet
Dim flag As Boolean
For Each sh1 In Worksheets
    If sh1.Name = "dummy0123456789" Then flag = True
Next sh1
If flag = False Then
   Worksheets.Add
   ActiveSheet.Name = "dummy0123456789"
End If
 
'既存シート削除
Dim sh2 As Worksheet
With ThisWorkbook.Sheets
    For Each sh2 In Sheets
        If Not (sh2.Name = "dummy0123456789") Then
            Application.DisplayAlerts = False
            sh2.Delete
            Application.DisplayAlerts = True
        End If
    Next
End With
 
'各ブックの各シートをコピー
Dim strPath As String
Dim index As Integer
Dim strFName As String
 
strPath = Application.GetOpenFilename
 
If strPath = "False" Then
    Exit Sub
End If
 
index = InStrRev(strPath, "\")
strPath = Left(strPath, index)
 
'シートのコピー
strFName = Dir(strPath & "*.xls*") '拡張子が2007タイプでも読み込むように。
'' 自分自身の(マクロを実行している)ブック名を取得
myfile = ThisWorkbook.Name
Do While strFName <> "" And strFName <> myfile  '自分自身はコピーの対象としない
        CopySheetsInBook (strFName)
        strFName = Dir()
Loop
 
' ダミーシート削除(空のワークシート削除より前で処理すること)
Application.DisplayAlerts = False   'メッセージを表示しない
With ThisWorkbook.Sheets
    Worksheets("dummy0123456789").Delete
End With
Application.DisplayAlerts = True
 
'空のワークシートを削除
Dim sh3 As Worksheet
Application.DisplayAlerts = False   'メッセージを表示しない
With ThisWorkbook.Sheets
    For Each sh3 In Worksheets
        If IsEmpty(sh3.UsedRange) = True Then
            sh3.Delete
        End If
    Next sh3
End With
Application.DisplayAlerts = True
 
'シートの並び替え(昇順)
Dim i As Byte
Dim j As Byte
 
For i = 1 To Sheets.Count - 1                 '---最初から最後の1つ前のシートまで
  For j = i + 1 To Sheets.Count               '---i番め以降のシート全て
     If Sheets(i).Name > Sheets(j).Name Then  '---シート名の比較
        Sheets(j).Move Before:=Sheets(i)      '---(1)シートの移動
     End If
  Next j
Next i
 
'最初のシートをアクティブにする
Dim Sh4 As Worksheet
With ThisWorkbook.Sheets
    Set Sh4 = Worksheets(1)
    Sh4.Activate
End With
 
'処理結果をこのファイルに保存する
Application.DisplayAlerts = False   'メッセージを表示しない
Dim book1 As Workbook
Set book1 = ThisWorkbook
book1.Save
Application.DisplayAlerts = True
 
' 画面の表示更新を再開する
Application.ScreenUpdating = True
 
MsgBox "結果を保存し、処理が終了しました。"
 
End Sub
 
'シートのコピー(サブ)
Private Sub CopySheetsInBook(strFName As String)
 
Dim NumOfSheets As Integer
Dim iSheets As Worksheet
 
NumOfSheets = Workbooks(1).Sheets.Count
Workbooks.Open strFName
With Workbooks(2)
    For Each iSheets In .Sheets
        iSheets.Copy after:=Workbooks(1).Worksheets(NumOfSheets)
        NumOfSheets = NumOfSheets + 1
    Next
    .Saved = True
    .Close
End With
 
End Sub

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

海軍に入るくらいなら海賊になった方がいい -- Steven Paul Jobs

読み込み中...