パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)

ブック操作

ブックのオープン
ブックの保存
ブックを閉じる
オープン、保存、クローズ一連の処理


1 ブックのオープン

EXCELのブックをオープンするには、Workbooksコレクションオブジェクトに対し、openメソッドを
使います。例えば、BOOK1.xls を開くには
Workbooks.Open "BOOK1.xls"
と記述します。

「ファイルを開く」ダイログボックスを表示し、指定されたEXCELファイルを開くマクロ
Sub book_open()
filename$ = Application.GetOpenFilename("EXCELファイル (*.xls),*.xls")
Workbooks.Open filename$
End Sub

GetOpenFilenameメソッドは「ファイルを開く」ダイアログボックスを表示しますが、ここで指定されたファイル
は実際には開かれません。パスを含んだファイル名が取得されますので、Openメソッドで実際に開きます。

ただし、Openメソッドで開くと、開かれたブックがアクティブになります。もともとアクティブだったブックを
アクティブのままにしたいなら、次のようにしなければなりません。
Sub book_open()
temp$ = ActiveWorkbook.Name
filename$ = Application.GetOpenFilename("EXCELファイル (*xls),*xls")
Workbooks.Open filename$
Workbooks(temp$).Activate
End Sub

2 
ブックを保存する

(1) ブックの上書き保存
ブックの保存には Save メソッドを使います
アクティブブックを保存する場合
ActiveWorkbook.Save

(2) ブックに変更があった場合のみ保存
上記(1)のように、Saveメソッドを使うと、ブックに変更があろうが、なかろうがともかく上書き保存します。
ブックの変更の有無を調べて、変更のある時だけ保存するには、Saved プロパティをチェックしてから
保存するようにします。

ブックに変更があった場合、 SavedプロパティはFalse,変更の無い場合はTrueになります。
従って、以下のように記述すれば、ブックに変更のあった場合のみ保存することになります。
If ActiveWorkbook.Saved = False Then
ActiveWorkbook.Save
End If


(3) 新規ブックの保存、既存ブックの別名保存
新規に作成されたブックはEXCELにより、デフォルトで、”Book1.xls”,”Book2.xls”というファイル名が
つけられます。これを,デフォルト名ではなく、別の名をつけて保存したい場合はSaveAs メソッドを
使います。
また、既存ブックを別名で保存したい場合も、同様です。
例えば、”Sample.xls”というファイル名で保存したい場合、以下のように記述します。
ActiveWorkbook.SaveAs "Sample.xls"

なお、ファイル名だけの場合、Windowsではデフォルトで、My Document フォルダに保存されます。
他のフォルダに保存したい場合は、パス名を含めて指定します。


3 ブックを閉じる

(1) ブックを閉じる
ブックを閉じるには、Close メソッドを使います。
アクティブブックを閉じる場合
ActiveWorkbook.Close
全てのブックを閉じる」場合はWorkbooksコレクションオブジェクトを使います。
Workbooks.Close

(2) saveChanges パラメーター、fileNameパラメーター
さて、Close メソッドの動作ですが、実は処理開始前に、上述のSaved プロパティを調べます。そして、
Saved プロパティがtrue の時(すなわち、ブックに変更が無い時)は、そのままファイルを閉じます。
Saved プロパティがFalse(ブックに変更あり)の時は、saveChanges パラメーターの設定により
以下のように処理します。
saveChanges パラメーターは False の時はファイルの保存をせずに閉じます。
True の時は、変更のあった時は、保存をしてからファイルを閉じます。

また、(1)のように、saveChanges パラメーターを省略すると、ブックに変更があった場合、
「保存確認」のダイアログボックスを表示します。

いちいち、ダイアログボックスが表示されるのはうっとうしいので、そういう場合はsaveChanges
パラメーターを使用して以下のように記述します。

ブック変更の有無にかかわらず、保存せずにただファイルを閉じたい場合
ActiveWorkbooks.Close saveChanges:=False
あるいは、上述のSaved プロパテイを使うなら
ActiveWorkbooks.saved = True
ActiveWorkbooks.Close
という風にも書けます。

ブックに変更があった場合に、保存してからファイルを閉じる
ActiveWorkbooks.Close saveChanges:=True
これは、2−(2) ブックに変更があった場合のみ保存と同じ動作になります。


fileName パラメーターを使用すると、指定されたファイル名で、変更されたブックを保存します。
”Sample.xls”というファイル名で保存し、ブックを閉じる
ActiveWorkbooks.Close saveChanges:=True fileName:="Sample.xls"
これは、
ActiveWorkbooks.Saveas "Sample.xls"
ActiveWorkbooks.Close
と同じことになります。


4 ブックのオープン、保存、クローズの一連の処理

全てのブックを保存し、閉じるマクロ
Sub all_save()
For Each w In Application.Workbooks
w.Save
Next w
Workbooks.Close
End Sub


あるいは、以下のようにしても同様です。
Sub all_save2()
w = Workbooks.Count
For i = 1 To w
Workbooks(i).Save
Next
Workbooks.Close
End Sub

Workbooksコレクションオブジェクトには、Close メソッドが使えますが、Saveメソッドは使えないので、
上記のようにします。 
For Each In については別の機会に説明します。


「ファイルを開く」ダイアログボックスで、ファイルを指定してオープンし、作業終了後、保存して閉じる、
という一連の流れのマクロ。(ファイルのオープン、保存・クローズは独立したプロシージャにして、呼び出して
いる。)

Sub book_open_close()
temp$ = ActiveWorkbook.Name
myfile$ = book_open2()    'ブックのオープン
' 何らかの処理をここに記述
book_save_close2 myfile$   'ブックの保存・クローズ
Workbooks(temp$).Activate
End Sub

Function book_open2() As String
temp$ = ActiveWorkbook.Name
filename$ = Application.GetOpenFilename("EXCELファイル (*.xls),*.xls")
Workbooks.Open filename$
book_open2 = filename$
End Function

Sub book_save_close2(f$)
MsgBox f$ + "を保存、クローズします"

' PATH全体からファイル名だけを取得する・・・(*)
length = Len(f$)
s$ = ""
Do
s$ = Mid(f$, length, 1)
If s$ = "\" Then Exit Do
myfile = s$ + myfile
length = length - 1
Loop
Workbooks(myfile).Save
Workbooks(myfile).Close
End Sub


GetOpenFilename メソッドでは、パス名まで含んだファイル名を取得しますが、
Workbooks(  ) の( )には、ファイル名だけを記述しますので、(*)のところで、パス名からファイル名
だけを切り取っています。 


TopPage > Visual BasIc&Excel活用研究目次