シートへ書き出す(その1:基礎)では、フォーム上のひとつのテキスト・ボックスの値をシート上のセルに書き出すようにプログラムしました。
ここでは応用として、フォーム上の複数のテキスト・ボックスの値を書き出すようプログラムします。さらに、その内容を検討し、別解を表します。 |
| フォーム |
例として次のようなフォームを作成する。ここはシートへ書き出す(その1:基礎)と同じ。

| オブジェクト名 |
| フォーム |
Test |
| テキストボックス(上から) |
Text1、Text2 |
| ボタン(上から) |
Button1、Button2 |
|
| プログラム |
次の内容を、プログラム入力ウィンドウに入力する。《プログラム1》とする。
Option Explicit
Private Sub Button1_Click()
Dim SheetName As String
Dim CellName1 As String
Dim CellName2 As String
SheetName = "Sheet1"
CellName1 = "a1"
CellName2 = "a2"
Sheets(SheetName).Range(CellName1) = Me.Text1.Value
Sheets(SheetName).Range(CellName2) = Me.Text2.Value
End Sub
Private Sub Button2_Click()
Dim SheetName As String
Dim CellName1 As String
Dim CellName2 As String
SheetName = "Sheet1"
CellName1 = "c1"
CellName2 = "c2"
Sheets(SheetName).Range(CellName1) = Me.Text2.Value
Sheets(SheetName).Range(CellName2) = Me.Text1.Value
End Sub
|
|
| 実行 |
フォームを実行し、上のテキスト・ボックスに適当な文字を入力し、上のボタン(処理1)を押す。

シート上のセル A1 にフォーム上の TextBox1に入力した文字が
シート上のセル A2 にフォーム上の TextBox2に入力した文字が
それぞれ書き出される。

さらに、下のボタン(処理2)を押すと
シート上のセル C1 にフォーム上の TextBox2に入力した文字が
シート上のセル C2 にフォーム上の TextBox1に入力した文字が
それぞれ書き出される。
 |
| 別解 |
上記プログラムを眺めていると、気付くことがある。それは2つのプロシージャで同じような変数を使用していること。この場合、このように書き換えることも出来る。《プログラム2》とする。
Option Explicit
Dim SheetName As String
Dim CellName1 As String
Dim CellName2 As String
Private Sub Button1_Click()
SheetName = "Sheet1"
CellName1 = "a1"
CellName2 = "a2"
Sheets(SheetName).Range(CellName1) = Me.Text1.Value
Sheets(SheetName).Range(CellName2) = Me.Text2.Value
End Sub
Private Sub Button2_Click()
SheetName = "Sheet1"
CellName1 = "c1"
CellName2 = "c2"
Sheets(SheetName).Range(CellName1) = Me.Text2.Value
Sheets(SheetName).Range(CellName2) = Me.Text1.Value
End Sub
|
《プログラム1》との違いは文字列変数の定義がプロシージャの外にある、ということ。このように記述すると、この文字列変数がこのフォームのプログラム中でどこでも使うことが出来るようになる。
《プログラム1》のように変数を定義すると、そのプロシージャ内だけで有効な変数となり、そのプロシージャ以外では定義されていないことになる。
とすると《プログラム2》の方が便利に思える。確かに、これだけ小さなプログラムならどちらでも良いかも知れない。しかし、これが数百行にもわたるプログラムで、プロシージャも数十個になるようなものだと、その変数にどこで代入しているのか分からなくなり、プログラムした自分でもどこで書き換えているのかが分からなくなることがある。
出来るだけ《プログラム1》のように記述することをお勧めする。
ただし、そのフォームのプログラムの中で値を変えない、いわゆる定数のように使用する場合はその限りではない。その場合、プロシージャの外で定義する方法でないと、非常に面倒になることがある。 |