訳あって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まで記載してありますが、最後の方で触れます。)
![](http://how-to-business.com/wp-content/uploads/2020/04/9210dbe28ea8d8aeee3965733e4934ce.png)
実行するとD1セルがリストで入力できるようになります。
![](http://how-to-business.com/wp-content/uploads/2020/04/7c56500e904c2ae511a85ca124ff8bea.png)
ところが、ファイルを保存して再び開こうとするとファイルが壊れました。
![](http://how-to-business.com/wp-content/uploads/2020/04/c937f6bf36d1402a5eab2fb5c5066abb.png)
2.原因
そして今度はE1に255文字入力した状態にします。
![](http://how-to-business.com/wp-content/uploads/2020/04/fc9217dc103d2145c8b86647cfa4f942.png)
実行するとD1セルがリストで入力できるようになります。
![](http://how-to-business.com/wp-content/uploads/2020/04/d5343d66d3ef4be1a249d12f943bbd57.png)
こちらは問題なく保存できました。どうやらリスト化には文字数制限があるかもしれません。
そこでデータの入力規則で何文字入るか確認してみると255文字まで入力できますが、256文字目以降は入力ができませんでした。
![](http://how-to-business.com/wp-content/uploads/2020/04/997484b55f7d1a364bcf90f860575edf.png)
エクセルの入力ルール上ではこれ以上入力ができないため、バグが起こらないです。
一方、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セルをリスト化しましたが、保存して閉じても、問題なくファイルを開き直すことができました。
![](http://how-to-business.com/wp-content/uploads/2020/04/fd93aac694e93a3209b764d4c53a8b1a.png)