第六回 シート上の選択セルにフォームからテキストを入力する

セルに、フォームから文字を入力したいときってありますよね。え、ないって?まあ、それを言ってしまうと、この記事はそれでおしまいになってしまいますんで(笑)。​

例えばセルに長文を書き込む場合を考えてください。拙作「エクセル日記」。このソフトでは日々の出来事をひとつのセルに書き込むようになっていますが、このようなアプリケーションの製作が可能なのも、セルの記録文字数が相当数にのぼるからこそです。Excelの仕様あってのことですね。​

ところで皆さんはひとつのセルに一体何文字入力できるか知っていますか?​

 

Excel の仕様と制限

こちらの記事によると、セルが含むことができる合計文字数「32,767 文字」ということになっています。何とも膨大なデータが記録できるのだということが分かります※注)。日本語の文字数ですと一文字が2バイトとして、32,767 ÷ 2 = 16,383 文字ですか?いずれにしてもほとんど無限と言って良いくらいのもんです。ちなみにサンプルファイルでは「源氏物語」の一巻一巻をひとつのセルに記録させています。シート全体で「源氏物語」全巻が見られるわけです。こんな芸当がExcelでは難なく出来てしまうわけですね。​

さてそれでは本題に入ります。長い文章をセルに直接書き込んだり、数式バーに表示されたものを訂正する、などの作業は、まことにまどろっこしいものですね。そこでセルの中の文章をフォームのテキストボックスに表示して編集を出来るようにします。

選択セルをフォームに表示させるのは簡単で、次のようなプロシージャとなります。

———————————————————————————————————–
    Private Sub セル表示_Click()’「セル表示」ボタンをクリックしたときのイベントプロシージャ。
    
    Dim セル文字列 As String’変数を宣言。
    Dim 選択行 As Integer’変数を宣言。
    Dim 選択列 As Integer’変数を宣言。    
        セル文字列 = ActiveCell.Value’変数「セル文字列」にアクティブセルの値を代入。
        選択行 = Selection.Row’変数「選択行」に選択行の番号を代入。
        選択列 = Selection.Column’変数「選択列」に選択列の番号を代入。
        
        Userform1.TextBox1.Value = セル文字列’TextBox1にセル文字列を表示。
        Userform1.TextBox2.Value = 選択行’TextBox2に選択行を表示。
        Userform1.TextBox3.Value = 選択列’TextBox3に選択列を表示。
        Userform1.Show vbModeless’シート変更可能な状態でUserForm1を表示。
        Userform1.TextBox1.SetFocus’TextBox1にフォーカスする。

        Userform1.TextBox1.SelStart = 0’TextBox1の頭にカーソルを持ってくる。
        Userform1.TextBox4 = “このセルは、” & LenB(StrConv(Userform1.TextBox1.Text, vbFromUnicode)) & _

        ” バイトあります。 “’TextBox1の文字列のバイト数を表示する。
    
    End Sub
———————————————————————————————————–​

ここで重要なのは、選択行・選択列を何故わざわざフォームのTextBox2・TextBox3に表示させるのか、ということですね。その理由は次のコードにあります。Userform1のTextBox1に表示された内容を選択セルに記入する(あるいは編集する)プロシージャです。​

———————————————————————————————————–
    Private Sub 更新_Click()’「更新」ボタンをクリックしたときのイベントプロシージャ。
    
    Dim 選択行 As Integer’変数を宣言。
    Dim 選択列 As Integer’変数を宣言。
    Dim 応答 As Variant’変数を宣言。

        選択行 = Me.TextBox2.Value’変数「選択行」にTextBox2の値を代入。
        選択列 = Me.TextBox3.Value’変数「選択列」にTextBox3の値を代入。
        
        応答 = MsgBox(“    セル値を保存しますか?”, vbYesNo, “更新”)
                       
        If 応答 = vbYes Then
            ActiveSheet.Cells(選択行, 選択列).Value = Userform1.TextBox1.Value
       ’Userform1のTextBox1の値を、セル番地(選択行, 選択列)に上書き。
            Userform1.Hide’UserForm1を非表示に。
            Cells.WrapText = False’セルの折返し表示をなしに。
        Else
            Userform1.Hide’UserForm1を非表示に。
        End If
         
    End Sub
———————————————————————————————————–​

一見「ActiveCell.Value = Userform1.TextBox1.Value」で良さそうなものですよね・・・。しかしそうは問屋が卸さない。選択セルをフォームに表示させたときに、セル文字列 = ActiveCell.ValueとしてUserform1.TextBox1に表示させたわけですが、開いたフォームにフォーカスが移ったことによりActiveCellの値がクリアされてしまうのです。したがってその前に、選択したセルの番地をどこかに記憶させなければならないわけですね。それがこの部分です。​

        Userform1.TextBox2.Value = 選択行’TextBox2に選択行を表示。
        Userform1.TextBox3.Value = 選択列’TextBox3に選択列を表示。

次が「字数表示」ボタンを押したときのイベントプロシージャです。選択したセルの中に文字列が何バイト含まれているかを表示してくれます。「源氏物語」一巻ぶんなど余裕で入ることが実感出来ます。

———————————————————————————————————- 

  Private Sub 字数表示_Click()’「字数表示」ボタンを押したときのイベントプロシージャ
    
    Dim セル文字列 As String’変数を宣言。    
        セル文字列 = ActiveCell.Text’変数「セル文字列」にアクティブセルの値を代入。
        
        MsgBox ” このセルは、 ” & LenB(StrConv(セル文字列, vbFromUnicode)) & _
        ” バイトあります。 ” & vbCrLf & vbCrLf & セル文字列’ActiveCellの文字列のバイト数を表示する。
    
    End Sub

———————————————————————————————————-

※注)試しにOffice365で調べてみると、実際には第9巻「葵」では46,452バイトありますので、最新バージョンではさらに容量が増えているようです。サンプルファイルで「字数表示」ボタンを押したときに出るバイト数と「セル表示」フォームで開いたときのテキストボックスのバイト数がくい違っていますが、後者が正しい数字です。どうやらセルに表示される字数には上限があるようです。 

———————————————————————————————————–

サンプルファイルはこちらからダウンロードすることが出来ます。

∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞

​「源氏物語」全巻が収められたシート。

​「源氏物語」全巻が収められたシート。

セルを選択して「セル表示」ボタンを押したところ。

セルを選択して「セル表示」ボタンを押したところ。

「更新ボタン」を押したところ。

「更新ボタン」を押したところ。

NO IMAGE