38
Excel VBA 実務応用 講座

最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

  • View
    429

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Excel VBA

実務応用講座

Page 2: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved.

講師プロフィール

V - C O NVBA Consulting

EX celercise

エクセル本舗

日本頭脳株式会社 代表取締役。ITコーディネータ、調理師。世界最大級のコンサルティングファームであるプライスウォーターハウスクーパース出身のたたき上げITコンサルタント。10年以上にわたり大企業向けの業務改革プロジェクトをリード。オフィスワークの生産性向上実現をコンセプトとして事業を展開している。

永井 雅明

業務改善コンサルティング

高度IT業務アウトソーシング

高度IT人材育成

Page 3: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved.

事業コンセプトイメージ

2

仕様策定から任せられる

日本頭脳の実力

V -CONVBA Consulting

Page 4: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved.

事業コンセプトイメージ

3

V -CONVBA Consulting

VBAで

業務にイノベーションを

Page 5: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved.

実績

4

✓業務改善コンサルタント歴15年。

✓プロジェクトマネージャー経験7回。

✓全社システム導入会社数10社。

✓システム規模最大6,000ユーザ。

✓画面設計数500以上。

✓データベース(テーブル)設計数1,500以上。

Page 6: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

目次

1. ツール設計 20分

2. ツール開発 <前半戦> 70分 データ操作

・・休憩・・ 45分

3. ツール開発 <中盤戦> 70分 ファイル操作

・・休憩・・ 10分

4. ツール開発 <後半戦> 70分 通常処理・特殊処理

・・休憩・・ 10分

5. ブラッシュアップ 70分 • 余計なシートを削除する• 繰返し文字列の変数化• Withブロックの活用• 固定値の定数化

・・休憩・・ 10分

6. オプション講義 - • デバッグ• エラーハンドリング

7. アンケート 10分

Page 7: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved.

講義中のルール

講義中の質問OK

疲れたら手を休めてOK

ついてこれない場合は休憩中にフォロー

トイレ休憩はご自由に

携帯電話・スマートフォンの電源はOFF

Page 8: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved.

事前準備

チェック外す

開発用画面(VBE)>ツール>オプション>自動構文チェック

Page 9: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

ツールの動作を実際に見てみよう

8

Page 10: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

ツール設計

9

Page 11: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

ツールの処理内容

10

Page 12: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 11

ファイル・シート構成

請求書作成ツール

請求データ(10件)

請求書テンプレート

マッピング

請求書1

請求書テンプレート

請求書2

請求書テンプレート

請求書3

請求書テンプレート

・・

請求書作成ツール(受講生用).xlsm

2016-10-31-004.xlsx 2016-10-31-005.xlsx 2016-10-31-006.xlsx

Page 13: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 12

請求書の出力イメージ(赤枠をまとめて請求データと呼ぶ)

請求日

請求番号

会社名

担当者氏名

件名

支払期日

請求金額

件名

知識

会社名敬称

担当者敬称

Page 14: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 13

請求書テンプレートのイメージ 知識

Page 15: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved.

請求データのイメージ

<項目>1. 請求番号2. 請求日3. 件名4. 請求金額(税別)5. 支払期日6. 会社名7. 会社名敬称8. 担当者氏名9. 担当者敬称

14

<請求データ仕様>• 請求データ1行につき、請求書1枚が発行される• 請求番号は、必ずユニークであるとする• 請求明細は、1行しか出力しないものとする

→複数明細に対応したツールは、受講者特典で配布• 請求金額に係る税は、請求書テンプレート内で計算• 会社名+全角スペース+敬称を、会社名とする• 担当者氏名+全角スペース+敬称を、担当者とする

知識

Page 16: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 15

請求データと請求書をどうやってひもづけるのか?

請求データ1行目

請求データ2行目

請求データ3行目

1行ずつ処理をする

請求書出力

知識

Page 17: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 16

ひもづけに使う「マッピングデータ」とは?

格納先名称 請求データ列位置 請求書セル位置 特殊処理

請求番号 1 I3

請求日 2 H2

件名 3 C11,B19 格納先複数

請求金額 4 H19

支払期日 5 D12

会社名 6,7 B7 結合

担当者氏名 8,9 B9 結合

請求データの各項目を、請求書のどこに埋めるかを定義した対応関係表

知識

マッピングデータを使うと、請求書に値を埋めていく処理を繰返し化でき処理がシンプルになる。最も大きな利点は、項目の追加やレイアウト修正などの際にメンテナンスしやすくなる。逆に使わないと、項目などを追加するたびにプログラムを修正しないといけなくなる。

Page 18: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 17

マッピングデータはどのように使うのか?

格納先名称 請求データ列位置 請求書セル位置 特殊処理

請求番号 1 I3

請求日 2 H2

件名 3 C11,B19 格納先複数

請求金額 4 H19

: 5 D12

請求データ1行目

請求データ2行目

請求データ3行目

格納先名称 請求データ列位置 請求書セル位置 特殊処理

請求番号 1 I3

請求日 2 H2

件名 3 C11,B19 格納先複数

請求金額 4 H19

: 5 D12

格納先名称 請求データ列位置 請求書セル位置 特殊処理

請求番号 1 I3

請求日 2 H2

件名 3 C11,B19 格納先複数

請求金額 4 H19

: 5 D12

請求データ1行ずつ処理

1行ずつ処理

1行ずつ処理

1行ずつ処理

知識

Page 19: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 18

通常処理では対応できない特殊な処理をどうするか?

格納先名称 請求データ列位置 請求書セル位置 特殊処理

請求番号 1 I3

請求日 2 H2

件名 3 C11,B19 格納先複数

請求金額 4 H19

支払期日 5 D12

会社名 6,7 B7 結合

担当者氏名 8,9 B9 結合

• 通常処理 値をそのまま格納する• 特殊処理1 同じ値を複数のセルに格納する• 特殊処理2 複数の値を結合した値を格納する

知識

特殊処理2

特殊処理1

Page 20: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved.

ユーザインターフェース(見た目)をどうするか?

19

知識

「請求書を作成」ボタンをヘッダに配置

可 変 領 域(ポイント1.行列数の増減があるため、ボタン等の設置は望ましくない)

拡張性(※今後、このツールがどのように変更され得るか) ユーザビリティ(使いやすさ)

ポイント2.請求データの入力は「左から右」に行われるので、右側にボタンがあることが望ましい

Page 21: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 20

A) マッピングデータ取得B) 請求データ取得

C) 請求データごとに繰り返し処理① 請求データからファイル名を取得② Excelファイル作成③ マッピングデータ(請求項目)ごとに繰り返し処理

1. 通常処理:単純に値を格納2. 特殊処理1:同じ値を複数のセルに格納3. 特殊処理2:複数の値を結合した値を格納

D) Excelファイルを閉じる

全体像

請求書を作成ボタン押下時処理

請求書出力処理

Excelファイル作成Excelファイルを

閉じるExcelファイルOPEN

チェックファイル存在確認

ファイル操作

請求書出力

Page 22: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

ツール開発 前半戦<データの操作>

21

Page 23: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 22

ボタンを作ってみよう ワーク

1. 請求先一覧シートに、「請求書の作成」ボタンを配置してみよう2. 「請求書の作成」ボタンに「請求書を作成_Click」マクロを登録してみよう3. 「請求書出力処理」というFunctionを作成する(処理の中身はブランクでよい)4. 「請求書の作成」ボタンをクリックすると、 「請求書出力処理」が実行されるようにしてみよう

ワーク

Sub 請求書を作成_Click()Call 請求書出力処理

End Sub

Function 請求書出力処理()

End Function

正解

ボタンクリックイベントはSubでしか記述できない。

Subの中ではデバッグできないので、処理内容をSubでは書かずに、標準プロシージャに書くこと。

Page 24: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 23

コメントを書くクセをつける

'************************************'* 請求書を作成ボタン押下時処理'*'* 引数1'* 戻値1'************************************Sub 請求書を作成_Click()

Call 請求書出力処理End Sub

'セルの値がある場合If cell.Value <> "" Then

'セルごとのエラーチェック処理を行い、'エラーがある場合は、セルの色を赤にするIf セルごとのエラーチェック処理(cell.Value) = True Then

cell.Interior.ColorIndex = 3'エラーがない場合は、セルの色をクリアするElse

知識

• プロシージャの前には、見出しをつける

• 引数と戻値を書く• 処理名だけではわか

りにくい場合は、処理の概要も書く

• 各処理の内容を、第三者が見てもわかるように詳しく書く

• 処理の目的や、制約事項なども記述

Page 25: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 24

A) マッピングデータ取得B) 請求データ取得

C) 請求データごとに繰り返し処理① 請求データからファイル名を取得② Excelファイル作成③ マッピングデータ(請求項目)ごとに繰り返し処理

1. 通常処理:単純に値を格納2. 特殊処理1:同じ値を複数のセルに格納3. 特殊処理2:複数の値を結合した値を格納

D) Excelファイルを閉じる

全体像

請求書を作成ボタン押下時処理

請求書出力処理

Excelファイル作成Excelファイルを

閉じるExcelファイルOPEN

チェックファイル存在確認

ファイル操作

請求書出力

Page 26: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 25

Excel表のデータを取得するには? 知識

• Rangeの仲間、UsedRangeを使う

• Variantに格納する(2次元配列となる)

ポイント

イメージ

【なぜ?】可変行・可変列だから。Rangeは固定範囲なので、行や列を追加するたびに修正しないといけない

【なぜ?】Excel表から1行ずつデータを取ってくるより、表全体のデータを一発で取ったほうが処理が早いし楽

Variant型の変数

ThisWorkbook.Sheets(“シート名”).UsedRange

Page 27: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 26

データを取得してみよう ワーク

Excel表からマッピングデータと請求データを取得し、配列に格納してみよう1. Variant型の変数を2つ宣言する(マッピングデータと請求データ)

• vMapping:マッピングデータを格納• vBilling:請求データを格納

2. マッピングデータを取得してみよう3. 請求データを取得してみよう

ワーク

Dim vMapping As VariantDim vBilling As Variant

'マッピングデータ取得vMapping = ThisWorkbook.Sheets(“マッピング”).UsedRange

'請求データ取得vBilling = ThisWorkbook.Sheets(“請求データ”).UsedRange

正解

Page 28: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 27

A) マッピングデータ取得B) 請求データ取得

C) 請求データごとに繰り返し処理① 請求データからファイル名を取得② Excelファイル作成③ マッピングデータ(請求項目)ごとに繰り返し処理

1. 通常処理:単純に値を格納2. 特殊処理1:同じ値を複数のセルに格納3. 特殊処理2:複数の値を結合した値を格納

D) Excelファイルを閉じる

全体像

請求書を作成ボタン押下時処理

請求書出力処理

Excelファイル作成Excelファイルを

閉じるExcelファイルOPEN

チェックファイル存在確認

ファイル操作

請求書出力

Page 29: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 28

配列の操作 知識

値を取得する→配列名(行番号, 列番号)

UBoundの2つめの引数は、行なのか列なのかを指定する。行数ならUBound(配列名, 1)、列数ならUBound(配列名, 2)である。

2つめの引数は省略することもでき、省略した場合は「1」(行数)とみなされる。

vBilling(2, 3) UBound(vBilling)の値は12

12行

全行数を取得する→ UBound(配列名)

Page 30: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 29

請求データの繰り返し処理をしよう ワーク

1. 請求データの繰り返し処理を書いてみよう(For)• 行数の変数名は「iRow」(Integer型)し、冒頭で宣言する• 開始は「4行目」から、終了は「請求データ(vBilling)の行数」まで

2. sIndexという文字列型の変数を宣言してみよう(請求書出力処理の冒頭で)3. 繰り返し処理の中で、sIndexに、毎行の請求番号を格納してみよう4. 繰り返し処理の中で、 sIndexを、イミディエイトウィンドウに表示してみよう(Debug.Print)

ワーク

Dim vMapping As VariantDim vBilling As VariantDim sIndex As StringDim iRow As Integer

'請求データを1行ずつ処理するFor iRow = 4 To UBound(vBilling)

'シート名の設定(ファイル名にも使用)

‘シート名の表示

Next

正解1・2

Dim vMapping As VariantDim vBilling As VariantDim sIndex As StringDim iRow As Integer

'請求データを1行ずつ処理するFor iRow = 4 To UBound(vBilling)

'シート名の設定(ファイル名にも使用)sIndex = vBilling(iRow, 1)

'シート名の表示Debug.Print sIndex

Next

正解3・4

確認終わったら削除

Page 31: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 30

A) マッピングデータ取得B) 請求データ取得

C) 請求データごとに繰り返し処理① 請求データからファイル名を取得② Excelファイル作成③ マッピングデータ(請求項目)ごとに繰り返し処理

1. 通常処理:単純に値を格納2. 特殊処理1:同じ値を複数のセルに格納3. 特殊処理2:複数の値を結合した値を格納

D) Excelファイルを閉じる

全体像

請求書を作成ボタン押下時処理

請求書出力処理

Excelファイル作成Excelファイルを

閉じるExcelファイルOPEN

チェックファイル存在確認

ファイル操作

請求書出力

Page 32: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 31

ネスト(入れ子)の書き方 知識

繰り返し処理のネスト

For iRow = ・・・

For iRow2 = ・・・

For iRow3 = ・・・

For iRow4 = ・・・

For iRow5 = ・・・

Next

Next

Next

Next

Next

‘○○の繰り返し処理For iRow = ・・・

‘○○の繰り返し処理For iRow2 = ・・・

‘○○の繰り返し処理For iRow3 = ・・・

‘○○の繰り返し処理For iRow4 = ・・・

‘○○の繰り返し処理For iRow5 = ・・・

Next iRow5

Next iRow4

Next iRow3

Next iRow2

Next iRow

インデントする

コメントをしっかり書く

通常書かなくてもよい変数名を、あえて書く

Page 33: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 32

表内のセルの値を1個ずつ表示してみよう(簡単なやり方) ワーク

1. 請求データの繰り返し処理(「行」ごとの繰返し)の中に、「列」の繰り返し処理を書いてみよう(For)• 列数の変数名は「iCol」(Integer型)とし、冒頭で宣言する• 開始は「1列目」から、終了は「請求データ(vBilling)の列数」まで

2. 請求データの各セルの値を、イミディエイトウィンドウに表示してみよう(Debug.Print)

ワーク

Dim iRow As IntegerDim iCol As Integer

:'請求データを繰返し処理するFor iRow = 4 To UBound(vBilling)

'シート名の設定(ファイル名にも使用)sIndex = vBilling(iRow, 1)

'マッピングデータを繰返し処理するFor iCol = 1 To UBound(vBilling, 2)

'請求データの各セルの値を表示Debug.Print vBilling(iRow, iCol)

Next iColNext iRow

正解

マッピングデータを使わない方法

Nextの右に、iRowを書いておこう

Page 34: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 33

復習)マッピングデータの使い方

<請求データ>

<マッピングデータ>

知識

横方向を縦方向に(列の情報を、行として扱う)→なぜそんなことをするかというと、何列目かという情報以外にも、どこに値を埋めるか、そのときに特殊な処理をするのかどうか、といった情報(マッピング情報)をあわせて管理したいから

何列目かを示す

Page 35: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 34

表内のセルの値を1個ずつ表示してみよう(マッピングデータ) ワーク

1. 請求データの繰り返し処理の中に、マッピングデータの繰り返し処理を書いてみよう(For)• 先程書いた「列」の繰返し処理は削除する• 行数の変数名は「iRow2」(Integer型)とし、冒頭で宣言する• 開始は「2行目」から、終了は「マッピングデータ(vMapping)の行数」まで

2. マッピングデータの2列目(※請求データの列位置を表す)を使って、請求データの各セルの値を、イミディエイトウィンドウに表示してみよう(Debug.Print)

ワーク

Dim iRow2 As Integer:

'請求データを繰返し処理するFor iRow = 4 To UBound(vBilling)

'シート名の設定(ファイル名にも使用)sIndex = vBilling(iRow, 1)

'マッピングデータを繰返し処理するFor iRow2 = 2 To UBound(vMapping)

'請求データの各セルの値を表示Debug.Print vBilling(iRow, vMapping(iRow2, 2))

Next iRow2Next iRow

正解

【ヒント】最終的に欲しいのは、請求データの各セルの値→vBilling(行番号, 列番号)

このうち、行番号はどこにあるか?→請求データの繰返し処理で使っているiRow

次に、列番号はどこにあるか?→マッピングデータの2列目にある

では、マッピングデータの2列目を取得するには?→vMapping(iRow2, 2)

これらをまとめると、請求データの各セルの値は→vBilling(iRow, ・・・)?

やや難

Page 36: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 35

変数への置き換え

配列の中に配列があって、見づらい・・vBilling(iRow, vMapping(iRow2, 2))

知識

vMapping(iRow2, 2) vMapping(iRow2, 3) vMapping(iRow2, 4)

sFrom sTo sSpecial

変数に置き換えると・・vBilling(iRow, sFrom)

見ただけで何の項目かがわかるシンプルで見やすくなる

Page 37: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 36

変数に置き換えよう ワーク

1. マッピングデータの2列目を、変数に置き換えよう• 変数名は「sFrom」(String型)とし、冒頭で宣言する

2. 同様に、マッピングデータの3列目、4列目も、変数に置き換えよう• 変数名はそれぞれ、「sTo」「sSpecial」とする

ワーク

Dim sFrom As String :

'請求データを繰返し処理するFor iRow = 4 To UBound(vBilling)

'シート名の設定(ファイル名にも使用)sIndex = vBilling(iRow, 1)

'マッピングデータを繰返し処理するFor iRow2 = 2 To UBound(vMapping)

sFrom = vMapping(iRow2, 2)

'請求データの各セルの値を表示Debug.Print vBilling(iRow, sFrom)

Next iRow2Next iRow

正解1

Dim sFrom As StringDim sTo As StringDim sSpecial As String

:'請求データを繰返し処理するFor iRow = 4 To UBound(vBilling)

'シート名の設定(ファイル名にも使用)sIndex = vBilling(iRow, 1)

'マッピングデータを繰返し処理するFor iRow2 = 2 To UBound(vMapping)

sFrom = vMapping(iRow2, 2)sTo = vMapping(iRow2, 3)sSpecial = vMapping(iRow2, 4)

正解2

Page 38: 最強のExcel VBA講座 実務応用コース レジュメ(前半戦まで)

Copyright © 日本頭脳株式会社 All rights reserved. 37

B r e a k T i m e