【ExcelVBA】セルとテキストボックスを相互に連動させる方法
更新日:2023/12/01
Excelでセルとテキストボックスを連動させて、セルの内容を変更したらテキストボックスに反映させたり、その逆にテキストボックスの内容を変更したらセルの内容を変更させる方法を紹介します。
テキストボックスの種類
Excelは、次のような異なる種類のテキストボックスを設置できます。
- 挿入タブの図形で作成したテキストボックス ▶テキストボックス(図形)の場合
- 開発タブの挿入で作成したActiveXテキストボックス ▶開発タブのテキストボックスの場合
- VBエディタのユーザーフォームに設置したテキストボックス ▶テキストボックス(ユーザーフォーム)の場合
他にもあるかもしれませんが、今回は上記の三つのテキストボックスを対象にして、セルとテキストボックスを相互に連動させる方法を紹介します。
テキストボックス(図形)の場合
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イベントに対応するプロシージャが生成されます。
テキストボックスのvalue値を、セルにセットするコードを記述します。
Private Sub TextBox1_Change()
Range("C1").value = TextBox1.value
End Sub
次にエディター上部のセレクトボックスを操作して、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プロパティにシート名を含めたセルアドレスを入力します。
例: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
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。