オーロラさんの勉強帳

IT企業勤務。データベース、Excel、Excel VBA、ネットワーク、LinuxなどIT関連のことを主に書いていきます。少しでもお役に立てたら幸いです。

【Excel VBA エキスパート ベーシック】Save・SaveAsメソッド ブックを保存する(VBA入門 35)

ブックの保存について

ブックの保存には、「上書き保存」と「名前を付けて保存」の2種類があります。
「上書き保存」はすでに保存済みのブックに対して、名前を変更せずに編集内容を保存します。
「名前を付けて保存」は新規ブックを初めて保存するときや、すでに保存しているブックを別名で保存するときに使います。

上書き保存/Saveメソッド

Saveメソッドは、ブックを「上書き保存」します。


サンプルコード1
現在アクティブなブックを上書き保存します。アクティブブックがまだ一度も保存されていない場合は、カレントディレクトリに「Book1」「Book2」などの名前で保存れます。

Sub sampleSave()
    ActiveWorkbook.Save
End Sub


サンプルコード2
ただ、ブックを開いて保存するだけのコードです。
Aplication.GetOpenFilenameでオープンするブックをダイアログボックスで指定し、変数「fName」に開くブックのフルパスを代入。
fNameに対して、Openでそのブックを開きます。その後にDir(fName)でブック名だけを取り出し、Workbooks(ブック名).Saveで該当のブックを保存しています。

Sub sampleSave2()

    Dim fName As String
    fName = Application.GetOpenFilename("Excelブック,*.xlsx")
    Workbooks.Open fName

    Workbooks(Dir(fName)).Save

End Sub

名前を付けて保存/SaveAsメソッド

SaveAsメソッドは、「名前を付けて保存」します。


サンプルコード1
新しくブックを追加し、そのブックを「Test.xlsx」という名前でDドライブ直下に別名保存します。

Sub sampleSaveAs()
    Workbooks.Add
    ActiveWorkbook.SaveAs Filename:="D:\Test.xlsx"
End Sub

VBA 再入門35 Openメソッド ブックを開く

目次


※本記事の「\」は半角の「¥」のことです。

Openメソッド

ブックを開くにはWorkbooksコレクションのOpenメソッドを使用します。Openメソッドにはたくさんの引数がありますが、この記事では開くブックを指定するFilenameのみ説明いたします。


Openメソッドの書式

Workbooks.Open Filename := "ブックのフルパス"

ブックがカレントフォルダにある場合は、Filenameにブック名だけ指定することもできます。

カレントフォルダのブックを開く場合

ファイル名の指定だけで開くことができます。

Sub sampleOpen()
'ファイル名だけの指定
    Workbooks.Open Filename:="B.xlsx"
End Sub

カレントフォルダとは、現在の作業対象になっているフォルダのことです。[別名で保存]ダイアログで表示されているフォルダがカレントフォルダになります。
カレントフォルダはあくまで現在、作業対象のフォルダであってマクロのブックと同じ階層という意味ではありません。

カレントフォルダの簡単な確認方法

VBE画面のイミディエイトウィンドウで「Debug.Print CurDir」と入力してEnterを押すとカレントフォルダを表示することができます。
※イミディエイトウィンドウはVBE画面から「Ctrl」+「G」のショートカットで表示することができます。

Debug.Print CurDir

f:id:auroralights:20210126233527p:plain

カレントフォルダの注意点

カレントフォルダは意図しない操作で切り替わります。
例えば「名前を付けて保存」でカレントフォルダでないフォルダ(A)内に別のフォルダ(B)を作成した場合は、フォルダを作成したフォルダ(A)がカレントフォルダとなります。

f:id:auroralights:20210126234142p:plain
画像の場合はsubフォルダがカレントフォルダになります。

ブック名だけで指定した場合、カレントフォルダが意図しない操作で切り替わる可能性があるので、開くブックを取得するコードを記載するか、フルパスで指定する方が安全かもしれません。

カレントフォルダ以外のブックを開く場合

Filenameにブックのフルパスを指定しています。

Sub sampleOpen()
'フルパスでのブックの指定
    Workbooks.Open Filename:="C:\test\tmp\sub\C.xlsx"
End Sub

ThisWorkbook.Pathを使ってブックを指定する場合

コードを書いたブックと同フォルダにオープンしたいブックがある場合は、以下のように記述することもできます。

Sub sampleOpen3()
'--ThisWorkbook.Pathを使う方法
    Workbooks.Open Filename:=ThisWorkbook.Path & "\B.xlsx"
End Sub

ThisWorkbook.PathでVBAのコードが書かれたブックまでのパスを取得し、「& "\ブック名"」とすることで、同じフォルダの別ブックを指定しています。

VBA 再入門34 Workbooksコレクション・Workbookオブジェクト、Worksheetsコレクション・Worksheetオブジェクト

目次

Workbooksコレクション・ Workbookオブジェクトについて

Excelで複数のブックを開いている場合、複数のブックはWorkbooksコレクション、任意の1ブックはWorkbookオブジェクトになります。任意のブックを操作する場合は、必ず「Workbooksコレクションの中のどのブック」かを指定する必要があります。


例えば、以下の4ファイルをオープンしていて、Z.xlsmの標準モジュールにセル「A1」に100を代入するコードを記載して、実行します。
f:id:auroralights:20210125214126p:plain

<Z.xlsmの標準モジュール:アクティブなブックのアクティブなシートに処理>

Sub sample()
    Range("A1") = 100
End Sub

この場合はアクティブなブックのセルA1に100が入力されます。Z.xlsmがアクティブであればZ.xlsmのアクティブなシートのセルA1にA.xlsxがアクティブであればA.xlsxのアクティブなシートのセルAに100が入力されます。


決まった特定のブックに処理をしたい場合は、以下のようにWorkbooksコレクションのどのブック(オブジェクト)かを指定する必要があります。
どのブックかを指定すると、そのブックのどのワークシートかも指定する必要があります。

<Z.xlsmの標準モジュール:A.xlsxのシート1に処理>

Sub sample()
    Workbooks("A.xlsx").Worksheets("Sheet1").Range("A1") = 100
End Sub

上記の場合は、どのブックがアクティブでもA.xlsxのSheet1のセルA1に100が入力されます。


以下の記事はワークシートオブジェクトですが、オブジェクトを指定しない場合、標準モジュール、シートモジュール、ブックモジュールのどこに記載されているかで、どのシートが指定されるかの違いを紹介しています。
auroralights.jp

複数のブックの操作について

複数のブックの中の任意のブックを操作するには、Workbookコレクションでブックを指定しますが、ブックの指定には、「ブックの名前で指定する方法」と、「Excelが開いた順番に付けられる番号で指定する方法」の2つの方法があります。

'--1.ブック名で指定する方法
Sub sample()
    Workbooks("A.xlsx").Activate
End Sub
'--2.ブックの開いた番号で指定する方法
Sub sample()
    Workbooks(3).Activate
End Sub

※Activateメソッドは指定したブックをアクティブにするメソッドになります。

Worksheetsコレクション・オブジェクトについて

ブック内のワークシートはWorksheetsコレクション、特定のワークシートはWorksheetオブジェクトとして操作します。
ただし、シートはワークシートだけではなく、グラフシートやExcel4.0のマクロを記述するためのMacroシート、Excel5.0で使われていたダイアログシートがあります。

<Excelのシートの種類>
f:id:auroralights:20210125234714p:plain

<Worksheetsコレクション>
f:id:auroralights:20210125235636p:plain

<Sheetsコレクション>
f:id:auroralights:20210125235735p:plain

Worksheetsコレクションはブック内の全てのワークシート、Sheetsコレクションはワークシートだけでなくグラフ、Macro、ダイアログシートを含めたブック内の全てのワークシートを表します。
WorksheetsコレクションはSheetsコレクションに含まれます。

以下の2つのコードは同じSheet1を指定しています。

Sub sampleSheet()
    '--Worksheetsコレクション
    Worksheets("Sheet1").Activate
End Sub

Sub sampleSheet2()
    '--Sheetsコレクション
    Sheets("Sheet1").Activate
End Sub

複数のシートの操作について

複数のシートの場合は、どのブックのどのシートかを指定します。

以下のコードを標準モジュールに記述した場合は、アクティブブックに対して以下の処理をします。

Sub sampleSheet()
    '--Worksheetsコレクション
    Worksheets("Sheet1").Activate
End Sub


どのブックかを指定することで、特定のシートに対して処理を実施できます。

Sub sampleSheet()
    '--Worksheetsコレクション
    Workbooks("Book1.xlsm").Worksheets("Sheet1").Activate
End Sub