書籍概要

パーフェクト

パーフェクトExcel VBA

著者
発売日
更新日

概要

VBAは,表計算ソフトExcelがインストールされていれば,開発環境の準備といった技術的なハードルも低く,気軽に使用できるプログラミング言語です。ITエンジニアだけでなく,すべてのビジネスマンに門戸を開き,その仕事の価値を高めるチャンスを提供している,希少なプログラム言語の一つです。そして一般的にはプログラミング初心者向けの「やさしい言語」と考えられていますが,本当にそうでしょうか?

ある程度学習と実践を重ね,いくつかのマクロを本格的に活用し始めた頃から「VBAならではの問題」に悩まされるようになります。「VBAならではの問題」とは,

  • 理解があやふやなのに動いてしまっているため,エラーや仕様変更が発生したときの対応に大変な労力がかかる
  • 同じ目的に対して,それを実現するための書き方がいくつも存在していて混乱する
  • たくさんの「自己流」が存在していて,他のVBAユーザーとの協力体制を築きづらい
  • クラスやオブジェクトモジュールなどの概念について学ぶ機会がないため,他の方法で実現してしまっている

こうした問題を解決するために,本書では,以下のステップでVBAというプログラミング言語を再学習することを提案しています。

  1. 言語としてのVBAとその学習環境の特徴を知る
  2. プログラミング言語VBAの体系を学習の土台として整える
  3. その土台の上に,主要なライブラリについての知識を乗せ直す

以下は本書の章構成になりますが,値,式,ステートメント,プロシージャ,モジュール,プロジェクトとライブラリという,言語を構成するレイヤーを正しく理解して,言語の構造と体系が理解できるようになっています。

Part1 Excel VBA~overview
1章 イントロダクション――VBAの概要

Part2 Excel VBAの言語仕様
2章 式と値
3章 ステートメント
4章 制御構造
5章 プロシージャ――手続きに名前をつける
6章 モジュール――プログラムを部品ごとにまとめる
7章 プロジェクトとライブラリ

Part3 ライブラリ
8章 VBAライブラリその1――VBA関数
9章 VBAライブラリその2――コレクション
10章 配列の操作
11章 Excelライブラリ
12章 MSFormsライブラリ
13章 Scriptingライブラリ

Part4 実践Excel VBAプログラミング
14章 アプリケーション開発

本書を読破し,土台を整えて,知識を取り入れるには,それなりの時間を要するものと思います。しかし,それを乗り越えた先,Excel VBAの学習と活用にかかる労力は大きく軽減でき,新たなExcel VBAの世界を魅力的に感じていただけるはずです。

こんな方におすすめ

  • 業務でVBAに関わるエンジニア
  • VBAを根本的から学習しプロを目指したいと考えている人
  • VBAの基本はある程度理解しているが応用力が足りないと感じている人

目次

Part1 Excel VBA~overview
1章 イントロダクション――VBAの概要

  • 1-1 VBAを学び続けるために必要なこと
  • 1-2 VBAの体系を理解し,知識の整理整頓をする
  • 1-3 VBAの作法を身につけ,コードに一貫性を持たせる
  • 1-4 本書を使ったVBA学習の進め方
  • 1-5 Visual Basic Editorについて

Part2 Excel VBAの言語仕様
2章 式と値

  • 2-1 式とその構成要素
  • 2-2 データ型
  • 2-3 式と演算子

3章 ステートメント

  • 3-1 ステートメントとは
  • 3-2 スコープ
  • 3-3 識別子とネーミング
  • 3-4 変数
  • 3-5 代入
  • 3-6 列挙型
  • 3-7 配列
  • 3-8 ユーザー定義型
  • 3-9 コメント

4章 フロー制御ステートメント

  • 4-1 If~Then~Elseステートメント
  • 4-2 Select Caseステートメント
  • 4-3 For~Nextステートメント
  • 4-4 For Each~Nextステートメント
  • 4-5 Do~Loopステートメント
  • 4-6 処理の終了とスキップ
  • 4-7 処理の中断
  • 4-8 エラー処理
  • 4-9 Withステートメント

5章 プロシージャ――手続きに名前をつける

  • 5-1 プロシージャとは
  • 5-2 Subプロシージャ
  • 5-3 引数の構文
  • 5-4 Functionプロシージャ
  • 5-5 Propertyプロシージャ

6章 モジュール――プログラムを部品ごとにまとめる

  • 6-1 モジュールとは
  • 6-2 標準モジュールとオブジェクトモジュール
  • 6-3 プロパティとメソッドの定義
  • 6-4 シートモジュール
  • 6-5 ブックモジュール
  • 6-6 ユーザーフォーム
  • 6-7 クラスモジュール
  • 6-8 イベントを活用する
  • 6-9 モジュールとデバッグ
  • 6-10 モジュールの再利用と編集
  • 6-11 属性を編集する

7章 プロジェクトとライブラリ

  • 7-1 プロジェクト
  • 7-2 参照設定
  • 7-3 アドイン
  • 7-4 ライブラリ

Part3 ライブラリ
8章 VBAライブラリその1――VBA関数

  • 8-1 VBAライブラリとは
  • 8-2 文字列の操作をする――Stringsモジュール
  • 8-3 日付/時刻の操作をする――DateTimeモジュール
  • 8-4 数学演算を実行する――Mathモジュール
  • 8-5 データ型の変換をする――Conversionモジュール
  • 8-6 値の情報を得る――Informationモジュール
  • 8-7 システムやアプリケーションとやりとりをする――Interactionモジュール

9章 VBAライブラリその2――コレクション

  • 9-1 VBAライブラリで提供されるクラス
  • 9-2 コレクションを操作する――Collectionクラス
  • 9-3 自作コレクションを作る
  • 9-4 エラーを表すオブジェクト――ErrObjectクラス

10章 配列の操作

  • 10-1 配列を扱う関数

11章 Excelライブラリ

  • 11-1 Excelライブラリ
  • 11-2 Excelアプリケーションを操作する――Applicationクラス
  • 11-3 ブックを操作する――Workbooksクラス/Workbookクラス
  • 11-4 シートを操作する――Worksheetクラス/Sheetsクラス
  • 11-5 セル範囲を操作する――Rangeクラス
  • 11-6 テーブルを操作する

12章 MSFormsライブラリ

  • 12-1 ユーザーフォームを操作するライブラリ
  • 12-2 ユーザーフォームを操作する
  • 12-3 コントロールを操作する

13章 Scriptingライブラリ

  • 13-1 ファイルシステムの操作と辞書によるライブラリ
  • 13-2 ファイルシステムオブジェクト――FileSystemObjectクラス
  • 13-3 ドライブを操作する――Drivesクラス/Driveクラス
  • 13-4 フォルダを操作する――Foldersクラス/Folderクラス
  • 13-5 ファイルを操作する――Filesクラス/Fileクラス
  • 13-6 テキストファイルを操作する――TextStreamクラス
  • 13-7 辞書を操作する――Dictionaryクラス

Part4 実践Excel VBAプログラミング
14章 アプリケーション開発

  • 14-1 名簿管理ツールの開発
  • 14-2 データベースを準備する
  • 14-3 クラスを作成する
  • 14-4 シートモジュールの処理を作る
  • 14-5 ユーザーフォームを作成する
  • 14-6 運用を想定する

サポート

正誤表

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2020年3月6日最終更新)

P.73(2行目)

データ型を意識化に
データ型を意識

P.226(「リスト6-31 既定のメンバーとデフォルトインスタンス」4行目)

Debug.Print d '2015/5/31
Debug.Print d '2015/5/5

P.284(2行目)

数値の10はIsDate関数でTrueになります
文字列の"4/5"はIsDate関数でTrueになります

P.522(図13-14 辞書の生成と操作)

図に誤りがありました。正しい図は以下になります(クリックすると大きく表示できます)。

P522図_正

(以下2020年2月21日更新)

P.466 「図12-11 コマンドボタンのプロパティを設定する」内

囲み枠の位置に誤りがありました。

「DefaultプロパティをTrueに設定する」→[Enabled|True]

誤

「DefaultプロパティをTrueに設定する」→[Default|True]

正

P.496 「リスト13-5 Foldersコレクションからフォルダを参照する」1行目


Debug.Print myFolders("fuga").Name 'hoge


Debug.Print myFolders("fuga").Name 'fuga

(以下2020年2月4日更新)

P.386(「リスト11-41 Rangeクラスのメンバー」5,6行目)


Debug.Print .FormulaLocal '=A1&"fuga"
Debug.Print .FormulaR1C1Local '=R[-1]C[-1]&"fuga"


Debug.Print .FormulaLocal 'B2セルのA1参照形式の数式
Debug.Print .FormulaR1C1Local 'B2セルのR1C1参照形式の数式

P.426(「リスト11-69 ListObjectオブジェクトのプロパティ」5,6行目)


Debug.Print .ListRows.Count '3
Debug.Print .ListRows.Count '3


Debug.Print .ListRows.Count '3
Debug.Print .ListColumns.Count '3

(以下2020年1月27日更新)

p.261 「リスト8-1 Stringsモジュールのメンバー」8行目)


Debug.Print StrConv("おはよう",vbNarrow) 'オハヨウ


Debug.Print StrConv("オハヨウ",vbNarrow) 'オハヨウ

(以下2020年1月23日更新)

P.75 「3-4-1 変数の宣言」5行目

プロシージャベル
プロシージャベル

P.78 「リスト3-14 Staticステートメント」4行目


Debug.Print x


Debug.Print "x:", x

P.162「Memo」5行目

PowerPointでは、ドキュメントモジュールにあたるモジュールは存在していません。
PowerPointでは、ActiveXコントロールを配置した場合にのみ出現する「Slideモジュール」が存在しています。

P.211「リスト6-25 InitializeイベントとTerminateイベント」2行目


Dim d As DateTime: Set d = New DateTime


Dim d As DateObject: Set d = New DateObject

P.225「リスト6-30 DateObjectクラスに属性を設定」12行目


"DataObjectが持つ値"


"DateObjectが持つ値"

P.225「リスト6-30 DateObjectクラスに属性を設定」15行目


"DataObjectが持つ日付に対して同月の月末日を返す"


"DateObjectが持つ日付に対して同月の月末日を返す"

P.309「リスト9-5 自作コレクションに既定のメンバーを追加する」終わりから4行目


Public Property Get Item(ByVal index As Variant) As Variant


Public Property Get Item(ByVal index As Variant) As Person

P.388「表11-37 RangeクラスのAddressプロパティの引用」4行目

Scenariosの行
Scenariosの行をすべてカット(このような引数は存在していません)。

P.524「リスト13-26 KeysメソッドとItemsメソッドを使用した辞書のループ」


リストを以下にさしかえ

Sub MySub()

    Dim members As Dictionary: Set members = New Dictionary
    With members
        .Add "m01", "Bob"
        .Add "m02", "Tom"
        .Add "m03", "Ivy"
        
        Dim i As Long
        Dim myItems As Variant: myItems = .Items
        For i = LBound(myItems) To UBound(myItems)
            Debug.Print i, myItems(i)
        Next i
        
        Dim myKeys As Variant: myKeys = .Keys
        For i = LBound(myKeys) To UBound(myKeys)
            Debug.Print i, myKeys(i), .Item(myKeys(i))
        Next i
    End With

End Sub


商品一覧