(6) ブックを制御するコマンド24件の使用例一覧表
前述の「1-1ファイル制御関連」項目で主なファイル制御のコマンドは紹介済みですが、実際にマクロを組むと
きは指定のファイルを開いたり、保存したり閉じたりなど、更に詳しい一覧表があると便利です。
なお、内容的には前述のファイル制御の続きですが、Excelではファイルを追加すれば「Book1、Book12」のよう
にBook名でファイルが追加されます。エクセルの書式で書かれたファイルはブックと呼ぶことができるのと、この
一覧表はWorkbooksコレクション使用例が主体であり、親しみやすいブックにして「ブック制御」とした。

【表2 ブック制御関連一覧表】
No 項目 内容 例文 記事
1 開く ファイルを指定してブックを開く Workbooks.Open Filename:="C:\tst\tstBook1.xls"  
2 開く ブックを読み取り専用で開く Workbooks.Open FileName:="c:\test.xls" , ReadOnly:=True  
3 開く ブックをリンクの更新をしないで開く Workbooks.Open Filename:="C:\tst\tstBook1.xls", UpdateLinks:=0  
4 開く ファィルを開くダイアログからブックを開く myfil = Application.GetOpenFilename("Excelファイル(*.xls),*.xls")  
5
 
保存
 
アクティブブックを名前を付けて保存する
(Excel2003と2007を同じ記述)
ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & _
"\tstBook2.xls", FileFormat:=xlWorkbookNormal
 
 
6 保存 ワークブック"Book1.xls"を保存しないで閉じる Workbooks("Book1").Close SaveChanges:=False  
7 保存 ワークブック"Book1.xls"を保存して閉じる Workbooks("Book1").Close SaveChanges:=True  
8 保存 アクティブブックを上書き保存して ActiveWorkbook.Save  
9 閉じる アクティブブックを閉じる ActiveWorkbook.Close  
10 閉じる 指定したブックを閉じる Workbooks("tstBook1.xls").Close  
11 閉じる 開かれているすべてのブックを閉じる Workbooks.Close  
12 閉じる 閉じると共にExcelを終了する Application.Quit  
13 閉じる 確認メッセージを表示しないでブックを閉じる Application.DisplayAlerts = False ・・・・・・ [ブック1]マクロ
14 新ブック ワークブックを新規に作成する Workbooks.Add  
15 参照 指定ブックをアクティブにする Workbooks("Book1.xls").Activate  
16 参照 インデックス指定でアクティブにする Workbooks(1).Activate  
17 参照 マクロ入りのブックをアクティブにする ThisWorkbook.Activate  
18 設定 ファイルのアクセスの変更読み取り専用 ActiveWorkbook.ChangeFileAccess Mode:=xlReadOnly  
19 設定 ファイルのアクセスの変更読み書き可能に設定 ActiveWorkbook.ChangeFileAccess Mode:=xlReadWrite  
20 情報取得 ブックのファイル形式を取得する Msgbox ActiveWorkbook.FileFormat  
21 情報取得 読み取り専用か調べる Msgbox ActiveWorkbook.ReadOnly  
22 情報取得 読み取り専用か調べる(開いてないブック) Msgbox GetAttr("C:\tst\tstBook1.xls") And vbReadOnly  
23 情報取得 Windowsコレクション数量 MsgBox Windows.Count  
24 情報取得 開いているウインドウズのコレクションチェック For Each file_name In Windows ・・・・ [ブック2]マクロ


[1]ブック制御関連の追加説明
ブック関連のコマンドは簡単で判りやすので使用方法は、表2の「例文」を見れば直ぐ理解できると思います。
しかし1行例文で判りづらいコマンドが2件あったので以下に説明を追加します。


[2]確認メッセージを表示しないでブックを閉じる方法
ブックを閉じる操作をした場合そのブックに変更があった場合「・・保存しますか?」の確認メッセージが表示されます。
マクロ実行を止めたくない場合は、確認メッセージを表示させない方法があります。
Subブック1()
    Application.DisplayAlerts = False
        ActiveWorkbook.Saved = True
        ActiveWorkbook.Close
    Application.DisplayAlerts = False
End Sub


[3]開いているウインドウズのオブジェクトチェック方法
マクロでブックを操作する時、開いているマクロを知りたいことがあります。
本例はウインドウズ内のオブジェクト(開いているファイル)を順次チェック
できます。

Subブック2()
Dim i As Integer, mydat As String, b_name As Object
For Each b_name In Windows
    i = i + 1
    mydat = mydat & " (" & i & ")" & b_name.Caption
Next
    MsgBox mydat
End Sub

Const fil2a As String = "小文字.xls"
Subブック2a()
    phn = ThisWorkbook.Path 'このマクロ同じフォルダのブック
    fila = 0
     For Each file_name In Windows
        If file_name.Caption = fil2a Then
             Windows(fil2a).Activate
            fila = 1
        End If
    Next
        If fila = 0 Then
           Workbooks.Open Filename:=phn & "\" & fil2a
End Sub
※上記は指定のブックは開いているかチェックし、開いていない場合は開く。
 




(7)名前を付けて保存

[1]Excel2003と2007以降を分けて記述例
Excel2007で?メニューから「名前をつけて保存」-「Excel97-2003Book」で保存を自動記録すると
「FileFormat:=xlExcel8」となります。ただしこれをExcel2003で実行するとエラーになるので、
実行ステータスを分けます。

Sub 保存1_1()
Workbooks.Add
If CSng(Application.Version) > 11 Then
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & _
        "\tstBook.xls", FileFormat:=xlExcel8
Else
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\tstBook.xls"
End If
ActiveWorkbook.Close
End Sub


[2]Excel2003と2007以降を同じ記述例
FileFormat:=xlWorkbookNormalでExcel2003と2010で問題なく動きました。

Sub 保存1_2()
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & _
        "\tstBook.xls", FileFormat:=xlWorkbookNormal
End Sub


[3]CSVファイルで保存例
TxtファイルはExcel2003、Excel2010とも同じ記述で問題なく保存できます。

Sub 保存1_3()
    ActiveWorkbook.SaveAs Filename:="C:\tst\tstBook2.csv", _
    FileFormat:=xlCSV, CreateBackup:=False
End Sub




(8)上書き保存

[1]通常の上書き保存例
「上書き保存」をクリックした場合、1度保存されているブックの場合は
以下のようなマクロとなります。

Sub 保存2_1()
ActiveWorkbook.Save
End Sub


[2]変更のあった時のみ上書き保存してファイルを閉じる例
変更の無い時も上書きするのは時間の無駄であり、本マクロは変更のあった
時のみ上書する例です。

Sub 保存2_2()
    If ActiveWorkbook.Saved = False Then
       ActiveWorkbook.Save
    End If
    ActiveWorkbook.Close
End Sub
 ---------------------------------------------------------
Sub 保存2_2a()
    ActiveWorkbook.Close SaveChanges:=True
End Sub


[3]変更があっても保存しないでファイルを閉じる例
セルに"TODAY"等の日付関係のデータが変化する関数があると、人が
ブックに手を加えない場合も常に変更があった事になります。
そのようなケースで保存不要の場合は変更を無視して閉じることができます。

Sub 保存2_3()
    ActiveWorkbook.Saved = True
    ActiveWorkbook.Close
End Sub
 ---------------------------------------------------------
Sub 保存2_3a()
    ActiveWorkbook.Close SaveChanges:=False
End Sub


[4]マクロが入っているブックを閉じる例
実行しているマクロが入っているBookは下記で閉じることができます。
この例では内容の変更があっても保存されません。

Sub 保存2_4()
 
    ThisWorkbook.Close SaveChanges:=False
End Sub




(9)フォルダ内全ファイル名を小文字に変換するテクニック
インターネットにホームページを出している場合、自分のPC上でデバックしたときは正常に動くが、
サーバーに送った後にファイルが正常に開けない不具合いが発生することがありあます。
これはWindows ではファイル名の大文字小文字を区別しないのに、サーバーのUNIX では区別する関係
で不具合が発生することがあります。(例:画像処理で縮小やトリミングを行った場合アプリケーション
によって、JPGの大文字やjpgの小文字になるケースがあります)


[1]指定した拡張子のファイル名を小文字にする
フォルダ内のファイルを一個指定すると、そのファイルの拡張子と同じファイルを全て小文字にする
マクロです。なお初めから小文字で変換の必要のないファイル名も小文字化の処理を実行しています。

Sub 小文字1()
Dim fal As String, fff As String, fname As String
Dim kname As String, pth As String, moz As String
Dim su As Integer
 
fal = "すべてのファイル(*.*),*.*"
fff = Application.GetOpenFilename(fal, , Title:="ファイル指定") 'ファイル指定
If fff = "False" Then
   MsgBox "ファイルを指定して下さい"
   Exit Sub
End If
 
fname = Dir(fff)
kname = Mid(fname, InStrRev(fname, "."))
pth = Replace(fff, fname, "")
 
        moz = Dir(pth & "*" & kname)
                Name pth & moz As pth & StrConv(moz, 2)
     Do
        moz = Dir()
        If moz = "" Then Exit Do
                Name pth & moz As pth & StrConv(moz, 2)
          su = su + 1
      Loop Until moz = ""
   MsgBox su + 1 & "個の" & kname & " ファイルを小文字に変換しました"
End Sub


[2]サブフォルダを含む全ファイル名の小文字化
前述は指定したフォルダ内の指定した拡張子を対象に実行しますが、サブフォルダを含めたフォルダ
を対象に全ファイルを対象にに実行できるマクロがあると便利です。なお、Dir関数で第2引数に
vbDirectoryを指定すればサブフォルダを対象に取得できますが、これはサブフォルダ1個の指定であり
全サブフォルダを対象に実行は面倒で簡単にはできません。そこで今回は、サブフォルダ内にあり
サブフォルダも対象に処理できる、FileSystemObjectを使用しました。

実行例は、フォルダを指定(画面52参照)で、指定フォルダ内の大文字ファイル(画面53参照)がマクロ
実行で、どの拡張子のファイルも画面3-54のように小文字のファイル名に変換されます。なお、
サブフォルダ内のファイルも小文字化されます。

画面52 フォルダしてダイアログ例


画面53 変換前のファイル名例


画面54 変換後のファイル名例


Dim pth1 As String, su As Integer
 
Sub 小文字2()
Dim myobj As Object, moz As String
su = 0: pth1 = ""
 Columns("B:B").Clear
 
    Set myobj = CreateObject("Shell.Application") _
        .BrowseForFolder(0, "フォルダを選択してください", &H1)
    If myobj Is Nothing Then
        Exit Sub
    End If
        pth1 = myobj.Self.path
    Set myobj = Nothing
        Call 小文字2a
    MsgBox su & "個のファイルを小文字に変換しました。"
End Sub
 --------------------------------------------------------
Sub 小文字2a()
Dim pth As String, moz As String, myobj As Object, folder As Object
       pth = pth1 & "\"
       moz = Dir(pth & "*" & "*")
                Name pth & moz As pth & LCase(moz)
            su = su + 1
       Worksheets("sheet1").Cells(su + 10, 2).Value = pth & moz
    Do Until moz = ""
        moz = Dir()
        If moz = "" Then Exit Do
                Name pth & moz As pth & LCase(moz)
          su = su + 1
       Worksheets("sheet1").Cells(su + 10, 2).Value = pth & moz
    Loop
サブフォルダ
    Set myobj = CreateObject("Scripting.FileSystemObject")
    For Each folder In myobj.GetFolder(pth1).SubFolders
        pth1 = folder
        Call 小文字2a
    Next folder
 
End Sub

サブフォルダ取得に関して、"Scripting.FileSystemObject"をオブジェクト変数に代入しないで、
以下のWithステーメントの記述でも同じことです。

'サブフォルダ
    With CreateObject("Scripting.FileSystemObject")
        For Each folder In .GetFolder(pth1).SubFolders
            pth1 = folder
            Call 小文字2b
        Next folder
    End With

以上の2件は「CreateObject」関数で"Scripting.FileSystemObject"を参照設定して使用していますが、
一般的にはVBEの「ツール」「参照設定」から、[Microsoft Scripting Runtime] を参照可能にチェックし
Scripting.FileSystemObjectを使用します。以下は参照設定しないと実行できない例です。

Dim ffg As New Scripting.FileSystemObject
Dim fol As Scripting.folder
サブフォルダ
Set fol = ffg.GetFolder(pth1)
        For Each folder In fol.SubFolders
            pth1 = folder
            Call 小文字3a
        Next folder


【参考111】一括してファイル名変換する例
本例はファイル名を小文字にする例ですが、そのステータスをファイル名の変換に変えればファイル
名変換の一括処理が出来ます。
以下は「図**」のファイル名を「画像**」に変換した例です。

               Name pth & moz As pth & StrConv(moz, 2)
この行を以下に変更
      If Left(moz, 1) = "図" Then
                    moz1 = "画面" & Mid(moz, 2)
                    Name pth & moz As pth & moz1
                    su = su + 1
              End If



【参考112】ファイルの拡張子を表示
ファイルの拡張子は始めは表示されていません。拡張子を表示したい場合Windows7では以下の操作が
必要です。ファイルを表示するエクスプローラを起動し、その左上の「整理」を選択しその中にある
「フォルダーと検索のオプション」をクリックで下図のフォルダーオプションが表示されます。
「登録されている拡張子は表示しない」のチェックを外します。




【戻る】    【Top画面】   【HPへ】