エクセルの入力規則(リスト)をVBA(Range.Validation.Add())で設定したときに、場合によってはブックが壊れてしまう、という話。
特にリストをカンマ区切りの文字列で直接指定するような場合は、255文字を超えないように要注意(リスト(候補)が動的に変わるような場合、カンマ区切りで直接指定するよりも、ワークシートの範囲参照で指定するのがベター)。
下記のような不具合が発生しないように、リスト(候補)はワークシートへの参照の形で指定するのがよいと考えられる。
参照範囲は固定範囲(予め想定される最大の範囲)でもよいが、ここでは参照元の候補数が更新された場合に、Worksheet_Changeイベントによって参照範囲を動的に変更するようにしている。
Range.Validation.Add()の引数Formula1に、255文字より多くの文字列を指定すると不具合が発生する(カンマ区切りで直接リスト(候補)を指定するような場合に起こりやすいと思われる)。
VBAでセルの入力規則を設定、このとき、Range.Validation.Add()の引数であるFormula1に256文字以上を指定
↓
とくにエラーもなく実行される
↓
入力規則にもしっかりと反映されている
↓
安心して保存(←☠実はこの時点ですでにエクセルブックとしては壊れている)
↓
ブックを閉じてから、開き直す
↓
「一部の内容に問題が見つかりました」と開き直られる←☠
↓
回復を試みる
↓
入力規則が削除される←☠(入力規則のみならず書式などがおかしくなることもある模様)
- Range.Validation.Add()で、Formula1に指定できるのは255文字までで、それ以上の文字数になると動作がおかしくなる(一見普通に動作しているように見えるが、保存して閉じた後で開き直すとブックが壊れている)
- 入力規則に(範囲指定で)表示できる選択肢は最大32767個まで(それ以上の範囲を指定しておいてもドロップダウンリストに表示されない)
- 入力規則の指定は、VBAで設定するまでもなく、範囲で最大行(例:1048576)固定で指定しておいても(空欄は無視する指定にしてあれば)とりあえず実用的な速度で動作はするが、入力規則を利用するマクロやアドインの作りによっては動作が重くなってしまう(例:入力規則リスト選択改善アドイン)ので、必要最小限の範囲指定にするほうがベター
- Range.Validation.Add()のFormula1でワークシートの範囲(数式)を指定する場合、Excelのオプション>数式>数式の処理の「R1C1 参照形式を使用する」の状態(Application.ReferenceStyle)に応じた参照形式で指定する必要がある