Home > Excel エクセルの使い方-マクロ/VBA
Excel エクセルの使い方-マクロ/VBA
「シートの順番を逆転させるマクロコード」という記事で、Excelファイルの全シートの順番を、逆の順序に並び替えするVBA(Visual Basic for Applications)マクロが紹介されています。
こちらのマクロでは、全シートを並び替えているわけですが、一部のシートだけを並び替えたいという要望も実務では出てくるな、と感じたのでそんなマクロを作ってみました。
VBA(Visual Basic for Applications)でマクロなどを作成しはじめた頃に、ぶつかる壁がいくつかあります。
その一つがダブルクォート・ダブルクォーテーションの入力です。
VBAでは、文字列をダブルクォートで括るのが大原則の一つとしてあるため、ダブルクォートそのものを文字列として扱うにはどうすればいいのか戸惑うわけです。
結論から言うと、ダブルクォートそのものを文字列として扱うためには、「""」とダブルクォートを2つ並べます。
VBAのコードの中でダブルクォートを「""」と2個並べておくと、実際には文字列としてのダブルクォート「"」1個が入力されることになります。
乱数を発生させるマクロをご紹介しました。
For Each ~ Nextループ文の中でRnd関数を使って乱数を発生させているだけのシンプルなマクロです。
このマクロでは重複した値が生成される可能性がありますが、重複しないランダムな数値・乱数が欲しいということも、よくあります。
実務で、たくさんのシートの含まれているExcelファイルを扱っていると、アクティブなシートだけを残して、他のシートをすべて削除したい、と感じるような場面があります。
似たようなことで、既定のファイルの場所を調べたいということもあります。
実務では、ワークシートの名前を、ブック名(ファイル名)と同じにしたいということがあります。
ブックの数が少なければ、手作業で変更したとしても、それほど大変ではありませんが、ブックが大量にあるとかなり面倒です。
ランダムな整数をセルに入力するマクロや、ランダムな日付を入力するマクロをご紹介してきました。
テストデータ・サンプルデータを作る場合、指定した文字列をランダムに入力するというマクロが欲しくなるということもあります。
例えば、
愛実
明日香
亜美
彩佳
というような人の名前を、ランダムにセルに入力したいという要望をいただくことがあります。
「エクセル 数式を文字列に変換」
という検索が行われていました。
このサイト・インストラクターのネタ帳では、Excelのセルに数式を表示する系の以下のような記事をご紹介してきました。
単純に表示するだけでよければ、これらの記事を参考にしてください。
パソコンインストラクターの方や、プログラマーの方だと、サンプルデータ・テストデータの類が必要になることがあります。
いろいろなタイプのデータが必要になるもので、ランダムな、ある程度の量の、日付データもよく求められるものの一つでしょう。
乱数を発生させるVBA(Visual Basic for Applications)マクロをご紹介しました。
このようなコードをご紹介すると、
「Randomizeって何をするものですか?」
「Randomizeステートメントとは何なのですか? 」
といったご質問をいただくことがあります。
このサイト・インストラクターのネタ帳で
「VBA 乱数」
「乱数 マクロ」
といった検索が行われていました。
VBA(Visual Basic for Applications)で、乱数を発生させるマクロについて調べている方による検索です。
Excelで業務用のワークシートを作成していると、いろいろな要望が出てきます。
ワークシート上で、ユーザーが操作できる範囲を限定したい、固定したいという要望もその一つです。
並べ替え機能を使って、一行おきに空白行を挿入する方法をご紹介しました。
Excelの並べ替え機能について理解していれば、VBA(Visual Basic for Applications)をご存知ない方でもできてしまうところが最大の利点です。
セルの先頭や末尾に入っている改行を削除するためのユーザー定義関数をご紹介しました。
印刷時に文字が切れてしまわないようにするために、逆に、セルの末尾に必ず改行を入れておきたいという要望が出ることもあります。
Excelから他のシステムにデータを渡す場合に、セルの最後に改行を入れておいて欲しいという要望が出ることもあります。
他の人の作成したExcelファイルを扱っていると、いろいろな要望が出てきます。
このデータがなぜ同じセルに入っているのかと思うことがあれば、なぜこれらのデータが別々のセルに入っているのかと思うこともあります。
私が最近、扱わせていただいているExcelでは、別のセルになっているけれども、後の処理を考えると同じセルになっているほうがありがたいデータがあります。
実務でExcelのデータを別のシステムに渡す場合には、いろいろな前処理が必要になります。
複数のセルの先頭に、同じ文字列を追加したいという要望も、よく必要とされる処理一つでしょう。
Excel 2010でユーザー設定リストを登録する方法をご紹介しました。
Excel 2010では、[Excelのオプション]ダイアログ-[詳細設定]を選択して、一番下までスクロールしなければいけない点が、ちょっと便利ではありません。
VBA(Visual Basic for Applications)を使える方なら、VBE(Visual Basic Editor)のイミディエイトウィンドウで一行コードを実行して表示するほうが簡単じゃないだろうか、と考える方もいらっしゃるかもしれません。(いや、私自身がそう考えたわけですが...)
で、実際に試してみましたところ、すごく簡単とは言いにくい結果なのですが、自分用の備忘録的意味も込めて、ご紹介しておきます。
XLSTARTフォルダについてと、XLSTARTフォルダのパスについて記事にさせていただきました。
VBA(Visual Basic for Applications)を使える方なら、簡単にXLSTARTフォルダのある場所、XLSTARTフォルダのパスを調べることもできます。
入力規則を設定して、ドロップダウンリストから選択してデータ入力できるようにするTipsは、業務用ワークシートを作成している方にとても人気があります。
この入力規則のリストを利用している方から、
「リストに設定してある項目を調べる方法はないのでしょうか」
といった相談をいただくことがあります。
[データの入力規則]ダイアログで、リストにどのような値が設定されているのかを知るためには、[データの入力規則]ダイアログを表示して確認する必要があります。
しかし、入力規則の設定されているセルが大量に存在する場合、いちいち[データの入力規則]ダイアログを表示して確認するというのは、かなり面倒な作業です。
このサイト・インストラクターのネタ帳で
「VBA セルの色設定ダイアログ表示方法」
という検索が行われていました。
VBA(Visual Basic for Applications)で、[セルの書式設定]ダイアログの、2007以降のExcelなら[塗りつぶし]タブ、
![[セルの書式設定]ダイアログ−[塗りつぶし]タブ](/itnote/archives/images/003775_a.png)
2003までなら[パターン]タブ
![[セルの書式設定]ダイアログ−[パターン]タブ](/itnote/archives/images/003775_b.png)
を表示させる方法を探している方による検索です。
Excelでセルの結合を行うと、よろしくない現象がいろいろ発生するので、私個人としてはセル結合を利用することはほとんどありません。
セル範囲の中央に文字列を簡単に表示するために[セルを結合して中央揃え]ボタンを利用する方が多いと思いますが、その場合、[選択範囲内で中央]を指定すればいいはずなのです。
しかし現実としては、セル結合に関連するご質問や要望をいただくことは、少なくありません。
もっとも多いのがセルを結合するショートカットキーでしょう。
セルを結合するそのままのショートカットキーは用意されていませんが、2003までのExcelなら[セルの結合]ボタンをツールバーに作成してボタンのテキストを表示するという方法で、Excel 2007・2010ならクイックアクセスツールバーに[セルの結合]ボタンを作成することで、アクセスキーをショートカットキーもどきとして使うことができます。
ショートカットキーについで多いのが、セルを結合するときにデータも一緒にマージできないのか、といったご質問・要望です。
データの入力されている複数のセルを結合しようとすると
「選択範囲には複数のデータ値があります。1つのセルとして結合すると、選択したセル範囲にある最も左上端にあるデータのみが保持されます(空白セルは無視されます)。」
といったメッセージが表示され、そのまま結合を実行すると左上端セルのデータだけが残ります。
これを、左上端のデータだけでなく、すべてのデータを残して、データをマージしてセル結合をしたいという要望をいただくことがあります。
このサイト・インストラクターのネタ帳で
「VBA 今日の日付」
「VBA TODAY ない」
といった検索が行われているのに気づきました。
Excelをある程度使える方で、VBA(Visual Basic for Applications)に挑戦しはじめた方による検索でしょう。
Excelのワークシート関数がある程度使えるようになり、VBAに挑戦しはじめた方が戸惑うポイントの一つが、関数名の違いです。
今日の日付を取得する関数の違いは、その代表的なものの一つです。
今日の日付を返すExcelのワークシート関数といえば、TODAY関数ですが、VBAの場合Todayといった関数はありません。
私が参照形式をA1形式からR1C1形式に切り替えたいと感じるのは、VBA(Visual Basic for Applications)で、何らかのコーディングを行っている最中がほとんどです。
この場合、Excelの画面ではなくVBE(Visual Basic Editor)がアクティブになっているわけですから、Excelの画面をアクティブにして[オプション]ダイアログを表示するという操作を面倒に感じてしまったりします。
そんな私と同じく面倒くさがり屋の方向けの小技をご紹介しておきます。
「エクセル すべてのシート 再表示」
「Excel 全ワークシート 表示する方法」
といった検索を見かけることがあります。
このサイト・インストラクターのネタ帳では非表示のシートをまとめて表示するマクロを既にご紹介しています。
実務でExcelを使っていると、複数の列に入力されているデータを1列にまとめたいということが、結構あります。
そんなとき、ひたすらコピー・アンド・ペーストを繰り返したり、ドラッグ・アンド・ドロップを繰り返すといった操作をしている方が少なくないと思います。
データ量がそれほどなければ、手作業でもいいのでしょうが、データが多いときに手作業で複数の列を一つにまとめるというのは、かなり面倒な作業です。
「エクセル 重複データ削除 マクロ」
「Excel 重複しないリスト作成 マクロ」
といった検索が、このサイト・インストラクターのネタ帳で行われているのを見かけることがあります。
重複データを削除するマクロ、元データから重複しないデータだけのリストを作成するマクロを探している方の検索です。
Excelではフィルタ機能を使って重複データの削除、重複しないリストの作成ができます。
2003までのExcelならメニュー[データ]−[フィルタ]−[フィルタオプションの設定]から、Excel 2007・2010なら[データ]タブ−[データツール]グループ−[重複の削除]ボタンから操作することで重複データを削除できます。
このサイト・インストラクターのネタ帳で、
「エクセル 値 残す 計算式 消す マクロ」
「値を残して数式を削除するマクロ」
といった検索が行われていることがあります。
計算結果を残して、数式・計算式を削除するVBA(Visual Basic for Applications)マクロを探している方の検索でしょう。
ループ処理で順番に数式を探してその結果を同じセルに張り付ければいいんだろう、と考えてしまう方もいらっしゃるかもしれませんが、そんな処理は一切必要ありません。
わかってしまうと驚くほど単純なコードで、計算結果を残して数式を削除するマクロはできてしまいます。
「エクセル マクロ 空白行削除」
「Exce VBA 空白の行 削除方法」
といった検索が行われているのを見かけることがあります。
Excelで空白行を削除するVBA(Visual Basic for Applications)マクロを探している方の検索です。
「VBA Excel 最大行数 取得方法」
といった検索がこのサイトで行われていることがあります。
VBA(Visual Basic for Applications)で、Excelの最大行数を取得する方法を探している方の検索です。
ワークシートのサイズは2003までのExcelの場合65,536行×256列でしたが、Excel 2007からは1,048,576行×16,384列となっています。
VBAでマクロを作成する場合に、ワークシート上に作成した表の最終行を選択するために
「Cells(65536, 1).End(xlUp).Select」
といった、非常によく使われるコードがあります。
2003までのExcelの場合は「65536」と直接入力されている
「Cells(65536, 1).End(xlUp).Select」
で問題ありませんでしたが、Excel 2007以降で大きな表を作成しているような場合、このコードでは表の最終行を取得できなくなってしまいました。
「エクセルで一行おきに行を削除するにはどうしたらいいのでしょうか?」
実務でExcelを使っている方からよくいただくご質問の一つです。
[Ctrl]キーを使って削除したい行を選択したり、データベース機能を使って一行おきに行を削除することもできますが、一行おきの行削除が頻繁に必要な場合、これらの操作では手間がかかって仕方ないということもあります。
こんなときにはVBA(Visual Basic for Applications)で、マクロを作ってしまいましょう。
Access 2007で、「DoCmd.ShowToolbar "Ribbon", acToolbarNo」というコードを実行してやれば、リボンを非表示にできることをご紹介しました。
Excel 2007でもリボンを非表示にしたいという要望はもちろん出てきます。
リボンの制御はXMLファイルを編集してやるのが、おそらく正当な方法なのですが、裏技的な方法でリボンを非表示にすることもできます。
「エクセルで四捨五入するには?」
というのは、Excel初心者の方からいただく、基本的なご質問の代表的なもののひとつです。(Excelのワークシート上で四捨五入をする関数はROUND関数です。)
四捨五入については、VBA(Visual Basic for Applications)を利用してらっしゃるレベルの方からご質問をいただくこともあります。
「VBAで四捨五入をするにはどうしたらいいのでしょうか?」
といったご質問です。
「そんなのRound関数でしょ!」
と思ったVBAユーザーの方、それは本当ですか?
VBAのRound関数の仕様をちゃんと確認しましたか?
VBAの
「Round(2.5,0)」
の結果を「3」だと思ってらっしゃいませんか?
ワークシート関数の
「ROUND(2.5,0)」
なら「2.5」の小数点以下第1位を四捨五入して
「3」ですが、
VBAの
「Round(2.5,0)」
は「3」ではなく「2」なのです。
VBA(Visual Basic for Applications)で、メニューをカスタマイズする方法をいろいろご紹介してきました。
- メニューバーを元に戻す
- メニューバーをカスタマイズするマクロ
- メニューが複数追加されないように
- Excelファイルを開いたときにメニューバーをカスタマイズする
- 特定のブックがアクティブなときだけメニューがカスタマイズされるように
- カスタマイズしたメニューにアクセスキーを表示する
- カスタマイズしたメニューでサブメニューを表示
- メニュー項目をすべて削除する
メニューバー内でのカスタマイズではなく、メニューバー自体を非表示にしたいといった要望をいただくこともありますのでご紹介しておきます。
シートの一部を操作できないようにする[シートの保護]機能は、複数の人が同じシートを操作するような場合に重要な機能の一つです。
このサイトではシートの保護について以下のようなネタをご紹介しています。
このシートの保護機能について
「シート保護 一括解除」
といった検索がこのサイトで行われているのを見かけることがあります。
イミディエイトウィンドウからOfficeのインストールされているパスを調べる方法をご紹介しました。
Officeのインストールされているパスではなく、開いているファイルのパスを調べたいということもよくあります。
このサイトのColorIndexプロパティ値を一覧にしたページは、トップ10にこそ入ってきませんがなかなかの人気ページです。
この一覧を見て、ワークシートで使われているColorIndexを調べるといった使い方をしている方もいらっしゃるようですが、VBA(Visual Basic for Applications)を使いこなしているレベルの方なら、ColorIndexを調べることは難しくありません。
VBA(Visual Basic for Applications)を使ってふりがなを設定・表示する方法をご紹介しています。
逆に、VBAでふりがなを削除するにはどうしたらいいのかといったご質問をいただくこともあります。
このサイトでは、[形式を選択して貼り付け]ダイアログを使ってハイパーリンクをまとめて削除できることをご紹介しています。
VBA(Visual Basic for Applications)を使いこなしているレベルの方なら、他にも簡単にハイパーリンクを一括で削除する方法がありますので、ご紹介しておきます。
ワークシートを挿入するとき、どんな操作をしてらっしゃいますか?
2003までのExcelなら、メニュー[挿入]−[ワークシート]からワークシートを挿入できます。
Excel 2007なら、[ホーム]タブ−[セル]グループ−[挿入][▼]ボタン−[シートの挿入]や、[ワークシートの挿入]タブから挿入できます。
シート見出しの上で右クリックして表示されるショートカットメニューから[挿入]を選ぶという方もいらっしゃるでしょう。
ショートカットキー:[Shift]+[F11]を使うという方もいらっしゃるでしょう。
様々な方法でワークシートを挿入できるわけですが、ワークシートの挿入直後にどんな操作をしてらっしゃいますか?
シート挿入直後に、挿入されたばかりのワークシートを移動している方が、結構いらっしゃるんじゃないでしょうか。
元々アクティブだったシートの右側に、新しく挿入したワークシートを移動している方が少なくないんじゃないかと、私は思っています。
Excelでは様々な方法でワークシートを挿入できるのですが、なぜかアクティブなシートの右側にワークシートを挿入するコマンドは用意されていません。
名前を付けて保存ダイアログにアクティブセルの値を表示するマクロをご紹介しました。
似たようなことですが、実務ではアクティブシートの名前をファイル名にして保存するといったこともあります。
そのため、[名前を付けて保存]ダイアログの[ファイル名]に、アクティブなシートの名前がデフォルト表示された状態で[名前を付けて保存]ダイアログが表示したい、といった要望をいただくこともあります。
アクティブセルの値を[名前をつけて保存]ダイアログに表示するマクロをご紹介しました。
似たようなことですが、アクティブセルの値をワークシート名にしたい、という要望をいただくこともあります。
「名前を付けて保存をしたときに、アクティブセルの値がファイル名になるようにできないのでしょうか?」
といったご質問をいただくことがあります。
お仕事の内容によっては、大量のExcelファイルを作成するなんていうことがあり、その保存作業時にいちいちファイル名を手入力するのが面倒と感じる方からいただくご質問です。
VBA(Visual Basic for Applications)でマクロを作成していると、VBE(Visual Basic Editor)を開いて、該当するコードを表示するという作業が頻繁に発生します。
そんなときどんな操作でマクロコードを表示してらっしゃいますか?
VBEを表示しておいてから探すという方が多いと思いますが、マクロ名(プロシージャ名)が間違いなくわかっていれば、Excel側から簡単にマクロのコードを表示することができます。
ファイル名・ワークブック名を取得するユーザー定義関数をご紹介しました。
この方法を知った方から、
「拡張子なしでファイル名をセルに表示するにはどうしたらいいのでしょう?」
というご質問をいただくこともあります。
VBA(Visual Basic for Applications)でメニューをカスタマイズする方法をご紹介してきました。
- メニューバーを元に戻す
- メニューバーをカスタマイズするマクロ
- メニューが複数追加されないように
- Excelファイルを開いたときにメニューバーをカスタマイズする
- 特定のブックがアクティブなときだけメニューがカスタマイズされるように
- カスタマイズしたメニューにアクセスキーを表示する
- カスタマイズしたメニューでサブメニューを表示
これまでご紹介したのは、標準のメニューバー上のメニュー項目はそのままでカスタマイズする方法でした。
VBA(Visual Basic for Applications)でメニューをカスタマイズする方法について、何度かご紹介しています。
これまでご紹介しているのは、メニューの直下にコマンドを表示する方法でしたが、カスタマイズしたメニューにサブメニューを表示させ、その下にコマンドを表示することもできます。
VBA(Visual Basic for Applications)で、メニューバーを操作する方法をご紹介してきました。
メニューをカスタマイズするマクロをご紹介しました。
実際に試してみた方はお気づきのはずですが、あのマクロにはちょっとした問題があります。
CustomizeMenuBarマクロを複数回実行すると、実行した回数分のメニュー項目が追加されてしまうのです。
VBA(Visual Basic for Applications)で、メニューバーを元の状態に戻す方法をご紹介しました。
このコードが必要なのは、もちろんメニューバーがカスタマイズされているなど、特殊な状況のときです。
「Excelでメニューを元の状態に戻すにはどうしたらいいのでしょうか?」
というご質問をいただくことがあります。
このご質問をいただく状況はいろいろあるように感じます。
VBA(Visual Basic for Applications)を使ってオリジナルのメニューを作成しようと仕様を考えている段階、どこかで拾ってきたマクロを実行しているうちにメニューバーを変更するようなコードを実行してしまい一部のコマンドが表示されなくなってしまったようなケース、など。
Excelユーザーで、VBA(Visual Basic for Applications)に触れ始めた方から時々いただく疑問・質問があります。
「VBAの関数とワークシート上で使える関数はなぜ違うのですか?」
というご質問です。
例えば、
今日の日付を取得するのは、
VBA関数の場合は「Date」ですが、
ワークシート関数では「TODAY」です。
日付の間隔を取得するのは、
VBA関数の場合は「DateDiff」ですが、
ワークシート関数では「DATEDIF」です。
(よく似ていますが、最後の「F」の数が違います。)
厄介なことに同じスペルで似たような動作をするのに実は違うものもあります。
VBA関数の「Round」は丸めを行いますが、
ワークシート関数の「ROUND」は四捨五入を行います。
VBE(Visual Basic Editor)をあちこちいじっているような方から、
「funcresパスワードというのは何を入力すればいいのでしょうか?」
「パスワードを設定したつもりはないのに、funcres(FUNCRES.XLA)を開こうとするとパスワードを要求されるのですが...?」
というご質問をいただくことがあります。
誤字・表記ゆれに関するするネタを何度かご紹介してきました。
他にもそんな語句がいくつかあり、Visual Basic for Applicationsの略称「VBA」も、そんな間違えられることのある語句の一つです。
Excelを実務で利用している方の中に、絶対参照にする必要のないセル参照を、相対参照のままにしておく方と、絶対参照にしたがる方とが存在します。
絶対参照はセル参照を含む数式の入力されているセルをコピーをしたときに、参照先セルを変更したくないときに利用する参照方式ですから、セルのコピーをしないような場合、絶対参照にする必要はなく相対参照のままで問題ありません。
けれども、すべてのセル参照を絶対参照にしておきたいという方が、時々いらっしゃいます。
数式を入力したワークシートを作成後、相対参照・絶対参照を理解していない方に利用してもらう場合に、不用意にセルの移動やコピーをされることによってエラーが発生するのを極力回避したいというという気持ちなどから、セル参照をすべて絶対参照にしておきたいという要望となるようです。
数式入力中に参照方式を変更するには、[F4]キーを押せばいいわけですが、数式の入力済みの場合、数式バーやセル内にカーソルを置いてから[F4]キーを押さなければ、相対参照を絶対参照にすることはできません。
数式の入力されているセル範囲を選択しておいて[F4]キーを押しても相対参照は絶対参照にはなりません。
そのため
「すべての相対参照を絶対参照にするにはどうすればいいのでしょうか?」
というご質問をいただくことになります。
「FUNCRES.XLAとは何ですか?」というご質問に関連したネタをご紹介しました。
とてもよく似た内容で
「WZTEMPLT.XLAとは何ですか?」
というご質問をいただくこともあります。
VBE(Visual Basic Editor)のプロジェクトエクスプローラに、
「wztemplt(WZTEMPLT.XLA)」
という項目が表示されることがあるためです。
[値の貼り付け]ボタンをツールバー上に作成し、アクセスキ−を表示させることによって、疑似ショートカットキー操作によって値の貼り付けを実行できることをご紹介しました。
本当のショートカットキー操作ができるようにするには、マクロを作成する必要があります。
マクロとイベントプロシージャで、セル結合をショートカットキーでできるようにする方法をご紹介しました。
もう一工夫すれば、セルが結合されている場合同じショートカットキーで、セル結合の解除を行うこともできます。
セル結合をキーボードで行う方法に関してネタをいくつかご紹介してきました。
ツールバー上のボタンにアクセスキーを表示させ、そのアクセスキーを利用すれば、擬似的なショートカットキーとして利用できるということです。
ですが、これらの[Alt]キーを使った操作は厳密な意味でのショートカットキーではないので、ツールバーが表示されていなければ利用できません。
PERSONAL.XLSとはどういうファイルなのか、についてご紹介しました。
もう一つPERSONAL.XLSファイル関連でいただく質問と言えば、
「『PERSONAL.XLSは編集中のためロックされています。』とは何ですか?」
というご質問でしょう。
「同じ名前のファイルを開く」というネタでご紹介したように、Excelは複数起動することができます。
Excelを複数起動する際にPERSONAL.XLSファイルが存在していると
「PERSONAL.XLSは編集中のためロックされています。
使用者は'xxxxx'です。
[読み取り専用]で開くか、または、読み取り専用で開き、ほかの人がファイルの使用を終了したときに通知を受け取るには、[通知]をクリックします。」
というメッセージの表示された[使用中のファイル]ダイアログが表示されます。
[使用中のファイル]ダイアログには、[読み取り専用][通知][キャンセル]の3つのボタンがあり、このダイアログと3つのボタンは何を意味しているのか、どうすればいいのかということでご質問いただきます。
VBA(Visal Basic for Applications)でコーディングしている方などから、
「PERSONAL.XLSとは何ですか?」
とういうご質問をいただくことがあります。
「PERSONAL.XLS」という文字列を見かける箇所はいくつかありますが、VBAのコーディングしている方がもっともハッキリ目にする場所と言えば、VBE(Visual Basic Editor)のプロジェクトエクスプローラです。通常VBEの画面左の方に表示されるツリー状のビューがプロジェクトエクスプローラで、ここに「VBAProject (PERSONAL.XLS)」という表示があります。
プログラミングを勉強しはじめた人の最初の難関は、変数。
その次の難関はループ処理でしょうか。
ループ処理にについて勉強している方から、
「Nextの後ろに変数がある例とない例があるのですが、何か違いがあるのでしょうか?」
といったご質問を受けることがあります。
例えば「3」「2」「1」「0」と順番にメッセージボックスを表示するような場合、
For intLoop = 3 To 0 Step -1
MsgBox intLoop
Next intLoop
↑のような例と、↓のような例をみかけます。
For intLoop = 3 To 0 Step -1
MsgBox intLoop
Next
違いは「Next」の後ろに変数「intLoop」があるかどうかです。
Excelで定義した名前を削除する方法をご紹介しました。
この操作を知った方から
「定義された名前をすべて簡単に削除できないのでしょうか?」
「名前を一括して削除することはできませんか?」
といったご質問をいただくことがあります。
名前をすべて削除するには、メニュー[挿入]−[名前]−[定義]をクリックして表示された[名前の定義]ダイアログで、名前を選択して[削除]ボタンをクリックする操作を何度も繰り返す必要があるためです。
印刷プレビューの点線を非表示にするマクロをご紹介しました。
DisplayPageBreaksプロパティをFalseにして非表示にするだけのマクロなわけですが、この方法を知った方から
「非表示だったら表示に、表示されていた場合は非表示にするマクロにするには、どうすればいいのでしょう?」
といったご質問をいただくこともあります。
プログラミングにまだ慣れていないという方だと、以下のようなマクロを作成してしがいがちでしょう。
Sub ToggleDispPageBreaks()
With ActiveSheet
If .DisplayPageBreaks = True Then
.DisplayPageBreaks = False
Else
.DisplayPageBreaks = True
End If
End With
End Sub
If文を使って、DisplayPageBreaksプロパティがTrueだったらDisplayPageBreaksプロパティをFalseにして、そうでなければ(即ちFalseならば)Trueにするという処理をそのまま記述したわけです。
初期状態のExcelでは、印刷プレビューや改ページプレビューを実行すると、ワークシート上に改ページ位置を示す点線(破線)が表示されます。
[オプション]ダイアログ−[表示]タブ−[改ページ]チェックボックスをOffにすることで、この点線が表示されないようになることをご紹介しました。
この方法を知った方から、
「[オプション]ダイアログの設定は変更せずに、点線を非表示にすることはできないのでしょうか?」
というご質問をいただきました。
これまでマクロをいくつかご紹介してきました。
作成したマクロの実行方法はいろいろありますが、もっとも基本的な操作はメニュー[ツール]−[マクロ]−[マクロ]をクリックして表示される、[マクロ]ダイアログで実行したいマクロを選択しておいて[実行]ボタンをクリックしたり、実行したいマクロ名をダブルクリックするという操作です。
しかしこの方法は、頻繁に使うマクロではちょっと面倒です。
ドロップダウンメニューからサブメニューを表示させなければいけない点、複数のマクロが存在している場合[マクロ]ダイアログにはたくさんのマクロが表示されてしまう点などが、頻繁に利用するマクロの場合面倒に感じるはずです。
複数のシートに一括操作を行う作業グループは便利な機能です。
同じ文字列を入力したり、書式設定をしたりする際には非常に役立ちます。
ですが、一括操作できてもよさそうなのに、設定できないものもあります。
ウィンドウ枠の固定です。
同じフォーマットのワークシートが並んでいる場合、全てのワークシートでウィンドウ枠を固定したいという気持ちになると思います。そんなときに作業グループを設定しておいて、メニュー[ウィンドウ]−[ウィンドウ枠の固定]コマンドを実行したものの、結局アクティブなシートしかウィンドウ枠が固定されなくて、ガッカリした方もいらっしゃるのではないでしょうか。
VBA(Visual Basic for Applications)でワークシート関数を利用できることをご紹介しましたが、VBE(Visual Basic Editor)のヘルプ「Visual Basic で使用できるワークシート関数一覧」を元に、ワークシート関数の中でVBAで利用可能な関数を一覧にまとめておきます。
最近のMS Officeのマクロは、VBA(Visual Basic for Applications)を使って記述します。
VBAは文法的には、プログラミング言語VB(Visual Basic)と同じなので、VBがわかる人ならVBAはすぐに使えますし、VBAがちゃんとわかっている方ならちょっと勉強するだけでVBを使いこなせるようになります。
そんな兄弟関係にあるVBとVBAですが、VBAの方が便利な点と言えば、VBAのAの部分、「for Applications」の部分でしょう。
つまり、Word・Excel・PowerPointといった各Officeアプリケーションの特長的な部分を利用できる点が、VBAのVBに対する優位性としてあげられると思います。
Excelの特長的な機能というのはいろいろありますが、ワークシート関数はその一つです。
Excelを使って実務で資料作成をしていると、ワークシートの整理整頓をする処理が必要になることが少なくありません。
このサイトでは、ワークシートの整理に役立つ以下のようなVBAマクロをご紹介してきました。
ワークシートの整理という観点では、データの存在しないワークシートをすべて削除したい、という要望もよくいただきます。
VBA(Visual Basic for Applications)を使って、マクロを組む場合によく必要とされる処理として確認メッセージの表示/非表示を切り替えがあります。この切り替えを行うためのDisplayAlertsプロパティについてご紹介しました。
同じくらい必要とされる処理として、画面更新の停止があります。
ExcelのVBAマクロでは、
ワークシートの挿入/削除
アクティブワークシートの切り替え
データのコピー
といった処理がよく行われますが、画面更新を停止していな場合にはそれらの処理が行われる様子が、画面にすべて表示されます。
マクロ実行時の画面表示はかなりのスピードで行われるので、肉眼ですべてを確認するのは難しいかもしれませんが、処理が完了するまで画面がチラチラし続ける状態は見ることができるはずです。
ExcelでVBA(Visual Basic for Applications)を使い、業務アプリケーションを作り始めるとよく出てくる処理があります。
ワークシートの削除です。
アクティブなワークシートの削除をするのならば、
「ActiveSheet.Delete」
というステートメントを記述します。
1枚目のシートを削除するのならば、
「Worksheets(1).Delete」
というステートメントです。
決して難しい記述ではありませんが、こういったステートメントを記述したマクロを実行すると必ずいただく質問があります。
「確認のメッセージを出さないようにすることはできないのでしょうか?」
というご質問です。
ファイル・ワークブックが開かれているかチェックするFunctionプロシージャをご紹介しました。
同様に、ワークシートが存在するかチェックをしたい場合もあります。
VBA(Visal Basic for Applications)でコーディングをはじめたばかりの方から、
FUNCRES.XLAというのは何でしょうか?
というご質問をいただくことがあります。
「Option Private Module」ステートメントを、モジュールの宣言セクションに記述することで、Functionプロシージャが[関数の挿入]ダイアログに表示されなくなるということをご紹介しました。
他の方法でも、Functionプロシージャを[関数の挿入]ダイアログに表示されないようにすることができます。
CurrentRegionプロパティを使って、アクティブセル領域を選択する方法をご紹介しました。
複数のワークシートを1枚のシートにまとめる処理をコーディングする場合、1枚目のシートのデータをコピーする際は「Range("A1").CurrentRegion.Select」ステートメントで問題ありませんが、2枚目以降のシートでは見出し行が余分ですから、見出し行を除いたリスト範囲を選択する必要が出てきます。
複数のワークシートを1枚のシートにまとめるために、CurrentRegionプロパティを使って、アクティブセル領域を選択する方法をご紹介しました。
「Selection.Copy」ステートメントで選択範囲のデータをコピーしたら、次に必要なのが、データの貼り付け先を見つける処理です。
Excelのよくいただく質問でマクロを組まないと実現できないものと言えば、
「複数のシートを1枚のシートにまとめるにはどうすればいいのでしょう?」
です。
Excelをデータベースとして利用する際に、データ入力の段階でシートを分けてしまい、後から集計をしたり、全てのデータを利用して宛名ラベルを作成するような業務が発生したときに、この「シートをまとめるには」というご質問を、非常によくいただきます。
VBA(Visual Basic for Applications)を使って、帳票印刷を含むような業務アプリケーションを作成する場合、罫線を引く処理が必要になります。
その際、罫線を引く位置を指定するためにXlBordersIndexクラスの定数を指定するわけですが、ヘルプには以下のような記述があります。
「使用できる定数は、XlBordersIndex クラスの定数 xlDiagonalDown、xlDiagonalUp、xlEdgeBottom、xlEdgeLeft、xlEdgeRight、xlEdgeTop、xlInsideHorizontal、xlInsideVertical のいずれかです。」
Excelで凝った業務アプリケーションを作る場合、FuncutionプロシージャやSubプロシージャの数は必然的に増えていきます。
そんなとき、プロシージャからだけ利用したいFunctionプロシージャというのができることがあります。
[関数の挿入]ダイアログに表示されないようなFunctionプロシージャです。
ワークブック名をセルに表示させるために、ワークシート関数を駆使する方法と、ユーザー定義関数を利用する方法をご紹介しました。
他にもブック名をセルに表示させる方法があります。
これまでこのサイトでいくつかのマクロをご紹介してきました。
登録したマクロを実行する方法はいろいろありますが、頻繁に使うマクロの場合に便利なのはショートカットキーでしょう。
ふりがな(読み)の情報を保持していないデータに対して、マクロを使ってふりがなを設定する方法をご紹介しました。
その最後で、マクロを作っておかなくてもふりがなを設定することができることを示唆しておきましたが、その方法をご紹介しましょう。
Excelのふりがなに関連するネタを何度かご紹介してきました。
特にExcelをデータベースとして使う場合に、ふりがなは重要かつ便利な機能です。
けれども、Excel上で入力が行われたときの読みをふりがなとして保持しているだけ、という問題点もあります。
ふりがな(読み)の情報を持っていなければ、ふりがなは表示されないのです。
実務の中では、他のデータベースから例えばCSVファイルをエクスポートし、ExcelでそのCSVファイルをインポートして利用するといったことはよくあります。
こういったデータでは読みの情報は保持されていませんから、メニュー[書式]−[ふりがな]−[表示/非表示]を実行したところでふりがなは表示されません。
「Excel 4.0 マクロとは」というネタで、[挿入]ダイアログにある[Excel 4.0 マクロ]アイコンについてご紹介しました。
現在はVBE(Visuala Basic Editor)上で、VBA(Visual Basic for Applications)を使って記述して作成するマクロが、以前は違う方法で作成していて、そのときに利用していたのが、[挿入]ダイアログの[Excel 4.0 マクロ]を選択して挿入されるマクロシートであるということでした。
ここでは、実際に4.0マクロをどのように記述し、どう実行するのかをご紹介します。
残念ながら私は子育てというものをまだ行ったことがないので、実際に体験したことはほとんどないのですが、幼児というのはある段階になると、「これ何?」「どうして?」という質問をやたらとするようです。お母さん・お父さんという立場の人は、その質問攻撃にウンザリ・イライラさせられたということも少なくことでしょう。
「これ何?」系の疑問を持つというのは幼児期に限ったことではなく、人が学習する過程で必ずあるものだと私は実感しています。パソコンのインストラクションをしていると、「これ何?」「どうして?」という疑問・質問を大人からもやっぱり浴びせかけられるのです。
「これ何?」「どうして?」という疑問に対して、自分でどう対処できるかというのが、学習効率に大きな影響を与えるという印象があります。
こだわっても仕方のないことに対して妙にこだわってしまう人、こだわるべき時期の見極めができないタイプの人というのは、短期的には学習効率は悪くならざるを得ないと感じています。(長いスパンで見たときにはわかりません。)
また疑問を感じたときに、すぐ誰かに聞いてしまうか、少しでも自分で考えたり調べたりしようとするかによって、学習効果は大きく変わってきます。すぐ誰かに聞いてしまう場合、そのことが記憶に残る率は自分で調べたり考えたりする時間をとる場合にくらべ、かなり低下する印象があります。
そして、こういった疑問に対する対処方法は、個人差が非常に大きいものだと感じます。
疑問に対して上手く対処できるタイプの生徒さんと接しているときは、教える側も非常にワクワクします。とても刺激を受けます。教える立場の人間としては、疑問への対処が上手くないタイプの生徒さんをどう導くかというのが重要な仕事なはずですが、これが非常に難しい課題なわけです。更にはそもそも疑問を持たないタイプの生徒さんも、存在します。
で、Excelのインストラクションをしているとよくいただく「これ何?」系の質問があります。
シートを追加するときにシート見出しの上で右クリックし、ショートカットメニューから[挿入]を選択する方法があります。この操作によって表示される[挿入]ダイアログ−[標準]タブに、[Excel 4.0 マクロ]というアイコンがあり、「これは何ですか?」という質問をいただきます。
シートの名前順で並べ替えをしたいのですがどうすればいいのでしょう?
シートを自動的にソートすることはできないのでしょうか?
大量にシートがあるブック(Excelファイル)を扱っている方から、よくいただく質問の一つです。
シート見出しをドラッグアンドドロップすることで、シートの並び替えはできますが大量にシートがあるときに、一つずつ移動するのが面倒なので自動化できないか?ということです。
シートを非表示にする方法と、非表示にしたシートを再表示する方法をご紹介しました。
非表示になったシートがたくさんあるワークブックで、シートを再表示させるために、何度もメニュー[書式]−[シート]−[再表示]から[再表示]ダイアログを表示させ、シートを指定するのはかなり面倒です。
変数名にデータ型がわかるようなプレフィックス(プリフィックス)をつける記述スタイルがありますが、どのデータ型のときにどんなプレフィックスをつけるか、Microsoftのサイトを元に一覧にまとめておきます。
ちなみに、こういった記述方法をハンガリアン記法(ハンガリー記法)といいますが、このスタイルを考案したMicrosoftのプログラマ・Charles Simonyi氏がハンガリー出身だったことに由来するそうです。
Office 2003で、ナビゲーションペインのついた状態のヘルプを表示させる方法をご紹介しました。
ヘルプを通読したいという要望は、VBA(Visual Basic for Applications)のコーディングに慣れはじめた方からもよくいただきます。
実務でExcelファイルを扱っていると、ワークシートの数が増えていきます。
そうなると、
「ワークシート名の一覧を作成したいのですが...」
といった要望が出てきます。
Excelの列番号は通常、「A」「B」「C」とアルファベットで表示され、「IV」列まであります。
この列番号について、
「列をアルファベットではなく、数字で表示させるにはどこを変更すればいいんでしたっけ?」
というご質問をいただくことがあります。
VBA(Visual Basic for Applications)でマクロを作成するようなときに、特に列方向にループ処理を行おうとするようなときに、列番号が数字で表示されているほうが便利だったりするためです。
マクロ機能はWordでもPowerPointでも使えますが、最も利用されているのはExcelでしょう。
メニュー[ツール]−[マクロ]−[新しいマクロの記録]をクリックして、マクロの自動登録機能で勝手にマクロが作れてしまうことから興味を持ち、徐々にVBAを勉強していくというのが多くの人が辿る道です。
作ったマクロを利用するにはいろいろな方法があります。
[マクロ]ダイアログから実行する、ショートカットキーを割り当てておく、図形オブジェクトをクリックしたら呼び出されるようにする、メニューに追加する、シート上のボタンに登録するなど。
その一つに、ツールバーにボタンを追加し、クリックするとマクロが実行できるようにするという方法があります。
先日、WorkbookオブジェクトのBuiltinDocumentPropertiesプロパティのLast save timeを使ってファイルの更新日時を表示させる方法をご紹介しました。
BuiltinDocumentPropertiesプロパティには、Last save time以外にもいろいろなものがあるのですが、Excel 2000以降のヘルプではID番号と名前の対応関係がわかりにくくなっているので、一覧にしておきます。
Home > Excel エクセルの使い方-マクロ/VBA

