第二章:ブックとシートの操作【マクロのみ】

1.ブックを開く

object.Open(filename)

ブックを開く時は、WorkbooksコレクションのOpenメソッドを使います。Workbooksコレクションとは、現在Excelで開いている全ブックの集合体(コレクション)です。この集合体に新メンバーを招き入れる様なイメージです。

ブックを開くと、開いたブックが必ずアクティブブックになります。開いたブックをそのまま編集する場合は、アクティブブック(ActiveWorkbook)を操作してください。

 

2.マクロが保存されているブックを操作する

object.ThisWorkbook

ブックを特定する場合、一般的にはWorkbooks(“book1.xlsx”)のようにブックの名前を指定します。他にも、現在の状況を利用してブックを特定することができます。例えば、現在表示されているアクティブブックは、ActiveWorkbookプロパティを使って特定が可能です。アクティブになっているブックではなく、現在実行しているマクロが記述されているブックを特定する時は、ThisWorkbookプロパティを使います。実行中のマクロからみて、自分自身のブックを操作する機会は多いので、是非覚えておきたいプロパティです。

 

3.開いたブックを変数に格納する

Set objectvar = objecttexpression

VBAには何かを返す命令がいくつか存在します。ブックを開く時に使うWorkbooksコレクションのOpenメソッドもその1つです。Openメソッドは開いたブック(Workbookオブジェクト)を返します。Openメソッドでブックを開くと開いたブックが必ずアクティブブックになります。開いたブックをそのまま操作するのであればActiveWorkbookプロパティを使えばいいのですが、開いたあとでアクティブブックを変数に格納しておくと便利です。

ブックを格納する変数は、Workbook型あるいはObject型、Variant型などで宣言します。そして、格納する時には、先頭にSetステートメントを使うことを忘れないでください。

 

 

4. ブックを閉じる

object.Close

 

 

5.新しいブックを挿入する

object.Add

ブックを新規作成するときは、WorkbooksコレクションのAddメソッドを使います。ブックを開くOpenメソッドが開いたブック(Workbookオブジェクト)を返すように、このAddメソッドも「新規作成したブック(Workbookオブジェクト)を返します。引き続き、新規作成したブックを操作する時は、そのブックをオブジェクト型変数に格納しておくと便利。

 

 

6.ブックに名前をつけて保存する

object.SaveAs(Filename)

ブックに名前をつけて保存するには、WorkbookオブジェクトのSaveAsメソッドを実行します。SaveAsメソッドの引数Filenameには保存するブックの名前とパスを指定できます。Excel2007からブックの種類によって拡張子が変わりました。マクロを含まないブックは拡張子.xlsxで、マクロを含むブックは拡張子xlsmで保存しなければなりません。これはただ拡張子を指定するだけでなく、ファイルの形式が異なります。SaveAsメソッドでブックを保存する時も適切な拡張子を指定しないとエラーになります。

 

7.ブックの保存場所を取得する

object.FullName

ブックが保存されている場所を調べるには、WorkbookオブジェクトのFullNameプロパティを使うと便利です。FullNameプロパティはブックが保存されているパスとブックの名前を返します。

 

 

8. ブックを上書き保存する

object.Save

ブックを上書き保存する時は、WorkbookオブジェクトのSaveメソッドを実行します。すでに名前をつけて保存してあるブックの場合、同じフォルダに同じ名前で上書き保存されます。まだ、名前をつけて保存していないブックに対してSaveメソッドを実行すると、カレントフォルダに「マクロなしブック(xlsx)形式で保存されます。保存しようとしたブックにマクロが記述されていた場合はマクロを含むブックをxlsx形式では保存できませんという旨の確認メッセージが表示されます。

 

9.マクロが含まれているかどうか判定する

object.HasVBProject

ブックにマクロが含まれているかどうかは、WorkbookオブジェクトのHasVBProjectプロパティでわかります。HasVBProjectプロパティはブックにプロシージャやモジュールが含まれているとTrueを返します。

HasVBProjectプロシージャは、Exel2007で追加されたプロパティです。Exel2003まででは使えません。Excel2003までのバージョンで、ブックにマクロが含まれているかどうかを判定するには、Excelの設定を変更したり、VBEオブジェクトを操作するなど、かなり面倒な操作が必要になります。

 

10.互換モードで開いているかどうか判定する

object.Excel8CompatibilityMode

Excel2007以降では、Excel2003で作成した旧形式のブックでは、Excel2007以降で追加・変更された機能などが使用できないため「互換モード」として開きます。ブックが互換モードで開いているかどうかはWorkbookオブジェクトのExcel8CompatibilityModeプロパティで判定できます。ブックが互換モードで開かれていると、ワークシートの大きさが256列×65536行に制限されたり、テーブルで構造化参照ができなかったり、作成されるピポッドテーブルが自動的に旧バージョンになるなどの特徴があります。

11. マクロが含まれているかどうか判定する2

 

 

12.ブックが変更されているかどうか判定する

object.Saved

ブックに何らかの変更が加えられていて、その変更がまだ保存されていないとき、WorkbookオブジェクトのSavedプロパティはFalseを返します。ブックを閉じたり、別名で保存する様な場合、そのブックの変更が保存されているかによってマクロの実行結果が変わるケースもある。事前にSavedプロパティで確認するといいでしょう。

 

13. 新しいワークシートを挿入する

object.Add

新しいワークシートを挿入するには、WorksheetsコレクションのAddメソッドを使います。実行すると、アクティブシートの左側に、新しいワークシートが挿入されます。

 

14. 指定した位置にワークシートを挿入する

object.add(before, After)

ワークシートを挿入するAddメソッドには、引数Beforeと引数Afterが用意されています。それぞれどの位置に新しいワークシートを挿入するかを指定することが可能です。特に、末尾(右端)に新しいワークシートを挿入する時は、サンプルのように引数Afterに、現在の最後尾(右側)のワークシートを指定します。

 

15. ワークシートの名前を設定する

object.Name

ワークシートの名前は、WorksheetオブジェクトのNameプロパティで操作できます。別の名前を設定する時は、このNameプロパティに文字列を指定します。ただし、ワークシートの名前を設定する時は注意が必要です。すでに存在する真苗を指定するとエラーになりますし、ワークシートの名前に指定できない文字*などを指定した場合もエラーになります。

 

16. ワークシートの名前を設定する

object.Name

ワークシートの名前を設定するのは、WorksheetオブジェクトのNameプロパティですが、実はさまざまなことを想定しなければなりません。サンプルは、アクティブシートの名前をユーザーが指定した文字列で設定するマクロです。まず入力された名前がすでに存在しているかどうかを判定します。次に、名前に設定できない文字が含まれているかですが、これを1文字ずつ判定するのは大変です。そこで、試しに名前を変更してみて、もしエラーが発生したら、指定できない文字が含まれていたと判断します。たかがワークシートの名前を設定するだけなのに、意外と面倒な操作です。

 

17. ワークシートを削除する

object.Delete

ワークシートを削除する時は、WorksheetオブジェクトのDeleteメソッドを実行します。これ自体は、それほど難しくない操作ですが、本当に削除しますか?と毎回表示されるのは不便です。マクロで自動処理をしていて、不要になったワークシートを削除するとき、ここで処理が止まってしまっては、自動化になりません。本当に削除しますかの確認メッセージを表示しないで削除するには、削除の前にExcelの確認メッセージを抑止します。これで黙ってワークシートが削除されます。ただし、そのままではマクロが終了したあとも、Excelからのさまざまなメッセージが表示sれないので、削除が終わったら抑止を戻します。

 

18. ワークシートをコピーする

object.Copy(Before, After)

ワークシートをコピーするには、WorksheetオブジェクトのCopyメソッドを使います。例えば、アクティブシートを左端にコピーするには、サンプルのようにします。コピーされたワークシートは、Sheet1(2)のように元のシート明の後ろにカッコで連番が付与されます。またワークシートをコピーすると、コピーされた新しいワークシートが必ずアクティブシートになることを覚えておきましょう。

 

19. ワークシートを移動する

object.Move(Before, After)

ワークシートを移動する際は、WorksheetオブジェクトのMoveメソッドを使います。引数は、シートをコピーするCopyメソッドと同じです。

 

 

20.ワークシートを非表示にする1

object.Visible = False

ワークシートを非表示にするには、WorksheetオブジェクトのVisibleプロパティにFalseを設定します。VisibleプロパティにFalseを設定した非表示シートは、Excelの手動操作で、ユーザーが再表示できます。

 

21.非表示シートを再表示する

object.Visible = True

非表示シートを再表示するには、WorksheetオブジェクトのVisibleプロパティにTrueを設定します。サンプルは、現在非表示になっている全てのシートを再表示します。

 

22.ワークシートを非表示にする2

object.Visible = xlSheetVeryHidden

WorksheetオブジェクトのVisibleプロパティにFalseを設定すると、そのワークシートを非表示にできまうs。ただし、そうして非表示にしたシートはExcelの再表示ダイアログボックスで、ユーザーが再表示にすることが可能です。VBAを使うと手動では再表示できない非表示シートにすることができます。それには、Visibleプロパティに定数xlSheetVeryHiddenを指定します。定数xlSheetVeryHiddenを指定した非表示シートは、再表示ダイアログボックスにリストアップされません。再表示するには、VBEのプロパティウィンドウか、マクロVisibleプロパティを設定します。

 

23. ワークシートを保護する

object.Protect(Password)

ワークシートを保護するには、WorksheetオブジェクトのProtectメソッドを使ってパスワードを設定します。サンプルでは、1234というパスワードを設定しています。

 

24.ワークシートの保護を解除する

object.Unprotect(Password)

ワークシートの保護を解除するには、WorksheetオブジェクトのUnprotectメソッドを使います。ワークシートUnprotectメソッドを使います。ワークシートの保護にパスワードが設定されている場合は、Unprotectメソッドの引数にパスワードを指定できます。パスワードで保護されているワークシートに、パスワードを指定しないでUnprotectメソッドを実行すると、パスワードを入力する画面が開きます。

 

25. ワークシートを印刷する

object.PrintOut

ワークシートの印刷をマクロ記録すると、ActiveWindow.SeledtedSheets.PrintOutというコードが記録されます。Excelはワークシートの表示領域をWindowsオブジェクトとして管理していて、そこにワークシートなどのSheetオブジェクトが表示されているとみなします。したがって、記録されたコードに間違いはないのですが、ただ印刷するだけならサンプルの様に、使い慣れたWorksheetオブジェクトに対して、PrintOutメソッドを実行しましょう。

 

26.ワークシートを印刷プレビューする

object.PrintPreview

印刷プレビューも印刷と同様、Worksheetオブジェクトに対して直接実行できます。Excel2010ではバックステージビューという機能が追加され、印刷プレビューの画面は全画面で表示されなくなりました。好みの問題もありますが、従来の様な全画面での印刷プレビューの方がみやすいと感じるユーザーもいることでしょう。Excel2010では、手動で従来のプレニュー画面を表示することはできませんgな、マクロを使えば可能です。サンプルのActiveSheet.PrintPreviewをQATに登録しておけばいつでも全画面でプレビューできます。

 

27.ワークシートを並び替える

例えば1月・2月・・のように複数のワークシートがあったとき、ワークシートは左から順に並んでいてほしいものです。Excelではワークシートを簡単に挿入する機能はありますが、すでに存在しているワークシートを名前の昇順や降順で並び替える標準機能はありません。標準機能になければマクロでやりましょう。データを並びかえるアルゴリズムは、昔から数多く公開されています。サンプルはまず全てのワークシート名を配列に入れ、配列の中をソートしています。最後に並べ替わった配列に従って、実際のワークシートを移動します。

 

28.ワークシートを並び替える2

27でワークシートを並び替えるマクロを紹介しましたが、配列内の並び替えはちょっと難しいです。たしかにExcelにはワークシートを並び替える機能はありませんが、セルを並び替えるのは簡単です。何もワークシートの名前を配列に入れなくても、セルに入れて並び替えれば簡単に実現できます。問題は、どこのセルにワークシート名を書き込むかです。こうした作業用のセルを使うときは、いっそのこと作業用のワークシートを挿入すると便利です。処理が終わったら作業用のワークシートは削除してしまえばいいのですから。

 

 

29.隣のワークシートを操作する

ワークシートの位置を特定するとき、一般的にはインデックス値を使います。インデックス値は左端が1なので、Sheet(1)は左端のワークシートを表します。

任意のワークシートから見て右隣のシートや左隣のシートを操作するときは、このインデックス値を使ってSheets(sheets(“sheet1”).Index + 1のようにしますが、右隣と左隣に限定すれば、一発で取得できるプロパティがあります。右隣にワークシートを返すNextプロパティと左隣のワークシートを返すPreviosプロパティです。

 

30.ユーザー設定のビューを登録する1

ユーザー設定のビューはあらかじめ設定したワークシートの状態を記録しておき、ワンタッチで切り替える機能です。あまり知られていませんが、巨大な表で表示を切り替えるときなどに威力を発揮します。ユーザー設定のビューを登録するには、あらかじめ登録したい状態を作っておき、CustomViesコレクションのAddメソッドを実行します。

 

 

31.ユーザー設定のビューを登録する2

ユーザー設定のビューを登録するには、CustomViewsコレクションのAddメソッドを実行します。手作業で登録するとき、同じ名前のビューを登録しようとするとすでに存在しています。上書きしますか?という確認が表示されますが、Addメソッドでは確認が表示されずに上書きされます。マクロで登録するときはすでに同じ名前が存在するかを自分で調べなければなりません。

 

32.ユーザー設定のビューの設定を調べる

登録したユーザー設定のビューを表示すると、ワークシートがどのような状態になるかは、表示してみなければ分かりせん。どの列が非表示になるなどの用法はVBAから調べることができません。VBAから取得できるのは、そのビューは印刷設定が有効かどうか、フィルタの状態を再現するかどうかの2つです。

 

33.ユーザー設定のビューを切り替える

登録してあるユーザー設定のビューを切り替えるには、CostomViewオブジェクトのShowメソッドを実行します。サンプルでは、1番目に登録したビューに切り替えています。

 

34.ユーザー設定のビューを削除する

登録してあるユーザー設定のビューを削除するには、CustomViesコレクションのDeleteメソッドを実行します。削除しますか?の確認メッセージは表示されません。

 

35.ワークシートの表示を変更する

ワークシートの画面は標準と改行ページプレビューを変更できます。Excel2007からは新しくページレイアウトも追加されました。こうした画面の状態を変更するには、WindowオブジェクトのViewメソッドに、表示したい状態を表す定数を指定します。指定できる定数は次の通りです。

xl

xl

xl

 

36.改ページの区切り線を表示/非表示する

印刷を実行したり、画面の表示を切り替えると、ワークシート上に改ページの区切り線は、Excelのオプション画面でしか操作できないので、表示・非表示を切り替えるマクロを作っておくと便利です。サンプルは実行するたびに表示・非表示を切り替えます。

 

37.画面の表示倍率を設定する

画面の表示倍率を設定するには、Zoomプロパティに倍率を表す数値を指定します。指定できる数値は10~400です。100は100%です。

 

38.画面の表示倍率を設定する2

画面の表示では、数値で倍率を表示するのではなく、選択したセル範囲がちょうど画面いっぱいに表示されるよう、自動調整することができます。選択範囲に自動調整するには、あらかじめ表示したいセル範囲を選択して、ZoomプロパティにTrueを設定します。

 

39.数式バーを表示・非表示する

数式バーを表示するかどうかは、ApplicationオブジェクトのDisplayFormulaBarプロパティで設定します。DisplayFormulaBarプロパティにTrueを設定すると数式バーが表示され、Falseを設定すると非表示になります。

 

40..数式バーの高さを設定する

Excel2007からは、数式バーの高さを変更できるようになりました。数式バーの高さを変更するには、ApplicationオブジェクトのFormulaBarHeightプロパティに数式バー内に表示する文字列の行数を指定します。FormulaBarHeightプロパティに1より小さい数値を指定したり、Excelの画面を超えて数式バーを広げようとするとエラーになります。

 

41.数式バーの高さを設定する2

セル内で改行していると、数式バーに全てのデータが表示されない場合があります。Excel2007からは数式バーの高さを変更できるようになりましたが、セル内の行数に合わせて手動で変更しなければなりません。数式バーの高さは行数で指定するので、セル内の行数がわかればちょうどよい高さに数式バーを調整できます。セル内の改行コードはvbLfなので、その数を数えればセル内の行数が分かります。

 

 

42.ブックを開かないでデータを取得する

Excelで開いていないブックのデータを直接読み込むには、Excel4.0マクロの命令を使います。引数には、次の書式で指定します。

 

43.ブックのパスを取得する

object.Path

ブックが保存されているパスはブック(Workbookオブジェクト)のPathプロパティで取得できます。Pathプロパティの返り値は通常は最後に¥がつきません。ただしパスがドライブのルートC:|やD:¥などの場合は、最後に¥がつきます。

/Users/tsuchiyamakeishiro/Desktop/work2

44.ブックの名前を取得する

object.Name

ブックの名前は、ブック(Workbookオブジェクト)のNameプロパティで取得できます。Nameプロパティには、フォルダ名などのパス情報は含まれせん。

まだ保存していないブックのNameプロパティは、便宜的につけられた、拡張子のないBook2やBook3などの名前が返ります。

 

45.ブックのフルネームを取得する

object.FullName

パスと名前を合わせたブックのフルネームは、ブック(Workbookオブジェクト)のFullNameプロパティで取得できます。

 

46.ファイルを開くダイアログでブックを開く

object.GetOpenFileName(FileFilter,FilterIndex)

ファイルを開くダイヤログボックスを表示するには、いくつかの方法があります。最も一般的に使われるのは、ApplicationオブジェクトのGetOpenFileNameメソッドです。GetOpneFileNameメソッドのファイルを開くダイアログボックスでは、ファイルを選択して開くボタンをクリックしてもGetOpenFilenameメソッドは選択したファイルのふるね^むを返すだけで、自動的には開かれません。そのブックをExcelで開くには、WorkbooksコレクションのOpenメソッドを実行します。

 

47.ファイルを開くダイアログで自動的にブックを開く

object.FindFile

ApplicationオブジェクトのFindFileメソッドは、GetOpenFilenameメソッドと同じようにファイルを開くダイアログボックスを表示しますが、ファイルを選択して開くボタンをクリックすると、Workbooks.Openを設定しなくても、自動的に開いてくれます。

 

48.ファイルを開くダイアログを詳細に設定する

object.FileDialog(msoFileDialogOpen)

FileDialogオブジェクトでファイルを開くダイアログボックスを開くと、ボタンの名前を変更したり、最初に開くフォルダを指定することが可能です。不王子するアイコンの大きさなども指定できますが、Windowsのバージョンによっては、無視される項目もあります。選択したファイルのパスは文字列形式でFileDialogSelectedItemsコレクションに格納されるので、個別に調べることも可能です。FileDialogオブジェクトのExecuteメソッドをメソッドを実行すると、開くや保存などユーザーが選択したアクションが実行されます。

 

49.Dialogsコレクションを使ってファイルを開くダイアログを開く

Excelの組み込みダイアログボックスを使って、ファイルを開くダイアログボックスを表示できます。組み込みファイアログボックスはDialogsコレクションで表されます。ファイルを開くダイアログボックスの定数はxlDialogOpenです。Showメソッドを実行するとダイアログボックスが開き、開くボタンをクリックすると自動的に開かれます。

 

50.ファイルを開くダイアログで開くフォルダを指定する

GetOpenFilenameメソッドや、FindFileメソッドでファイルを開くダイアログボックスを表示したとき、ダイアログボックスにはカレントフォルダのファイルが表示されます。任意のフォルダを開きたいときは、ダイアログボックスを表示する前にChDriveステートメントやChDirステートメントでカレントフォルダを移動しておきます。

 

51.ファイルを開くダイアログのフィルタリング

GetOpenFilenameメソッドなどのファイルを開くダイアログボックスは、ダイアログボックスに表示するファイルの拡張子を指定することができますが、例えば2009という文字を含むファイルだけを表示することはできません。そしたファイル名のフィルタリングをしたいときは、Excelの組み込みダイアログボックスであるDialogsコレクションを使います。

 

52.共有ブックを誰が開いているのか調べる

ブックを共有ブックとして開いていると、ブック(Workbookオブジェクト)のMultiUserEditingプロパティがTrueを返します。同時に開いているユーザーに関する情報は、UserStatusプロパティが次のような二次元配列でかえします。

UserStatus

UserStatus(n, 2)の日時は、1/10/2007 1:23のような書式なので、必要であればFormat関数などで書式を変換してください。

 

53.通知を希望しないでブックを開く

共有ブックではなないブックをすでに誰かが開いていた場合、同じブックを開こうとするとすでに開かれていますというメッセージが表示されます。この時「読み取り専用」ボタンと通知ボタンがあり、通知ボタンをクリックし、先に開いていたユーザーがそのブックを閉じると、こちら側に編集できるようになりましたと通知されます。この通知を受け取らないで開くには、Openメソッドの引数NotifyにFalseを指定します。ただし、引数NotifyにFalseを指定すると開きますかの確認ダイアログボックスが表示されます。サンプルでは、これを抑止するためにApplicationオブジェクトのDisplayAlertsプロパティにFalseを指定しています。

 

54.開いたブックを履歴に登録する

Excelで開いたファイルは履歴に残され、Excel2003まではファイルメニューの下部にExcel2007はOfficeボタン、Excel2010はファイルタブをクリックし、最近使用したファイル(ドキュメント)から開くことができます。ただし、マクロで開いたブックは、この履歴に登録されません。Openメソッドで開くと同時に履歴にも登録するには、引数AddToMruにTrueを返します。

 

55.自動実行マクロを起動しないで開く

ブックに自動実行マクロが登録されていると、ブックを開くと同時にマクロが起動します。自動実行マクロを起動しないでブックを開くには、ブックを開く前にExcelのイベントを抑止します。イベントを抑止するには、ApplicationオブジェクトのEnableEventsプロパティにFalseを指定します。自動実行マクロは起動しませんが、マクロは有効で開かれます。

 

56.他の人がブックを開いているかどうか調べる

共有ブックは、同時に複数のユーザーが開くことが可能ですが、共有出ないブックは先に開いたユーザーにしか編集は許可されません。これから開こうとするブックが、すでに誰かのエクセルで開かれているかどうかを判定するには、どうしたらいいでしょう。ブックを開いてみて読み取り専用になるかどうかを調べる手もありますが、ここでは裏技を紹介します。ブックをファイルとして追記モードで開きます。Openステートメントの追記モードは、そのファイルをすでに誰かが開いているとエラーになります。したがって、追記モードで開いてみて、エラーになったら、すでに誰かが開いているという事です。

 

57.他のブックのマクロを実行する

Excelで複数のブックを開いているとします。別のブックに記述されているマクロを実行するには、Callステートメントではなく、ApplicationオブジェクトのRunメソッドを使うと参照設定をしなくても可能です。

 

58.ブックのプロパティを設定する

ブックにはタイトルや会社名などの情報を保存できます。こうしたブックの用法をドキュメントプロパティと呼びます。ブックのドキュメントプロパティは2種類あります。1つはタイトル・作成者等、項目名があらかじめ決めらているプロパティです。そうしたあらかじめ定義されているドキュメントプロパティを組み込みのドキュメントプロパティといいいます。組み込みのドキュメントプロパティを設定するには、BuitinDovumentPropertiesコレクションんを操作します。

 

 

59.ユーザー設定のドキュメントのプロパティを設定する

ブックのプロパティのうち、ユーザーが任意の項目名を設定できるものをユーザー設定のドキュメントプロパティと呼びます。ユーザー設定のドキュメントプロパティを設定するには、CustomDocumentPropertiesコレクションを操作します。

 

 

60.ブックを開いたときマクロを自動実行する

ブックを開いた時にマクロを実行させるには、ThisWorkbookモジュールにPrivate Sub Workbook_Open()というプロシージャを作成します。VBEのコードペイン上部にあるオブジェクトリストでWorkbookを選び、右のプロシージャリストでOpenを選択すると、自動的にプロシージャが作成されます。サンプルはブックを開いた時に自動実行されます。

 

61.ブックを開いたときマクロを自動実行する2

ブックを開いた時にマクロを自動実行する仕組みは、ThisWorkbookモジュールにPrivate Sub Workbook_Open()の他にもう1つあります。標準モジュールにAuto_Openという名前のプロシージャを作成しておくと、ブックを開いた時に、このAuto_Openも自動実行されます。これは現在のVBAが搭載される前のExcel5.0⑨5年代に使われていた機能です。

 

62.ブックを閉じる直前にマクロを自動実行する1

Private Sub Workbook_BeforeClose

ブックを閉じる直前にマクロを自動実行するには、ThisWorkbookモジュールのPrivate Sub Workbook_BeforeClose(Cansel As Booleanプロシージャにマクロを記述します。このプロシージャはブックを閉じようとしたときに自動実行されます。まだ閉じていないので、引数CanselにTrueを代入することで閉じる操作をキャンセルすることができます。

 

63.ブックを閉じる直前にマクロを自動実行する2

ブックを閉じるときに自動実行する仕組みは、ThisWorkbookモジュールのPrivate Sub Workbook_BeforeClose()の他にもう一つあります。標準モジュールにAuto_Closeという名前のプロシージャを作成しておくと、ブックを閉じるときに、このAuto_Closeも自動実行されます。閉じる操作をキャンセルすることはできません。これは現在のVBAが搭載される前のExcel5.095年代に使われていた機能です。

 

64.保存する直前にマクロを自動実行する

BeforeSaveイベントは、ブックを保存する直前に発生します。引数CancelにTrueを代入することで、保存する操作をキャンセルできます。引数SaveAsUIは、保存を実行した時、名前を付けて保存ダイアログボックスが表示される場合にTrueが格納されます。

 

65.印刷する直前にマクロを自動実行する

BeforePrintイベントは、ブックを印刷する直前に発生します。引数CancelにTrueを代入することで、印刷する操作をキャンセルできます。

 

 

66.ワークシートの挿入と同時に名前を設定する

例えば合計という名前の新しいワークシートを挿入したいとき、一般的には①新しいワークシートを挿入する②アクティブシートの名前を合計に設定する という二段階の手順を踏みます。もちろん、これで間違いないのですが、実はサンプルのように1行で書くことも可能です。

 

67.連続名の複数のワークシートを挿入する

1月・2月・4月や2010-04 2010-5 2010-6と言った連続名の複数シートを用意しなければいけないとき、ワークシートを1枚ずつ挿入して名前を変更するのは手間がかかる作業です。こうした連続名の複数シートは、マクロで一気に作成してしまいましょう。サンプルは既存のワークシートの最後尾に1月~6月のワークシートを挿入します。

 

68.ワークシート見出しの色を設定する

ワークシート見出しはTabオブジェクトで操作できます。シート見出しの色は、TabオブジェクトのColorプロパティやColorIndexプロパティを使って設定できます。

 

69.ワークシートをグループ化する

例えばSheet1からSheet3までをグループ化するには、Sheet1がアクティブシートの状態で、Shiftキーを押しながらSheet3を選択します。この操作をマクロ記録するとSheets(Array(“Sheet1”, ”Sheet2”, “Sheet3″)).Selectというコードが記録されます。しかしこれではワークシート名が固定されているので使いにくく、あまり参考になりません。任意のワークシートをグループ化するには、サンプルのようにSelectメソッドの引数にFalseを指定します。サンプルは、アクティブシートから右3枚のワークシートをグループ化しています。

Falseを指定したSelectメソッドでは、現在選択されているワークシートを解除しません。なお引数FalseはRangeオブジェクトには使えません。

 

70.ワークシートがグループ化されているかどうかを判定する

現在ワークシートがグループ化されいるかどうか判定するには、WindowsオブジェクトのSelectedSheetsプロパティを使います。SelectedSheetsプロパティは、現在選択されているシートのコレクションを返します。SelectedSheetsプロパティ内のシート数(Countプロパティ)が1の時は、アクティブシートだけが選択されている状態です。

 

71.グループ化したワークシートを操作する

サンプルは、まず複数のワークシートが現在グループ化されているかどうか調べます。SelectedSheets.Count。もしグループ化されていたら解除します。ActiveSheet.Select。Selectメソッドの引数にFalseを指定して、アクティブシートから右3枚のワークシートをグループ化し、それぞれのワークシート見出し色を、アクティブシートと同じ色に設定します。最後にグループ化を解除しています。

 

72,ワークシートをスクロールする

ワークシートを行単位又は列単位でスクロールするには、WindowオブジェクトのSmallScrollメソッドを使います。また画面単位でスクロールするには、WindowオブジェクトのLargeScrollメソッドを実行します。どちらのメソッドも方向を示す4種類の引数Up,Down、ToRight,ToLeftを指定できます。サンプルはワークシートを1画面下、2画面右にスクロールし、続いて1行上、2列左にスクロールします。

 

73.特定のセルが見えるようにスクロールする

ワークシートを●行目、●列目までスクロールしたい、のように、任意の行や列を指定するには、WindowオブジェクトのScrollRowプロパティやScrollColumnプロパティに数値を指定します。例えばScrollRowプロパティに3を設定すると表示されているワークシートの最上行が3行目になり、ScrollColumnプロパティに5を設定すると表示されているワークシートの左端列が5行目になります。

 

74.現在表示されているセル範囲を取得する

現在表示されているセル範囲は、WindowオブジェクトのVisibleRangeプロパティで取得できます。VisibleRangeプロパティはRangeオブジェクトを返すので、AddressプロパティやRowプロパティなど、一般的なセル操作と同じプロパティを使用できます。

 

 

75.1枚のワークシートだけ別ブックで保存する

ワークシートのCopyメソッドはワークシートを別にの位置に複製する機能ですが、コピー先(引数AfterやBefore)を指定しないと、新しいブックとしてコピーします。サンプルはアクティブシートだけを別のブックとして複製し、そのブックにアクティブシートの名前を付けて保存します。

 

76.印刷の総ページ数を取得する

object.ExecuteExcel4Macro(String)

VBAには、印刷の総ページ数を取得するプロパティなどはありません。しかしExcel4.0のマクロには印刷の総ページ数を取得する命令があります。これをVBAから呼び出すには、ExecuteExcel4Macroメソッドを使います。

 

77.ブック全体を印刷する

印刷を実行するにはPrintOutメソッドを使います。このPrintOutメソッドは、Worksheetオブジェクトだけでなく、Workbookオブジェクトでも使用可能です。

ブック全体を印刷するときは、WorkbookオブジェクトのPrintOutメソッドを実行します。

 

78.特定のセル範囲だけ印刷する

object.PrintOut

特定のセル範囲だけ印刷したいときは、印刷したいセル範囲のPrintOutメソッドを実行します。

 

79.複数のワークシートを印刷する

object.Select、object.PrintOut

複数のワークシートを印刷するには、まず印刷したい複数のワークシートを選択してグループ化します。グループ化するときは、引数にFalseを指定したSelectメソッドを実行すると簡単です。

 

80.印刷部数を指定する

object..PrintOut(Copies)

同じワークシートを2部以上をまとめて印刷するときは、PrintOutメソッドの引数Copiesに印刷部数を指定します。サンプルでは、アクティブシートを3部印刷します。

 

81.印刷するページを指定する

object.PrintOut(From, To)

印刷ページはPrintOutメソッドの引数Fromと引数Toで指定します。サンプルでは2から5ページを印刷します。

 

82.印刷する前にプレビューを表示する

object.PrintOut(Preview)

PrintOutメソッドの引数PreviewにTrueを指定すると、印刷する前にプレビュー画面を表示します。プレビュー画面で印刷ボタンをクリックしないと、印刷は行われません。これはActiveSheet.PrintPreviewと同じ動作です。

 

83.印刷範囲を設定する

object.PageSetup.PrintArea

印刷範囲を設定するには、PageSetupオブジェクトのPrintAreaプロパティにアドレスを指定します。サンプルのように早退参照で指定しても、自動的に絶対参照として設定されます。印刷範囲を設定しているワークシートでは、印刷を実行したとき、自動的に印刷範囲だけが印刷されます。

 

84.印刷範囲をクリアする

object.PageSSetup.PrintArea =””

印刷範囲をクリアするには、PageSetupオブジェクトのPrintAreaプロパティに空欄””を設定します。

Sub sample84()
ActiveSheet.PageSetup.PrintArea = “”
End Sub

 

 

85.印刷範囲を無視して印刷する

object.PrintOut/GnorePrintAreas

印刷範囲が設定されているワークシートでは、印刷を実行したとき、設定している印刷範囲だけが印刷の対象になります。印刷範囲をクリアするのではなく、一時的に印刷範囲を無視して全体を印刷するときは、PrintOutメソッドの引数IgnorePrintAreasにTrueを設定します。引数IgnorePrintAreaはExcel2007で追加された引数です。

Sub sample85()
ActiveSheet.PrintOut IgnorePrintAreas:=True
End Sub

86.白黒印刷する

object.PageSetup.BlackAndWhite

白黒印刷をするときは、PageSetupオブジェクトBlackAndWhiteプロパティにTrueを設定してからPrintOutメソッドを実行します。白黒印刷をすると、グラフの塗りつぶし色などがパターンで印刷されます。

Sub sample86()
With ActiveSheet
.PageSetup.BlackAndWhite = ture
.PrintOut
End With
End Sub

87.コメントを印刷する

object.PageSetup.PrintComments

コメントを印刷するときは、PageSetupオブジェクトのPrintCommentsプロパティに次の定数を指定します。

xlPrintInPlace:ワークシートの表示と同じ位置に印刷される

xlPrintNoComments:コメントは印刷されない

xlPrintSheetEnd:ワークシートの末尾にコメントでまとめて印刷される

標準では、定数xlPrintNoCommentsが設定されている。

Sub sample87()
With ActiveSheet
.PageSetup.PrintComments = xlPrintSheetEnd
.PrintPreiew
End With
End Sub

88.行列番号を印刷する

object.PageSetup.PrintHeading

行列番号を印刷するときは、PageSetupオブジェクトのPrintHeadingsプロパティにTrueを設定します。行列番号は印刷されるセル範囲だけしか表示されません。

Sub sample88()
With ActiveSheet
.PageSetup.PrintHeadings = True
.PrintPreview
End Sub

89.枠線を印刷する

object.PageSetup.PrintGridlines

ワークシートの枠線を印刷するときは、PageSetupオブジェクトのPrintGridlinesプロパティにTrueを設定します。Excelのオプションで枠線の色を変更した場合、変更された色で印刷されます。

 

90.簡易印刷する

object.PageSetup.Draft

簡易印刷をするには、PageSetupオブジェクトのDraftプロパティにTrueを設定します。簡易印刷では、グラフやオートシェイプなどは印刷されません。またセルの文字色や太字などの属性は印刷されますが、背景の塗りつぶしなどは無視されます。

Sub sample90()
With ActiveSheet
.PageSetup.Draft = True
.PrintPreview
End With
End Sub

 

91.エラーを印刷しない

object.PageSetup.PrintErrors

印刷するワークシート内で、セルの数式がエラーになっていたとき、エラーを印刷させないようにできます。エラーをどう扱うかは、PageSetupオブジェクトのPrintErrorsプロパティに次の定数を指定します。

xlPrintErrorsBlack:エラーは印刷されない

xlPrintErrorsDash:エラーは「–」と表示される

xlPrintErrorsDisplayed:表示されている通りに印刷される

xlPrintErrorsNA:エラーは「#N/A」と印刷される

Sub sample91()
With ActiveSheet
.PageSetup.PrintErrors = xlPrintErrorsBlack
.PrintPreview
End With
End Sub

 

92.用紙の向きを設定する

object.PageSetup.Orientation

印刷する用紙の向きは、PageSetupオブジェクトのOrientationプロパティで設定します。Orientationプロパティには、次の定数を指定できます。

xlLandscape

xlPortrait

Sub sample92()
With ActiveSheet
.PageSetup.Orientation = xlPortrait
.PrintPreview
End With
End Sub

 

93.1枚の用紙に印刷する

object.PageSetup.FitToPagesWide

object.PageSetup.FitToPagesTall

印刷するセル範囲の大きさによらず、1枚の用紙に印刷するには、PageSetupオブジェクトのFitToPagesWideプロパティとFitToPagesTallプロパティに1を設定します。印刷のときは自動的に縮小されます。

Sub sample93()
With ActiveSheet
.PageSetup.Zoom = False
.PageSetup.FitToPagesWide = 1
.PageSetup.FitToPagesTall = 1
.PrintPreview
End With
End Sub

94.拡大縮小率を指定する

object.PageSetup.Zoom

印刷の拡大縮小率は、PageSetupオブジェクトのZoomプロパティで設定します。Zoomプロパティにはパーセントを表す数値を指定します。サンプルでは200%を指定しています。

Sub sample94()
With ActiveSheet
.PageSetup.Zoom = 200
.PrintPreview
End With
End Sub

95.用紙の中央に印刷する

object.PageSetup.CenterHoriontally

object.PageSetup.CenterVertically

用紙の中央に印刷するには、PageSetupオブジェクトのCenterHorizonatallyプロパティとCenterVerticallyプロパティにTrueを設定します。

 

96.ヘッダー・フッターを指定する

ヘッダーとフッターはPageSetupオブジェクトのLeftHeaderプロパティやRightFooterプロパティなどに設定します。ヘッダーとフッターには任意の文字列を指定できるほか、次の記号を指定することができます。

 

ヘッダーやフッターを指定するプロパティには以下のような種類があります。

 

97.1ページ目のページ番号を指定する

1ページ目のページ番号はPageSetupオブジェクトのFirstPageNumberプロパティで設定します。

 

 

98.タイトル行・列を設定する

タイトル行・列を設定すると、2ページ目以降も設定したタイトル行・列が印刷されるようになります。PageSetupオブジェクトのPrintTitleRowsプロパティには、全てのページに印刷するタイトル行を設定し、PrintTiteColumnsプロパティにはタイトル列を設定します。

 

 

99.印刷の設定を高速化する

印刷の各種設定で操作するPageSetupオブジェクトは、設定に時間がかかるオブジェクトです。ヘッダーや用紙の向き、拡大縮小率など複数の設定をマクロから行うと、設定が終わるまでに意外と時間がかかります。そんな時は、Excelとプリンタとの通信を一時的に遮断します。遮断した状態では、PageSetupオブジェクトの設定が高速に行えるので、設定を終えてから通信を再開し、キャッシュされた全ての設定をプリンタに送信します。なお、PrintCommunivationプロパティはExcel2010で追加されたプロパティです。

 

100.ワークシートの背景に印刷されない画像を表示する

ワークシートの背景に画像を敷き詰めて表示するには、WorkSheetオブジェクトのSetBackgroundPictureメソッドを実行します。背景に表示した画像は印刷されません。

 

101.セルを選択したときマクロを自動実行する

ワークシート内で選択せるが移動すると、SelectionChangeイベントが発生します。選択されたセルは、引数Targetに格納されるので、どのセルが選択されたかは引数Targetを調べます。

 

102.再計算されたときマクロを自動実行する

任意の数式が再計算されると、Calculateイベントが発生します。ただし、Calculateイベントでは再計算されることがわかるだけで、どのセルが変更されたかは分かりません。

 

103.セルの値が変更されたときマクロを自動実行する

セルの値が変更されると、Changeイベントが発生します。引数Targetには、変更されたセルが格納されます。

 

104.別のワークシートを開かせない

WorksheetオブジェクトのDeactivateイベントは、ワークシートがアクティブでなくなると発生します。必須データが未入力だった場合、入力するまで別のワークシートを開かせたくないようなとき、アクティブシートを戻すことができます。

 

105.セルの右クリックでマクロを実行する

セルを右クリックすると、WorksheetオブジェクトのBeforeRightClickイベントが発生します。一般的にセルの右クリックでは、コンテキストメニューが表示されますが、BeforeRightClickイベントはコンテキストメニューが表示されるより前に実行されます。イベントプロシージャ内で、引数CancelにTrueを設定すると、コンテキストメニューは表示されません。右クリックされたセルは、引数Targetに格納されます。サンプルではセル範囲E3:E5が右クリックされたら、1つ上のセルをコピーします。それ以外のセルが右クリックされた時は、通常通りコンテキストメニューを表示します。

 

 

106.セルのダブルクリックでマクロを実行する

セルをダブルクリックするとWorksheetオブジェクトのVeforeDoubleClickイベントが発生します。一般的にセルのダブルクリックでは、編集状態になりますが、BeforeDoubleClickイベントは編集状態になるより前に実行されます。イベントプロシージャ内で引数CancelにTrueを設定すると、編集状態にはなりません。ダブルクリックされたセルは、引数Targetに格納されます。サンプルでは、セル範囲A1:E5内でいずれかのセルがダブルクリックされたら、表全体に格子罫線を引きます。それ以外のセルがダブルクリックされたときは、通常通りセルを編集状態にします。

 

107.イベントを抑止する

ワークシートのイベントでマクロを自動実行するときは、イベントの連鎖に注意してください。例えば、セルのデータが変更されたときに発生するChangeイベントの中で別のセルにデータを書き込むと、その行為によってまたChangeイベントが発生します。そうしたイベントの連鎖をさせないためには、ApplicationオブジェクトのEnableEventsプロパティにFalseを指定して、一時的にイベントを抑止します。

 

108.ウィンドウ枠を固定する1

ウィンドウ枠を固定すると、タイトル行やタイトル列がスクロールされなくなります。ウィンドウ枠を固定するには、固定したい位置にアクティブセルを移動してWindowオブジェクトのFreezePanesプロパティにTrueを設定します。実行するとアクティブセルの上と左がウィンドウ枠として固定されます。ウィンドウ枠の固定を解除するには、FreezePanesプロパティにFalseを設定します。

 

109.ワークシート画面を分割する

ワークシート画面には、縦の分割バーと横の分割バーを、それぞれ1本ずつ設定できます。つまり最大で4分割に出来るわけです。分割する位置は、WindowオブジェクトのSplitColumnプロパティとSplitRowプロパティにそれぞれ列番号と行番号を指定します。サンプルを実行すると、E列とF列の間位に縦の分割バーが表示され、10行目と11行目の間に横の分割バーが表示されます。

 

 

110.ウィンドウ枠を固定する2

ウィンドウ枠の固定は、画面の上と左にスクロールしない行と列を設定する機能です。一方、画面の分割は、画面を最大4つの領域に分割して、それぞれの領域を自由に使う機能です。ウィンドウ枠の固定と画面の分割は、似ていますが、異なる機能です。そして、両者は共存できません。散布るでゃ、SplitRowプロパティで画面を分割していますが、その後でFreezePanesプロパティにTrueを設定しているため、画面の分割ではなく、ウィンドウ枠の固定になります。

 

111.分割されているウィンドウ数を取得する

画面が分割されると、それぞれ分割された画面はPaneオブジェクトとしてあらわされます。Paneオブジェクトの集合体であるPanesコレクションでCountプロパティを調べれば、現在の画面が何分割されているかが分かります。

 

112.分割された画面に表示されている範囲を取得する

分割された各画面領域を表すPaneオブジェクトは、その領域に表示されているセル範囲をVisibleRangeプロパティで取得することができます。サンプルでは、分割している画面ごとに表示されているセル範囲のアドレスを調べています。

 

113.分割された画面をスクロールする

分割された画面は、それぞれ別のWindowオブジェクトとして操作できます。サンプルでは、もしすでに画面が分割されていたら、分割を解除します。続いて全体の画面を上下の2分割にし、区切りの分割バーを5行目に挿入します。次に上の画面をPageDownで1画面下にスクロールし、下の画面を90行目が見えるようにスクロールします。

 

114.複数のウィンドウを整列する

Excel上で複数開いているウィンドウ(ブック)を上下左右などに整列するには、WindowオブジェクトのArrangeメソッドを使います。Arrangeメソッドの引数ArrangeStyleには、次の定数を指定します。

xl

xl

xl

xl

 

115.新しいウィンドウを開く

あるウィンドウ(ブック)の複製を作り、新しいウィンドウとして開きます。タイトルバーには、ファイル名の後ろに:2が表示されます。Arrangeメソッドで整列できるのは、ウィンドウ(ブック)です。同じブックの異なるワークシートを整列して表示することはできません。そんな時は、ウィンドウ(ブック)の複製を作り、別のブックとして整列します。どちらのウィンドウで行った操作も元のファイルに保存されます。作業が終わったら、:2の付いた複製ウィンドウを閉じます。複製ウィンドウを閉じないままブックを保存すると、次に開いた時も2つのウィンドウとなります。

 

116.別のワークシートを同時に表示する

ブック内の別のワークシートを同時に表示するには、ブック(ウィンドウ)の複製を作成し、同じブックを別のウィンドウとして整列させます。

 

117.全ての複製ウィンドウを閉じる

複製ウィンドウ群は、1つのブックを複製のウィンドウに表示しているだけなので、つまるところ実体は1つです。ウィンドウに対して行った操作は、別のウィンドウにも反映されますし、どれか1つのウィンドウを残して保存すれば、どのウィンドウに対して行った操作でもちゃんと保存されます。サンプルは、現在開いているウィンドウの中で、タイトルバーの右2文字に数値がつく複製ウィンドウを全て閉じます。

 

コメントを残す

メールアドレスが公開されることはありません。