訳あってVBAでセルをリスト化する機会があり、今回はその時躓いたことを記事にしました。
[目次]
1.起こったバグ
セルをリスト化するものとして、今回は以下のソースコードを用意します。
Sub リスト化()
'文字列で指定
Dim list_choice_chars As String 'リスト化するための選択肢文字列
list_choice_chars = ThisWorkbook.Worksheets("Sheet1").Cells(1, 5).Value
With ThisWorkbook.Worksheets("Sheet1")
With .Cells(1, 4).Validation 'D1をリストにする
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=list_choice_chars
End With
End With
End Sub
E1セルに256文字の文字列を入力した状態で実行します。(B列には1~100まで記載してありますが、最後の方で触れます。)
実行するとD1セルがリストで入力できるようになります。
ところが、ファイルを保存して再び開こうとするとファイルが壊れました。
2.原因
そして今度はE1に255文字入力した状態にします。
実行するとD1セルがリストで入力できるようになります。
こちらは問題なく保存できました。どうやらリスト化には文字数制限があるかもしれません。
そこでデータの入力規則で何文字入るか確認してみると255文字まで入力できますが、256文字目以降は入力ができませんでした。
エクセルの入力ルール上ではこれ以上入力ができないため、バグが起こらないです。
一方、VBAだと変数に文字列を代入する際、文字数制限が無いため、マクロ実行では通ってしまい、その結果、ファイル保存の際に壊れてしまうみたいです。
3.対処法
リスト化をする際、座標指定にすればVBAでも問題はなくなります。
というわけで以下がソースです。
Sub リスト化()
'座標で指定
With ThisWorkbook.Worksheets("Sheet1")
With .Cells(1, 1).Validation 'A1をリストにする
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=$B$1:$B$100"
End With
End With
End Sub
B列に1~100まで記載し、A1セルをリスト化しましたが、保存して閉じても、問題なくファイルを開き直すことができました。