Articles

ExcelでのWorkbookオブジェクトの使用VBA(開く、閉じる、保存、設定)

このチュートリアルでは、VBAを使用してExcelでブックを操作する方法を説明します。Excelでは、’Workbook’は’Workbooks’コレクションの一部であるオブジェクトです。 ワークブック内には、ワークシート、グラフシート、セルと範囲、グラフオブジェクト、図形などのさまざまなオブジェクトがあります。

VBAを使用すると、特定のブックを開く、ブックを保存して閉じる、新しいブックを作成する、ブックのプロパティを変更するなど、workbookオブジェクトで多

それでは始めましょう。

このチュートリアルで言及したすべてのコードは、Visual Basic Editorに配置する必要があります。 どのように動作するかを知るには、”VBAコードを配置する場所”セクションに移動します。あなたはVBAの簡単な方法を学ぶことに興味があるなら、私のオンラインExcel VBAトレーニングをチェックしてください。VBAを使用してブックを参照する

VBAでWorkbookオブジェクトを参照するには、さまざまな方法があります。 あなたが選択する方法は、あなたがやりたいことに依存します。 このセクションでは、ワークブックを参照するさまざまな方法と、いくつかのコード例について説明します。

ブック名の使用

参照するブックの正確な名前がある場合は、コード内でその名前を使用できます。

簡単な例から始めましょう。

二つのブックを開いていて、名前–Examplesでブックをアクティブにしたい場合。xlsx、あなたは以下のコードを使用することができます:

Sub ActivateWorkbook()Workbooks("Examples.xlsx").ActivateEnd Sub

ファイルが保存されている場合は、拡張子と一緒にファイル名を使用する必 保存されていない場合は、ファイル拡張子なしで名前を使用できます。

使用する名前がわからない場合は、プロジェクトエクスプローラーのヘルプを参照してください。

ExcelのWorksheetsオブジェクトVBA-プロジェクトエクスプローラのファイル名

ブックをアクティブにして、そのブック内のワークシート内の特定のセルを選択する場合は、セルのアドレス全体(ブックとワークシート名を含む)を指定する必要があります。

Sub ActivateWorkbook()Workbooks("Examples.xlsx").Worksheets("Sheet1").ActivateRange("A1").SelectEnd Sub

上記のコードは、最初に例のSheet1をアクティブにします。xlsxブックを選択し、シート内のセルA1を選択します。

ワークシートまたはセル/範囲への参照がブックを参照せずに行われるコードがよく表示されます。 これは、コードが含まれており、アクティブなブックでもある同じブック内のワークシート/範囲を参照しているときに発生します。 ただし、場合によっては、コードが機能することを確認するためにブックを指定する必要があります(詳細は、ThisWorkbookセクションを参照してください)。

インデックス番号の使用

インデックス番号に基づいてブックを参照することもできます。

たとえば、3つのブックを開いている場合、次のコードはメッセージボックスに3つのブックの名前を表示します(一度に1つずつ)。上記のコードは、指定されたテキスト/値(この場合はブック名)を持つメッセージボックスを表示する関数であるMsgBoxを使用します。

ブックでインデックス番号を使用する際によくある問題の1つは、最初のブックと2番目のブックがどちらであるかわからないことです。 確かに、上記のようにコードを実行するか、開いているワークブックをループしてインデックス番号を知る必要があります。

Excelでは、最初に開かれたブックはインデックス番号が1、次のブックは2というように扱われます。

この欠点にもかかわらず、インデックス番号を使用すると便利です。 たとえば、開いているすべてのブックをループしてすべてを保存する場合は、インデックス番号を使用できます。 この場合、すべてのブックにこれが発生するようにするため、個々のインデックス番号については心配しません。以下のコードは、開いているすべてのブックをループし、このVBAコードを持つブックを除くすべてを閉じます。上記のコードは、開いているワークブックの数をカウントし、For Eachループを使用してすべてのワークブックを通過します。

if条件を使用して、ブックの名前がコードが実行されているブックの名前と同じかどうかを確認します。一致しない場合は、ワークブックを閉じて次のワークブックに移動します。

一致しない場合は、ワークブックを閉じて次のワークブックに移動します。

WbCountから1へのループを-1のステップで実行したことに注意してください。 これは、各ループと同様に行われ、開いているブックの数は減少しています。

ThisWorkbookについては、後のセクションで詳しく説明します。

Activeworkbookを使用する

ActiveWorkbookは、名前が示すように、アクティブなブックを指します。

以下のコードは、アクティブなブックの名前を表示します。VBAを使用して別のブックをアクティブにすると、その後のVBAのActiveWorkbook部分がアクティブ化されたブックの参照を開始します。この例を次に示します。

ワークブックがアクティブで、次のコードを挿入して実行すると、最初にコードを持つワークブックの名前が表示され、次に例の名前が表示されます。xlsx(コードによって活性化されます)。VBAを使用して新しいブックを作成すると、新しく作成されたブックが自動的にアクティブなブックになることに注意してください。

Thisworkbookの使用

ThisWorkbookは、コードが実行されているブックを参照します。

すべてのブックには、ThisWorkbookオブジェクトがその一部として含まれています(プロジェクトエクスプローラーに表示されます)。

VBAのブックオブジェクト-ThisWorkbook

‘ThisWorkbook’は、通常のマクロ(モジュールを追加するものと同様)とイベントプロシージャを格納できます。 イベントプロシージャは、セルをダブルクリックしたり、ブックを保存したり、ワークシートをアクティブ化したりするなど、イベントに基づいてトリガー

この’ThisWorkbook’に保存したイベントプロシージャは、特定のシートのみに制限されているシートレベルのイベントと比較して、ブック全体で使用できます。

たとえば、プロジェクトエクスプローラーでThisWorkbookオブジェクトをダブルクリックし、その中に以下のコードをコピーして貼り付けると、ブック全体のセルThisWorkbookの主な役割はイベントプロシージャを格納することですが、コードが実行されているブックを参照するために使用することもできます。

以下のコードは、コードが実行されているブックの名前を返します。Thisworkbook(ActiveWorkbookよりも)を使用する利点は、すべてのケースで同じワークブック(コードが含まれているワークブック)を参照することです。 したがって、VBAコードを使用して新しいブックを追加すると、ActiveWorkbookは変更されますが、ThisWorkbookはコードを持つものを参照します。

新しいワークブックオブジェクトを作成する

次のコードは、新しいワークブックを作成します。新しいブックを追加すると、アクティブなブックになります。

Sub CreateNewWorkbook()Workbooks.AddEnd Sub

新しいブックを追加すると、アクティブなブックになります。次のコードは、新しいブックを追加し、そのブックの名前を表示します(これはデフォルトのBook1タイプ名になります)。P>

Sub CreateNewWorkbook()Workbooks.AddMsgBox ActiveWorkbook.NameEnd Sub

VBAを使用してブックを開く

ブックのファイルパスがわかっている場合は、VBAを使用して特定のブックを開くことができます。

以下のコードは、ワークブックの例を開きます。私のシステムのDocumentsフォルダにあるxlsx。

Sub OpenWorkbook()Workbooks.Open ("C:\Users\sumit\Documents\Examples.xlsx")End Sub

ファイルがデフォルトのフォルダに存在する場合、VBAがデフォルトで新しいファイルを保存するフォルダである場合は、パス全体を指定せずにブック名を指定することができます。p>

Sub OpenWorkbook()Workbooks.Open ("Examples.xlsx")End Sub

開こうとしているブックが存在しない場合は、エラーが表示されます。このエラーを回避するには、コードに数行を追加して、ファイルが存在するかどうかを最初に確認し、存在する場合はそれを開こうとします。以下のコードはファイルの場所をチェックし、存在しない場合はカスタムメッセージ(エラーメッセージではありません)を表示します。

Sub OpenWorkbook()If Dir("C:\Users\sumit\Documents\Examples.xlsx") <> "" ThenWorkbooks.Open ("C:\Users\sumit\Documents\Examples.xlsx")ElseMsgBox "The file doesn't exist"End IfEnd Sub

Sub OpenWorkbook()On Error Resume NextDim FilePath As StringFilePath = Application.GetOpenFilenameWorkbooks.Open (FilePath)End Sub

上記のコードは、開くダイアログボックスを開きます。 開くファイルを選択すると、ファイルパスがFilePath変数に割り当てられます。 ワークブック。Openは、ファイルパスを使用してファイルを開きます。

ユーザーがファイルを開かずにキャンセルボタンをクリックすると、FilePathはFalseになります。 この場合にエラーが発生しないように、’On Error Resume Next’ステートメントを使用しました。

関連:Excel VBAでのエラー処理についてのすべてを学ぶ

ブックの保存

アクティブなブックを保存するには、以下のコードを使用します。

Sub SaveWorkbook()ActiveWorkbook.SaveEnd Sub

このコードは、すでに以前に保存されているブックに対して機能します。 また、ブックには上記のマクロが含まれているため、aとして保存されていない場合。xlsm(または.xls)ファイルを開くと、次にマクロを開くときにマクロが失われます。

初めてブックを保存する場合は、以下のようなプロンプトが表示されます。

VBAのWorkbookオブジェクト-初めてブックを保存するときの警告

初めて保存するときは、’Saveas’オプションを使用することをお勧めします。

以下のコードは、アクティブなブックをaとして保存します。デフォルトの場所(私のシステムのドキュメントフォルダ)にあるxlsmファイル。ファイルを特定の場所に保存する場合は、ファイル名の値でそれを言及する必要があります。

Sub SaveWorkbook()ActiveWorkbook.SaveAs Filename:="Test.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabledEnd Sub

ファイルを特定の場所に保存する場合は、ファイル名の値でそれを言及する必要があります。 以下のコードは私のデスクトップにファイルを保存します。ユーザーにファイルを保存する場所を選択するオプションを取得させたい場合は、Saveasダイアログボックスの呼び出しを使用できます。

Sub SaveWorkbook()ActiveWorkbook.SaveAs Filename:="C:\Users\sumit\Desktop\Test.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabledEnd Sub

以下のコードは、Saveasダイアログボックスを示し、ユーザーがファイルを保存する場所を選択できるようにします。FileFormat:=x lopenxmlworkbookmacroenabledを使用する代わりに、FileFormat:=52を使用することもできます。

開いているすべてのブックを保存する

複数のブックを開いていて、すべてのブックを保存する場合は、以下のコードを使用できます。

Sub SaveAllWorkbooks()Dim wb As WorkbookFor Each wb In Workbookswb.SaveNext wbEnd Sub

上記は、保存されていないブックを含むすべてのブックを保存します。 以前に保存されていないブックは、既定の場所に保存されます。

以前に保存されたブックのみを保存する場合は、以下のコードを使用できます:

Sub SaveAllWorkbooks()Dim wb As WorkbookFor Each wb In WorkbooksIf wb.Path <> "" Thenwb.SaveEnd IfNext wbEnd Sub

すべてのブックを保存して閉じる

現在のコードが含まれているブックを除くすべてのブックを閉じる場合は、以下のコードを使用できます。

Sub CloseandSaveWorkbooks()Dim wb As WorkbookFor Each wb In WorkbooksIf wb.Name <> ThisWorkbook.Name Thenwb.Close SaveChanges:=TrueEnd IfNext wbEnd Sub

上記のコードは、すべてのブックを閉じます(コードがあるブックを除く–ThisWorkbook)。 これらのワークブックに変更がある場合、変更は保存されます。 保存されていないブックがある場合は、名前を付けて保存ダイアログボックスが表示されます。

ブックのコピーを保存する(タイムスタンプ付き)

Excelブックで複雑なデータとダッシュボードを操作しているとき、私は多くの場合、ブックの異 これは、現在のワークブックで何か問題が発生した場合に役立ちます。 私は少なくともそれのコピーを別の名前で保存しておきます(そして私はコピーを作成した後に私がした仕事を失うだけです)。ここでは、ブックのコピーを作成し、指定した場所に保存するVBAコードを示します。p>

Sub CreateaCopyofWorkbook()ThisWorkbook.SaveCopyAs Filename:="C:\Users\sumit\Desktop\BackupCopy.xlsm"End Sub

上記のコードは、このマクロを実行するたびにブックのコピーを保存します。これはうまくいきますが、このコードを実行するたびに別のコピーが保存されていれば、より快適に感じるでしょう。 これが重要な理由は、私が不注意な間違いをしてこのマクロを実行すると、間違いのある作業が保存されるからです。 そして、私は間違いを犯す前に仕事にアクセスすることはできませんでした。このような状況を処理するには、作業を保存するたびに新しいコピーを保存する以下のコードを使用できます。 また、ブック名の一部として日付とタイムスタンプも追加されます。 これは、以前に作成したバックアップのいずれかを失うことはありませんので、あなたがした間違いを追跡するのに役立ちます。上記のコードは、このマクロを実行し、ブック名に日付/タイムスタンプを追加するたびにコピーを作成します。

ワークシートごとに新しいワークブックを作成する

場合によっては、複数のワークシートを持つワークブックがあり、ワークシートごとにワークブックを作これは、単一のワークブックに月次/四半期レポートがあり、これらをワークシートごとに1つのワークブックに分割する場合に当てはまります。

または、部門別のレポートがあり、これらを個々のワークブックに分割して、これらの個々のワークブックを部門長に送信できるようにする場合。ここでは、各ワークシートのワークブックを作成し、ワークシートと同じ名前を付けて、指定したフォルダーに保存するコードを示します。上記のコードでは、2つの変数’ws’と’wb’を使用しました。

コードは各ワークシートを通過し(For Each Nextループを使用して)、そのワークブックを作成します。 また、worksheetオブジェクトのcopyメソッドを使用して、新しいブックにワークシートのコピーを作成します。SETステートメントを使用して、コードによって作成された新しいブックに’wb’変数を割り当てたことに注意してください。

この手法を使用して、workbookオブジェクトを変数に割り当てることができます。 これについては、次のセクションで説明します。VBAでは、オブジェクトを変数に割り当て、その変数を使用してそのオブジェクトを参照することができます。たとえば、以下のコードでは、VBAを使用して新しいブックを追加し、そのブックを変数wbに割り当てます。 これを行うには、SET文を使用する必要があります。ブックを変数に割り当てると、ブックのすべてのプロパティが変数でも使用できるようになります。コードの最初のステップは、’wb’をワークブック型変数として宣言することです。 これは、この変数がworkbookオブジェクトを保持できることをVBAに伝えます。

次のステートメントでは、SETを使用して、追加する新しいブックに変数を割り当てます。 この割り当てが完了したら、wb変数を使用してブックを保存することができます(またはそれを使用して何か他のことを行うことができます)。

開いているワークブックをループする

上記のコードでループを使用したいくつかのコード例を既に見てきました。このセクションでは、VBAを使用して開いているブックをループするさまざまな方法について説明します。

開いているすべてのブックを保存して閉じたいとしますが、コードが含まれているブックを除いて、以下のコードを使用できます。

Sub CloseandSaveWorkbooks()Dim wb As WorkbookFor Each wb In WorkbooksIf wb.Name <> ThisWorkbook.Name Thenwb.Close SaveChanges:=TrueEnd IfNext wbEnd Sub

上記のコードはFor eachループを使用してWorkbooksコレクション内の各ブックを通過します。 これを行うには、最初に’wb’をワークブック型変数として宣言する必要があります。

すべてのループサイクルで、各ブック名が分析され、コードを持つブックの名前と一致しない場合は、コンテンツを保存した後に閉じられます。

以下に示すように、別のループでも同じことができます:上記のコードは、For Nextループを使用して、コードが含まれているブックを除くすべてのブックを閉じます。

Sub CloseWorkbooks()Dim WbCount As IntegerWbCount = Workbooks.CountFor i = WbCount To 1 Step -1If Workbooks(i).Name <> ThisWorkbook.Name ThenWorkbooks(i).Close SaveChanges:=TrueEnd IfNext iEnd Sub

この場合、workbook変数を宣言する必要はありませんが、代わりに開いているworkbookの総数を数える必要があります。 カウントがあるときは、For Nextループを使用して各ブックを通過します。 また、この場合はブックを参照するためにインデックス番号を使用します。上記のコードでは、ステップ-1でWbCountから1にループしていることに注意してください。 これは、各ループと同様に必要であり、ブックが閉じられ、ブックの数が1減少します。

ワークブックオブジェクトの操作中にエラー(実行時エラー’9′)

ワークブックを操作するときに発生する可能性のある最も一般的なエラーの1つは、-実行時エラー’9’–添字が範囲外です。

VBAのワークブックオブジェクト-ランタイムエラー9添字範囲外

一般的に、VBAのエラーはあまり有益ではなく、何が間違っていたのかを把握するためにあなたに任せてしまうことがよくあります。

このエラーにつながる可能性がある考えられる理由のいくつかは次のとおりです。

  • アクセスしようとしているブックが存在しません。 たとえば、Workbooks(5)を使用して5番目のワークブックにアクセスしようとしていて、開いているワークブックが4つしかない場合、このエラーが発生します。
  • ブックを参照するために間違った名前を使用している場合。 たとえば、ワークブックの名前がExamplesの場合です。xlsxとあなたは例を使用します。xlsx。 次に、このエラーが表示されます。
  • ブックを保存しておらず、拡張機能を使用している場合は、このエラーが発生します。 たとえば、ブック名がBook1で、Book1という名前を使用している場合です。xlsxを保存せずに、このエラーが発生します。
  • アクセスしようとしているブックが閉じられています。

開いているすべてのワークブックのリストを取得する

現在のブック(コードを実行しているブック)内の開いているすべてのワークブックのリストを取得する場合は、以下のコードを使用できます。

Sub GetWorkbookNames()Dim wbcount As Integerwbcount = Workbooks.CountThisWorkbook.Worksheets.AddActiveSheet.Range("A1").ActivateFor i = 1 To wbcountRange("A1").Offset(i - 1, 0).Value = Workbooks(i).NameNext iEnd Sub

上記のコードは、新しいワークシートを追加し、開いているすべてのワークブックの名前を一覧表示します。ファイルパスも取得したい場合は、以下のコードを使用できます:

Sub GetWorkbookNames()Dim wbcount As Integerwbcount = Workbooks.CountThisWorkbook.Worksheets.AddActiveSheet.Range("A1").ActivateFor i = 1 To wbcountRange("A1").Offset(i - 1, 0).Value = Workbooks(i).Path & "\" & Workbooks(i).NameNext iEnd Sub

セルをダブルクリックして指定したブックを開きます

Excelブックのファイルパスのリストがある場合は、以下のコードを使

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)Workbooks.Open Target.ValueEnd Sub

このコードはThisWorkbookコードウィンドウに配置されます。これを行うには:

  • プロジェクトエクスプローラーでThisWorkbookオブジェクトをダブルクリックします。 ThisWorkbookオブジェクトは、この機能が必要なブック内にある必要があります。
  • 上記のコードをコピーして貼り付けます。これで、開きたいファイルの正確なパスがある場合は、ファイルパスをダブルクリックするだけでそれを行うことができ、VBAはそのブックを即座に開

    VBAコードをどこに置くか

    VBAコードがExcelブックのどこにあるのか疑問に思っていますか?

    ExcelにはVBAエディタと呼ばれるVBAバックエンドがあります。 コードをコピーして、VBエディタモジュールコードウィンドウに貼り付ける必要があります。

    これを行う手順は次のとおりです。

    1. 開発者タブに移動します。Excelでブックを使用するVBA-リボンの開発者タブ
    2. Visual Basicオプションをクリックします。 これは、バックエンドでVBエディタを開きます。Visual Basicをクリックします
    3. Vbエディターのプロジェクトエクスプローラーペインで、コードを挿入するブックのオブジェクトを右クリ プロジェクトエクスプローラーが表示されない場合は、[表示]タブに移動し、[プロジェクトエクスプローラー]をクリックします。
    4. 挿入に移動し、モジュールをクリックします。 これにより、ブックのモジュールオブジェクトが挿入されます。Excel VBAでブックを使用する-モジュールを挿入する
    5. モジュールウィンドウにコードをコピーして貼り付けます。Excel VBAでブックを使用する-モジュールを挿入する

    次のExcel VBAチュートリアルも好きかもしれません。

    • Excelでマクロを記録する方法。
    • Excelでユーザー定義関数を作成します。
    • Excelでアドインを作成して使用する方法。
    • パーソナルマクロブックに配置してマクロを再開する方法。Excelのフォルダからファイル名のリストを取得します(VBAの有無にかかわらず)。Excel VBA InStr関数の使用方法(実用的な例を含む)。VBAを使用してExcelでデータをソートする方法(ステップバイステップガイド)。