Excel

【ExcelVBA】セルとテキストボックスを相互に連動させる方法

更新日:2023/12/01

Excelでセルとテキストボックスを連動させて、セルの内容を変更したらテキストボックスに反映させたり、その逆にテキストボックスの内容を変更したらセルの内容を変更させる方法を紹介します。

 

テキストボックスの種類

Excelは、次のような異なる種類のテキストボックスを設置できます。


他にもあるかもしれませんが、今回は上記の三つのテキストボックスを対象にして、セルとテキストボックスを相互に連動させる方法を紹介します。

 

テキストボックス(図形)の場合

Excelシート上から図形として挿入できるテキストボックスは、セル参照で連動できます。

セル参照で連動

セルを他のセルで参照させるときと同じですね。

ただし参照なので、セルの値からテキストボックスへの一方通行です。
テキストボックスの値をセルに反映することはできません。

テキストボックスの参照先をVBAで変更するときは、テキストボックスを取得してDrawingObject.Formulaプロパティに参照先をセットします。

ActiveSheet.Shapes("テキスト ボックス 3").DrawingObject.Formula = "A3"

テキストボックスの名前は、テキストボックスを選択すると左上に表示されます。(上図参照)
ただし欄が狭く全て表示されていないのと、スペースが多用されていて分かりにくいので、名前欄からのコピペ推奨です。

なおこのテキストボックスはnameプロパティに別名を持っています。
そちらを名前として使用できます。

' 名前の確認
Debug.print ActiveSheet.Shapes("テキスト ボックス 3").name
>> TextBox 3

ActiveSheet.Shapes("TextBox 3").DrawingObject.Formula = "A3"

 

テキストボックス(ActiveX)の場合

ActiveXのテキストボックスとセルを連動させるときは、テキストボックスとセルの入力イベントを監視して、相互に値をセットします。

前提条件として、開発タブのデザインモードをクリックして、Excelをデザインモードにしておく必要があります。

デザインモード

次に、テキストボックスをダブルクリックします。
VBエディターが表示され、テキストボックスのChangeイベントに対応するプロシージャが生成されます。

テキストボックスのChangeイベントプロシージャ

テキストボックスのvalue値を、セルにセットするコードを記述します。

Private Sub TextBox1_Change()
    Range("C1").value = TextBox1.value
End Sub

次にエディター上部のセレクトボックスを操作して、WorrksheetのChangeイベントプロシージャを生成します。

WorrksheetのChangeイベントプロシージャ

WorrksheetのChangeイベントには、変更されたセルを特定して、目的のセルだったらテキストボックスに値をセットするコードを記述します。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$C$1" Then
        TextBox1.value = Target.value
    End If
End Sub

これでセルとテキストボックスを相互に連動できるようになります。

最後に、Excelをデザインモードを解除してからテストしてください。
解除しないと、イベントが発生しません。

 

テキストボックス(ユーザーフォーム)の場合

ユーザーフォームのテキストボックスとセルを連動させるときは、テキストボックスのControSourceプロパティにシート名を含めたセルアドレスを入力します。

テキストボックスのControSourceプロパティ

例:Sheet1!C1

ControSourceプロパティにアドレスを入力した時点で、テキストボックスの値が変化します。
存在しないシート名や正しくないアドレス形式を入力すると、エラーが表示されます。

VBAコードでユーザーフォーム内に設置されているコントロールのControSourceプロパティを変更するときは、次のように記述します。

TextBox1.ControlSource = "Sheet1!A4"

ユーザーフォーム外からControSourceプロパティを変更するときは、次のように記述します。

UserForm1.TextBox1.ControlSource = "Sheet1!A4"
' または
UserForm1.Controls("TextBox1").ControlSource = "Sheet1!A3"

VBAコードで変更したControSourceプロパティは、フォームをアンロードすると失われます。
再度表示すると、プロパティウインドウで設定したControSourceプロパティが使用されます。

更新日:2023/12/01

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。