製作時のセオリー

::: note warn
自分用のメモなので、形は整ってないです。
:::
### 製作時のセオリー　全般
```
************    処理開始時    ***********************

Application.ScreenUpdating = False
Application.DisplayAlerts = False

場合によっては、イベントや自動計算を止めるために以下も実行
Application.EnableEvents = False
Application.Calculation = xlCalculationManual  シートの計算を手動計算に

実行対象のシートが、オートフィルタで絞込みがされているかのチェックをする。場合によっては解除する

実行対象のシートで、非表示になっている行・列の考慮。場合によっては再表示する

コードの最初に、ThisWorkbook.Activate　と入れておくのが無難。特に新規ブックとして切り離したり、他のブックを開いたりする場合は



************  初期値設定処理   *******************************

各変数には初期値を設定。配列はErase、動的配列はRedim(0)をしておくといいと思う
変数の初期値は、それが初期値だと分かるような値で

WorkbookのObject変数は、初期化処理で最初にNothingをSetするほうがいい。処理開始時にNothingになっていないことがある。最終処理でもNothingをSetするほうがいい



************  入力値チェック   *******************************

\ " / : * ? < > | はWindowsのファイル名・フォルダ名に使用できない文字。全角は使用可能

\ " / : * ? < > | はシート名に使用できない文字。全角は使用可能

シート名の最大文字数は31文字(2016確認)。31バイトという情報もあるが、はっきりしない

フォルダのパス・ファイルのパスについては以下を確認
・空白の場合
・「\」で始まるパスの場合
・「/」で始まるパスの場合
・「.」で始まるパスの場合
・フォルダ、ファイルが存在しない場合
・パスの最大文字数(フォルダの場合は230文字、ファイルで250文字にするのが適当か)


フォルダパスの末尾に"\"が付いていない場合は、付け足す

数値を入力するテキストボックスの値については、以下を確認

ブック名やシート名に使用できない文字（?\など）が原因で起きるエラーを考慮する





************  ブックを開く   *******************************

ファイル(ブック)を開く場合は、同名のファイルがすでに開いていないかを確認。データを更新しないなら、読み取り専用で開く
場合に応じて、以下のように開くといいかも

' ※データの書き換えをすると問題があるブックは、以下のように読み取り専用で開くのが手堅い
Workbooks.Open Filename:="C:\work\aaa.xlsx", UpdateLinks:=0, ReadOnly:=True

' ※データの書き換えをする場合は、以下のようにするのが適当かな
Workbooks.Open Filename:="C:\work\aaa.xlsx", UpdateLinks:=0, IgnoreReadOnlyRecommended:=True

同じブック名を開くことへの配慮を忘れずに。特に自分自身と同じファイル名のファイルを開くと、自分自身を閉じてしまうことがあるので注意する。自分と同名のファイルは作業対象としない、同名のファイルは開かないなどの配慮が必要




************  全般   *******************************

シート名の重複は常に意識する

シートのコピーをした場合、シートに定義されている名前もコピーしておくか、削除するかを考慮する

ツール自身のシートや作成するファイルのシートのセル設定は、「文字列」にするのが無難。場合によっては数値などに。

特定のフォーマットに入力させる場合、指定のフォーマットが変更されていないかをチェックする

最後のデータ・ファイル・行・列については特に配慮が必要。データ無しやブランクなどを試すこと

EXCEL2003型のファイルを扱う場合は、行・列数の最大値制限を考慮すること

特定のフォーマットに入力させる場合、指定のフォーマットが変更されていないかをチェックする。シート保護で変更できなくするのが手堅い

セル範囲からデータを取り込む場合は、あまり大きなデータになると処理に時間がかかりすぎる
データ範囲の最大行・最大列を指定し、処理可能なデータ量になるように制限をかけるべき

VBAツールのブックで表示したFormは、他のブックがアクティブの状態でも操作できるので、ツールのブックがアクティブな状態で処理が実行されるとは限らないことに注意
他のブックがアクティブな状態で処理を実行すると、ツールのブックでシートを追加したつもりが別なブックに追加になったりする
コードの最初に、ThisWorkbook.Activate　と入れておく。また、Worksheets.Add　というあいまいな指定ではなく、ThisWorkbook.Worksheets.Add　とする

VBAツールのブックにシートを追加する処理がある場合は、コードの最初に、ThisWorkbook.Activate　と入れておく。
Worksheets.Add　というコードはどのブックにシートが追加されるかが明確ではないので、ThisWorkbook.Worksheets.Add　とブックを指定するように
他のブックに対しても同様に、ブックを明確に指定するコードにする

Long型でもオーバーフローの危険性は高いので、常に考慮に入れたコードを書く

シートの最大行、最大列に達する可能性がある場合は、現在の行番号・列番号をチェックするコードを用意する

Mid関数やLeft関数は、Mid$・Left$のように$付きにしたほうがいい。処理が高速でデータ型の食い違いを防ぐらしい

他のExcelファイルを開く必要がある処理で、処理開始後に該当するブックを開くとする。何らかのエラーで中断し、エラーメッセージをメッセージボックスで表示する場合、該当のブックを閉じる前に表示するとExcelが一時的にフリーズしたようになる。
これを防ぐには、該当のブックを閉じてからメッセージボックスを表示するといいようだ。メッセージ格納用の変数を用意し、最終処理辺りで表示するとか。
エラーメッセージの表示は、最終処理で実行するのが無難かも。特に問題は無さそう



************  ファイル関連   *******************************

フォルダ選択がある場合、そのフォルダに対象となるファイルが全く無い場合にどうなるかを考慮しておく

作業対象のファイル・データなどが全く無し・ゼロの場合を常に考慮する

ファイル名の重複は常に意識する

作業対象のファイル、作業対象のファイルと同名のファイルを開いたままで実行するとどうなるかを必ず確認しておく

FSOで取得するフォルダのパスは、末尾に「\」は付いていないことに注意。
サブフォルダの検索も実施する時は、再帰処理に入った直後に「\」を付与するコードを記述するように



************    最終処理    ***********************

Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic　　自動計算へ

FSO、Stream等のオブジェクト変数はNothingへ。グローバル変数は絶対
配列はEraseする。グローバル変数は絶対

処理が中途半端になった新規ブック等がある場合は、ここで閉じる

エラーメッセージを最後に表示する場合は、ここで表示

ツールのシートをアクティブにする処理を入れてもいい

グローバル変数は、プロシージャの処理を抜けてもメモリ上に値が残るので、配列・Variant型・Object型の変数は最終処理で確実に初期化しよう。
Variant型の変数は、NothingをSetするのがいいみたい。配列として領域確保していればEraseできるが、エラーになる危険もあるので


************    フォーム    ***********************

コントロールのチェックボックス・オプションボタン等は、有効/無効の切り替えに合わせて背景色を変更するようにすると、有効/無効の状態が把握しやすくて親切。コードを書く手間がかかるが

コントロールのチェックボックス・オプションボタン等は、他のコントロールの状態に合わせて、Enable/Disableを切り替えると親切。状態を変えても意味が無い時には、Disableにしておくと誤解が無くなる

Formを表示する時は、表示位置を明確に指定すべき
With SettingForm
  .StartUpPosition = 0
  .Left = 150
  .Top = 50
  .Show vbModeless
End With
このようにすべきか

テキストボックスは、入力の文字数制限を常に設定すべき。大き過ぎる数値の入力を防ぐ意味もある

半角英数字しか入力しないテキストボックスは、IMEを強制的にOFFにする設定すべき。それでも、テキストエディタ等からコピペすると入力できてしまうが

テキストボックスは入力できる最大文字を制限するだけでなく、文字数をチェックして一定以上の場合はエラーとするようにすると親切。
入力できる最大文字を100、50文字を越える場合はエラーにするなど
テキストボックスに表示しきれない文字列は、どこまで入っているかがはっきりしない。入力チェックでしっかり判定するべきか

ThisWorkbookのコードに、以下のようにFormをロード、アンロードするものを記述しておこう
Private Sub Workbook_Open()
  Load ExecuteForm
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Unload ExecuteForm
End Sub

VBAツールのブックで表示したFormは、他のブックがアクティブの状態でも操作できるので、ツールのブックがアクティブな状態で処理が実行されるとは限らないことに注意
```
### テスト内容　全般
```
****************    全般     ****************************

実行対象のシートが、オートフィルタで絞込みがされているかのチェックをする。場合によっては解除する

実行対象のシートで、非表示になっている行・列の考慮。場合によっては再表示する

特定のフォーマットに入力させる場合、指定のフォーマットが変更されていないかをチェックする。シートの保護が簡単だが、最後のデータ・ファイル・行・列については特に配慮が必要。出力が全く無かった場合に正常であるかをチェック

ブック名やシート名に使用できない文字（\ " / : * ? < > | ）が原因で起きるエラーを考慮する

EXCEL2003型のファイルを扱う場合は、行・列数の最大値制限を考慮する

ファイル名の重複・シート名の重複は常に意識する

シートのコピーをした場合、シートに定義されている名前もコピーしておくか、削除するかを考慮する

ファイルのパスを指定する場合、"/"で始まるものは必ず入力チェックで拒否する

Windowsのディレクトリ名・ファイル名に使用できない文字は、\ "  / : * ? < > | なので、入力チェック時でエラーにする

ブックは基本的に読み取り専用、リンク更新なしで開くべき。適切な開き方になっているかをチェック

作業対象のファイル、作業対象のファイルと同名のファイルを開いたままで実行するとどうなるかをテストする

ディレクトリのパス文字列の長さは250文字までと考えて、それを超える文字列長の指定をテストする

各プロシージャ内でエラーが発生した場合にどうなるかをテストする

数値を入力させるセルやフォームでは、数値のオーバーフローに注意。CLng(1E+20)などはオーバーフローでエラーになる。

IsNumericで数値に変換できる事を確認し、最大値と最小値の範囲に入っている事を確認してからLong型等に変換するように

セル範囲からデータを取り込む場合は、最大範囲のデータ量で処理できるかのテストをすること

VBAツールのブック以外のブックがアクティブの状態で処理を実行し、正常に完了するかをテストする



****************    ディレクトリを指定させる場合のテスト     ****************************

空白で実行
\ のみ入力で実行
\\ のみ入力で実行
. (ピリオド1つ)のみ入力で実行
.. (ピリオド2つ)のみ入力で実行
/ のみ入力で実行
存在しないフォルダのパス
パスではない文字列
末尾が \ ではないパス 
末尾が \ であるパス 
半角スペース1つ
半角スペース2つ
全角スペース1つ
全角スペース2つ
 _ (アンダースコア1つ)のみ入力 
 & のみ入力 
 % のみ入力 
 $ のみ入力 
 # のみ入力 
 = のみ入力 
 : のみ入力 
 * のみ入力 
 ? のみ入力 
 " のみ入力 
 < のみ入力 
 > のみ入力 
 | のみ入力 
そのフォルダ内に、フォルダが全く無い場合にどうなるか
そのフォルダ内に、ファイルが全く無い場合にどうなるか
そのフォルダ以下にあるフォルダ・ファイルを開いた状態でどうなるか
処理対象になるフォルダ･ファイルが全く無かった場合にどうなるか
処理対象になるファイルと同名のファイルが開かれている場合に、影響が無いか
ファイルを開く・ファイル情報を取得する処理がある場合は、異常な拡張子( テキスト1.abc@  等)のファイルを作成してテスト



****************   ファイル名・フォルダ名を指定する場合のテスト      ****************************

\ " / : * ? < > |  Windowsでディレクトリ名に使えない文字が入っていないか　※半角文字は不可だが、全角は使用可能
空白を入力で実行
名前の重複
対象となるフォルダ、ファイルが開かれていた場合
半角/全角、大文字/小文字、ひらがな/カタカナ　の区別の影響。文字列比較時の、バイナリ/テキストモードの影響
パスの長さは250文字までをチェックする
Windowsでは、「aaa.txt」と「AAA.txt」は同じファイル名扱いなので、それを考慮したテストを。「aaa.txt」と「aaa.TXT」も同じファイル名扱い



****************    数値を入力するテキストボックス・セルのテスト     ****************************

空白
アルファベット　　AB　等
数字とアルファベットの組み合わせ　　      1A100  等
Long型をオーバーフローする指数　　　1E+20　等
Long型をオーバーフローするマイナスの指数　　　-1E+20　等
文字数制限を越える数値　　　　7文字制限のテキストボックスの場合、12345678　等
マイナス整数値　　　-100　等
マイナス小数値　　　-100.554　等
設定した最大値を超える数値
設定した最大値+1
設定した最大値
設定した最小値よりも小さな数値
設定した最小値-1
設定した最小値
適切な整数値
適切な小数値
0
0.0
小数部を切り捨てる場合で、0.1　等　　小数部を切り捨てると0になるので、1以上の値でなければならない場合を考えて
小数部を切り捨てる場合で、小数部が.0の数値　　5.0　等
小数部を切り捨てる場合で、小数部が.1の数値　　5.1　等　　　※CLng(5.1)は5になることに注意。CLng()は切り捨てに使うべきではない
小数部を切り捨てる場合で、小数部が.9の数値　　5.9　等　　　※CLng(5.9)は6になることに注意。CLng()は切り捨てに使うべきではない
小数部が5桁の数値　　1.23456　等　　小数部を四捨五入する場合は特に注意を
小数部が4桁の数値　　12.3456　等　　小数部を四捨五入する場合は特に注意を
小数部が3桁の数値　　123.456　等　　小数部を四捨五入する場合は特に注意を
小数部が2桁の数値　　1234.56　等　　小数部を四捨五入する場合は特に注意を
小数部が1桁の数値　　12345.6　等　　小数部を四捨五入する場合は特に注意を
小数部が5桁のマイナス数値　　-1.23456　等　　小数部を四捨五入する場合は特に注意を
小数部が4桁のマイナス数値　　-12.3456　等　　小数部を四捨五入する場合は特に注意を
小数部が3桁のマイナス数値　　-123.456　等　　小数部を四捨五入する場合は特に注意を
小数部が2桁のマイナス数値　　-1234.56　等　　小数部を四捨五入する場合は特に注意を
小数部が1桁のマイナス数値　　-12345.6　等　　小数部を四捨五入する場合は特に注意を
「\」と数値の組み合わせ　　\123　等　　IsNumericで数値と判定されることに注意
「\」と数値の組み合わせのマイナス値　　-\123　等　　IsNumericで数値と判定されることに注意
特殊記号　　!%#\　等
```