エラーの意味がわからない…
こんにちは。Excelを使い始めて20年ちょっと。仕事のほとんどでExcelを使ってきたベテランExcel使いこと、テックライターの平山です。
VBAに関するこの記事を読んでいらっしゃる皆さんのこと、きっとExcelをつかったスキルアップや作業効率化のために、シートのアクティブ化が必要になっているはずです。
多くの場合、実用的かつ複雑な処理ではシートは当然のように複数存在します。そのため、VBAでシートをまたいだ操作をしたい場合、アクティブ化ができないと話になりません。そして、普段あまりプログラミングに慣れていないと対応が難しいのがエラーが発生したときです。
この記事では普段はプログラミングとはあまり縁がないけれど、VBAを使って効率を上げたいあなたのために、エンジニア寄りではない、普通の言葉とスモールステップでシートのアクティブ化とエラー発生時の対応を解説します。
エラー対応を一通り習得できれば、VBAのシート操作に自信を持てるようになるでしょう。早速行ってみましょう!
VBAでシートをアクティブにする方法
この章ではシートをアクティブにする具体的な方法を紹介していきます。まずは一番簡単な方法から。下のようにWorksheets(”シート名”).Activateとすることで、シート名のシートをアクティブ化できます。
Sub Test() Worksheets("Sheet1").Activate End Sub
シート名の部分はインデックスで置き換えることも可能です。インデックスは各シートに連番で振られている番号で、最初のシートから1,2,3・・・となります。上のサンプルをインデックスで書き換えると次のとおりです。
Sub Test() Worksheets(2).Activate End Sub
シート名と違い、インデックスの場合は数値型なのでダブルクォーテーションで囲まない点に注意が必要ですね。ここからは少し応用的な使い方です。ワークシートオブジェクトを生成して、操作したいワークシートをセットする方法を紹介します。
これは、シート名が長いなど、何度も入力するのが煩わしい際に有効な方法です。シートを変数に格納してしまうようなイメージでしょうか。書き方は以下のようになります。
Sub Test() 'まずシートを格納するためのWorksheetオブジェクトを定義します。 Dim WS As Worksheet 'オブジェクトへの格納にはSetを用います。 Set WS = Sheets("佐賀支店第4四半期売掛金取引先別一覧") 'WSオブジェクトをアクティブ化します WS.Activate '該当する名前のシートが存在しない場合、エラーとなるので注意 End Sub
ここでオブジェクトという専門用語が突然出てきました。オブジェクトについてきちんと理解しようとするとわりと沼にハマることがあるので、初心者のうちは次のように具体的な対象を覚えておくほうが簡単です。
- オブジェクト = セルやワークシート、ブック、RangeなどVBAで操作できるもの
オブジェクトはVBA以外のプログラム言語を習得する際も壁になる、なかなか厄介な概念です。深入りしすぎてドツボにはまらないよう、お気をつけください。シートのアクティブ化についてより深く学びたい方はこちらの記事もご参照ください。
こちらはメソッドを使ってアクティブ化に重点をおいた記事。
こちらはアクティブ化したシートをどのように操作するかに重点をおいた記事になっています。
エラー対策の概要
これ以降の章ではエラーが発生したときの原因と対処法を紹介していきます。まずは、エラーが発生したときの心構えです。マイクロソフトの製品にありがちなことですが、多くの初心者にとって、エラーの説明文から実際の問題を類推するのはとても難しい問題です。
学習が進みいろいろな部分の理解が深まれば、確かに正しくエラーで問題点を指摘しているのがわかるのですが、はじめのうちは意味がさっぱりわからないことがほとんどでしょう。
正確性は落ちますが、まずはこのエラー番号のときはここを確認する、という方法論を覚え、実際に使いながらエラーの内容を理解できるようになっていくのが初心者にとってやりやすいのではないかと思います。それでは早速、よくあるエラーとその解決策を見ていきましょう。
438 オブジェクトは、このプロパティまたはメソッドをサポートしていません。
人によっては割とよく見かけるのがこのエラーではないでしょうか。これは主にメソッドのスペルミスの際に表示されるエラーです。例えば以下のサンプルは438エラーが生じます。
Sub Test() Worksheets(1).Active End Sub
正しくは以下のとおり、ActiveではなくActivateですね。
Sub Test() Worksheets(1).Activate End Sub
高性能な補完機能のついたエディタに慣れてしまうと、こういった部分でミスタイプすることが結構増えてきます。具体的な対処法は注意することぐらいしかできませんが、438エラーが出たらスペルミスを疑ってみましょう。
91 オブジェクト変数または With ブロック変数が設定されていません。
少しできることが増えてきて、応用的な方法を試してみよう、と思ったあたりで遭遇しやすくなるのがこちらのエラーです。主な原因はオブジェクト変数に値を代入する際にSetを書き忘れていた場合です。
例えば、下のサンプルは91エラーが生じます。
Sub Test() 'アクティブシートを取得 Dim wsActive As Worksheet wsActive = ActiveSheet 'シート名をメッセージで確認 MsgBox "アクティブシートの名前は" & wsActive.Name & "です" End Sub
オブジェクト変数に値を代入する場合、普通の変数と異なりSetステートメントが必要になります。この点をうっかり忘れてしまうことが多く、オブジェクト変数を多用する場合にはよく遭遇するエラーになりますね。エラーの出ないサンプルはこちらになります。
Sub Test() 'アクティブシートを取得 Dim wsActive As Worksheet 'Setを先頭に追加 Set wsActive = ActiveSheet 'シート名をメッセージで確認 MsgBox "アクティブシートの名前は" & wsActive.Name & "です" End Sub
9 インデックスが有効範囲にありません
シートをアクティブ化するときに初心者も経験者も遭遇するのがこちらのエラーです。主な原因はアクティブ化したいシート名の書き間違いですね。こちらもVBAの自動補完の効かないエディタでは、よくあるエラーです。
9エラーを出すサンプルは下のようになります。
Sub Test() Worksheets("Cheet1").Activate End Sub
正しいサンプルはこちらですね。
Sub Test() 'CheetをSheetに訂正 Worksheets("Sheet1").Activate End Sub
このように、9エラーが発生した場合は逐次書き直すことが必要です。しかしそれ以前の問題として、見分けがつきにくかったり、取り回しが悪いシート名・変数名を使うべきではありません。理想は自分以外の人が見てもすぐに意味が理解でき、使うことのできる変数名です。
ココらへんはプログラミングの言語を問わない、読みやすいコードの話になってきます。大規模なプログラムを開発する予定のある人、複数人でコードを使い回す必要がある人は言語そのものの勉強とは別に、読みやすいコードの書き方も学んでおくと後々役に立つでしょう。
まとめ
いかがでしたか? 今回は
- VBAでシートをアクティブ化する基本的な方法
- かよくあるエラーの対策方法
までをご紹介しました。今の時代、大体のエラーに対するわかりやすい対処法はネット上に公開されています。プログラミングを学習していく中でいろいろなエラーに遭遇するかと思いますが、自分に合ったわかりやすい解説を探しつつ、じっくりエラーと向き合っていっていただければ、と思います。
この記事が皆様のエラー解決の一助となれば幸いです。お相手はExcelと付き合い始めて20年、今も裏でサブPCにOfficeをインストール中の平山でした。