オーロラさんの勉強帳

33歳、未経験からIT業界へ。SESのロースキル客先常駐勤務。データベース、Excel、Excel VBA、ネットワーク、LinuxなどIT関連のことを主に書いていきます。

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

VBA 再入門33 Val関数 (数値へ変換)

Val関数とは

Val関数は文字列形式の数値を、数値型に変換します。引数の文字列の左側から数値と認識できる部分のみを数値に変換し、それ以外は除去します。左端が文字の場合は、0を返します。

構文
Val(文字列)

サンプルコード

引数"AB124"を指定した場合、Val関数は左端から数値と認識できる部分のみを変換、左端が数値以外の場合は0を返すので0が返されます。
引数"124AB"の場合は、左端の124までが数値と認識できるので、数値に変換します。

Sub sampleVal()
    Range("A1") = Val("AB124")
    Range("A2") = Val("124AB")
End Subd

f:id:auroralights:20210118223354p:plain

サンプルコード2

以下のコードでは、A列に入っている単位が付いた数値から数値のみを取り出して、B1セルに合計値を返しています。

Sub sampleVal2()
    
    Dim i As Long, tmp As Long
    For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
        tmp = tmp + Val(Cells(i, 1))
    Next
    Range("B1") = tmp
    
End Sub

f:id:auroralights:20210118224131p:plain