Excel

Excelのリスト化でファイルが壊れる件

投稿日:2020年4月7日 更新日:

訳あって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セルをリスト化しましたが、保存して閉じても、問題なくファイルを開き直すことができました。

-Excel

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

【SAS】SASで良く使うテクニック。その9 「Alt+E+S+V+E」~縦横の並び替えを行いたいとき~【Excel】

今回はSASで良く使うテクニックということで、縦横の並び替えを行いたい時は、「Alt+E+S+V+E」が役に立つ理由を解説していきます。 具体的な使用場面は、 データセットの場合、カラムは横並びですが …

【Excel】リスト化をIndirectで実行する際の文字制限

セルをIndirectで動的にリスト化しようとした際、躓いたことを記事にします。 まずは、シート上を以下のように準備します。 B1をA1の内容に合わせて動的にリスト化します。例えば、A1に北海道と入力 …

【SAS】SASで良く使うテクニック。その2 「Ctrl+R」~データセットの列数が多いとき~【Excel】

今回はSASで良く使うテクニックということで、データセットの列数が多いときは「Ctrl+R」が役に立つ理由を解説していきます。 データセットのコンペアを行う場面を想定します。 先に以下の2記事を読んで …

【SAS】SASで良く使うテクニック。その6 「名前ボックス」~指定したセルに飛びたい時~【Excel】

今回はSASで良く使うテクニックということで、指定したセルに飛びたい時は「名前ボックス」が役に立つ理由を解説していきます。 以前の記事で「Ctrl+R」や「Ctrl+D」を用いた例を紹介してきました。 …

サクラエディタでVBAのステップ数を数える

サクラエディタの正規表現を使ってVBAソースコードのステップ数を数えてみたいと思います。 以下のソースを準備します。 Public StopFrag As Boolean ‘一時停止フラグ Dim i …