【VBA】VBAメモまとめ

# はじめに

:::note info
この記事は実務で使った技法を、そこら中からまとめたものになります（書籍・有料情報等は除く）。
:::

:::note info
技法の参考元は各項目の末尾に記載しております。
詳しい解説を見たい方は、是非とも参考元をご覧ください。
※一部「YouTube」へと飛ぶリンクがあるため、音量にご注意ください。
:::

:::note warn
随時更新する予定です。
:::

:::note warn
情報の誤り・不足等はコメント欄にてご指摘頂けますと幸いです。
:::

# ①最終行を取得したい
#### 【使用例】
+ 行の終着点が分からない場合
+ データ一覧の最後尾を知りたい場合
+ etc

#### 【コード】
``` Test.xlsm
'A列の最終行を取得後、「Ctrl + ↑」でデータの最後尾を選択するイメージ
    Cells(Rows.Count, 1).End(xlUp).Select
```

#### 【参考元】

https://daitaideit.com/vba-get-lastrow/#mokuzi2-1

https://www.youtube.com/watch?v=_npUx5oSsEs&t=652s

* * *

# ②最終列を取得したい
#### 【使用例】
+ 列の終着点が分からない場合
+ etc

#### 【コード】
``` Test.xlsm
'1行目の最終列を取得後、「Ctrl + ←」でデータの最後尾を選択するイメージ
    Cells(1, Columns.Count).End(xlToLeft).Select
```

#### 【参考元】

https://www.youtube.com/watch?v=EeTa3X0dx5Q&list=PLU-5eUErsg5W-J7Tfnq7c0nsR8P_GqwSe&index=1&t=334s

* * *

# ③変数などの定義情報へジャンプしたい
#### 【使用例】
+ 変数の定義情報を探すのが面倒なとき
+ etc

#### 【使い方】
__『Shift + F2』__ でジャンプできる
※元の行に戻りたいときは __『Ctrl + Shift + F2』__ 

#### 【参考元】

https://www.youtube.com/watch?v=jbVxgPkVl1k

* * *

# ④対象列の値が「〇〇」の場合、別列の値末尾に「〇」を付与する（ループ処理）
#### 【使用例】
+ 特定のデータを判別する場合
+ etc

#### 【コード】
``` Test.xlsm
'7列目の値が「〇〇」の場合、1列目の値末尾に「〇」を付与するイメージ
    Dim i As Long
    Dim a As Long
    
    '1列目の最終行を取得
    a = Cells(Rows.Count, 1).End(xlUp).Row
    
    '先頭行から最終行までループ
    For i = 1 To a
        If Cells(i, 7) = "〇〇" Then
            Cells(i, 1).Value = Cells(i, 1).Value & "〇"
        End If
    Next i
```

#### 【参考元】

http://blog.livedoor.jp/ots1125/archives/5756130.html

* * *

# ⑤指定フォルダ内のファイルを順次開き、処理を行う（FileSystemObject）
#### 【使用例】
+ フォルダに対して操作を行う場合
+ FileSystemObjectを使用
+ etc

#### 【参考元】

https://qiita.com/ysnhrk/items/0f85d145f68a49028139

* * *

# ⑥想定外エラー発生時に対応する処理を作りたい
#### 【使用例】
+ 想定されたエラー以外の処理が発生する場合（実装上必須となる）
+ etc

#### 【参考元】

https://excel-ubara.com/excelvba1/EXCELVBA361.html

* * *

# ➆セルの文字色を変更したい場合
#### 【使用例】
+ エラー発生時、画面に『NG』を表示し、強調するために赤色にする
+ etc

#### 【参考元】

https://excel-ubara.com/excelvba1/EXCELVBA334.html
* * *

# ⑧外部設計時のポイント
#### 【ポイント】
①システム仕様記載の際、まずは処理概要を文字で表現してみる（あくまでユーザーから視認できる箇所を）。

②文字で表現してみて、それだけでは分かりにくいものにはついては、その機能に特化した図を書いてみる（詳しく書く必要はなく、ポンチ図でOK）。

③プログラム的な記載は内部設計の領域になるため、そこまで詳しく記載しない。

④システム概要、システムフロー図、開発方針、前提制約事項、入出力ファイル情報、入出力ファイル項目定義、メッセージ定義などを作成。

⑤FileSystemObjectを使用してフォルダ内のファイル一覧を処理する場合、フォルダ内をソート（名前の昇順）などの対応を考慮すること。
　※上記オブジェクトでは、ソート機能を有するオプションがないため、自分でロジックを組み、部品化をして呼び出す必要がある。
　➡ファイルサーバのファイルシステムが『NTFS』の場合、ツール実行時は必ず名前順で処理される仕組みとなっている。

⑥エラー時のメッセージ表示、それ以外の想定外エラーの対応も考慮すること。

➆FileSystemObjectを使用してフォルダ内のファイルを繰り返して処理する場合、『For Each file in files』を使用する。
　このとき、既に開かれているファイルがある場合、そちらが優先されて開く仕組みとなっている。

#### 【もしツール実行時にユーザーに伝えたいこと、制限したいことが発生した場合】
+ すべてロジックに落とし込む必要はなく、場合によっては外部設計『システム仕様書』の前提制約事項に書いて保険を置くことも大事になってくる。

#### 【システム仕様書の項目について】※あくまで一例

| 項目名 |
|:-:|
| システム概要  |
| 機能一覧（モジュールごと）  |
| 開発方針  |
| 前提条件  |
| システムフロー図（隣接システム含めたフロー）  |
| 入出力情報  |
| 入出力ファイル項目（定義情報）  |
| システム仕様  |

* * *

# ⑨ツール開発時のポイント
#### 【ポイント】

①モジュール単位、処理単位で実装後、機会を作ってデモンストレーション＆レビューをした方がいい。
　※余計な手戻りが発生しないようにするため。

②共通化できる処理はユーザー定義関数（Function）を作成した方がいい。

③ツールは必ずバージョン管理、もしくはファイルサーバに履歴を持った方がいい。

④モジュール単位で実装後、疎通テストを実施した方がいい
　※I/Oでファイル比較ツール（WinMerge等）を使用し、変更箇所の変更がないか確認する

⑤入力チェック処理等は必ず実装すること
　・INファイルのフォーマットチェック、項目ごとのNULLチェック、フォルダ存在チェックなどなど。

⑥想定外のエラーに対処する処理は追加するべき
　VBAの場合：On Error goto ***

➆処理途中のメッセージ（保存しますか等々）は表示させないようにする。
　また、処理中の動作は省略させること。

⑧件数をカウントする場合、最初に0を代入させた変数を宣言し、その後、追加する件数をその変数に＋する。

* * *
# ⑩UTテストケース作成のポイント
#### 【ポイント】
①初期動作（ツール起動時の処理、初期画面の表示、2回目起動の表示確認）

②ボタン検証（ボタン押下時の結果確認）

③出力ファイル検証

④エラー検証

#### 【証跡作りの考え方】


・証跡フォルダの構成
　No.＊＊
	・入力ファイル
	・出力ファイル
	・差分比較用（WinMerginなどによる比較結果に使用したCSV）
	・証跡ファイル（xlsx）
	
・

UTテスト時のポイント

・テスト項目以外に思いついた検証観点がある場合、まずはモンキーテストを実施してみること。
　➡そこから落ち度を発見する可能性があるため、その時にUTテスト項目として追加し、実施すること（その際にデグレテストも実施する）。