前書き
UserFormからセルを操作する3、TextBoxの活用
■前回までは、フォームの起動回数を確認してラベル表示するところまでやりました。変数の宣言やMsgBoxの簡単な使い方、文字列の結合や扱いなども練習しました。
■ 今回からは、例として、人事関連の氏名データベースで名前項目に氏名を転送する場面を想定してフォームのテキストボックスに名前を入力してその値をシートの特定の列に転記する処理を考えてみます。
■その前に、今回からはコードの内容を少し変更しておきます。
内容:ブックが開いたときフォームを開く設定を変更して、シート1のシート上に貼り付けたコマンドボタンでフォームが開くように変更しました。あと起動回数を確認するメッセージもいちいち表示しないようにしました。
コードのコメント化
■せっかく書いたコードですが処理内容を変更する場合、コードを消してしまうのではなくコメント化していつでも元に戻せるようにしておくことにしておきます。
■コメント化は簡単です。そのコード行の先頭にアポストロフィー(’)を付けるだけです。アポストロフィーを消すと元のコードに戻ります。その行のアポストロフィーから右側にある文字列がすべてコメントとみなされます。
■下図ではブックがオープンするときにフォームを開くコードをコメント化しています。
■下図では、フォームが開く前に起動回数を確認するメッセージが表示しないようにコメント化してます
シートにコマンドボタンを貼り付ける
■初めてVBAを使うときはExcelには開発タブが準備されていません。
リンク集に開発タブの登録方法を書いておきましたので、下のカードを参考にして開発タブを登録してください。
設定した開発タブから挿入をクリックします。シートに貼り付け用のコントロールのメニューが二段になって開くので、下段のActiveXコントロールから赤丸囲みのボタンをクックします。
■シートに戻るとマウスポインタが + の形状になるので、それをシートの適当なセル位置でマウスの左ボタンクリックしたまま適当な大きさになるよう引きずって四角形にしたところで指を離すとCommmandButton1と書いたボタンが配置できたと思います。
■張り付いたボタンを右クリックしたメニューからプロパティー(I)を選択します。
■コマンドボタン用のプロパティー一覧が開くので
Caption(キャプション)項目でCommmandButton1と書かれているのをフォーム開くと書き換えます。
■以上で準備が終わったところで、一旦上書き保存します。
(開いているプロパティーウインドウは右上の×ボタンで閉じます。)
■保存したらブックを閉じて、再度開いてみましょう。
以前の様にブックを開いても何も起きないと思います。たださっき作ったコマンドボタンが一個あるだけです。
コマンドボタンをクリックすると、前のように確認のメッセージは表示しないでダイレクトにフォームが開きます。起動回数はインクリメントされていますね。
フォームは×ボタンで閉じます。
■以上で今回のテーマに取り掛かる準備が整いました
TextBox活用の概要
フォームに貼り付けたテキストボックスにテスト用に適当な氏名を入力します。
フォームのコマンドボタンをクリックするとテキストボックスの値をシートのB列に転記します
前準備1
①Sheet1の一行目にデータベースの項目をセットします
A列に 登録番号
B列に 氏名
C列に よみ
それぞれ背景色を薄いグレーにしておきます
■コマンドボタン背景色も見やすい色に変更しておきます
Excelのメニューバーから②三角定規のアイコンを探してクリックします
コマンドボタンの右クリックメニューからプロパティーを選択。
プロパティー一覧からBackColorの項目で④の▼ボタンをクックします。
②三角定規のアイコンが見つからない場合は下のカードを参照してください
パレットタブを選択するとカラーパレットが開くので、お好きな色をクリックします。
前準備2
フォームのデザインモードでテキストボックスで漢字入力ができるようにします。
■テキストボックスを選択してプロパティーウインドウからIMEMode項目を探して右端の▼ボタンをクリックしたらリストから4を選択します。(これだけです)もちろんコードでも設定できます。
コードでセットするときはフォームのイベントイニシャライズプロシージャに次の一行を加えておきます。
Me.TextBox1.IMEMode = fmIMEModeHiragana
プログラムの作成
前準備が終わったのでいよいよプログラムに取り掛かります
■プログラムの全体です。
'テキストボックスに入力した氏名の情報をデータベースに転記する処理 Private Sub CommandButton1_Click() Dim setNumb As Integer Dim yomi As String Dim simei As String Dim lastgyou As Integer '各変数に値をセット With Sheet1 '氏名が入力されている最終行を取得 lastgyou = .Cells(Rows.Count, "A").End(xlUp).Row '入力された氏名を取得 simei = Me.TextBox1.Value 'simeiのよみがなを取得 yomi = Application.GetPhonetic(simei) '登録番号を取得 'If Left(.Cells(lastgyou, "A"), 1) = "登" Then If .Cells(lastgyou, "A") = "登録番号" Then setNumb = 1 Else setNumb = .Cells(lastgyou, "A") + 1 End If '変数に値を入れるはここで終り====================== ' ' '取得した各値をシートに転記する ' .Cells(lastgyou + 1, 1) = setNumb ' .Cells(lastgyou + 1, 2) = simei ' .Cells(lastgyou + 1, 3) = yomi Dim i As Integer Dim atai As Variant '変数に取得した値を配列変数に格納 (■ 配列は0から始まるので注意 ) atai = Array(setNumb, simei, yomi) For i = 1 To 3 .Cells(lastgyou + 1, i) = atai(i - 1) Next i End With '後始末 TextBox1 = "" TextBox1.SetFocus End Sub
コードを変更しました
下のカードを参照してください。ファンクションプロシージャの使い方に合わせてより簡潔にプログラムできるよう改善しました。動き的には全く変わりないです。
ここから下の解説もそのまま残しておきます。どちらを使ってもOKです。
コードはどこに書くの
コマンドボタンをダブルクリックするとCommandButton1_Click()とあるSubプロシージャができますのでそこにコードを記述します。
コード前半部分
■前半ではコマンドボタンを押したとき、データベースに転記する情報を変数に格納する内容です。
データベース用、項目用の変数
Dim setNumb As Integer ’登録番号
Dim yomi As String ’よみ
Dim simei As String ’氏名
どの行に書き込むかの手掛かりになる、データが存在する最終行の位置をしめす変数
Dim lastgyou As Integer
■各変数に値をセットします
‘氏名が入力されている最終行を取得
lastgyou = .Cells(Rows.Count, “A”).End(xlUp).Row
‘入力された氏名を取得
simei = Me.TextBox1.Value
‘入力したsimeiが持つよみがな情報を取得(GetPhonetic(~)は~が持つ読み仮名情報を返すVBAの関数です)
yomi = Application.GetPhonetic(simei)
■ここまではそんなに難しくないですね。
‘登録番号を取得
(ここは少しややこしいですが条件判断をして登録番号を生成する工程を考えます)
’A列の最後の入力済みデータがあるセルのデータを取り出す
そのデータの左側から1文字目が”登”であるなら、それは項目名なので氏名データは無いので新しい1行目だと判断して1を代入する
”登”でないなら、すでに1以上の数値があるはずなので、そのセルの値に1を加算して変数に代入するという意味です。
‘If Left(.Cells(lastgyou, “A”), 1) = “登” Then
Left関数は使わず、セルの値全体を対象に判断するように変更した
If .Cells(lastgyou, “A”) = “登録番号” Then
setNumb = 1
Else
setNumb = .Cells(lastgyou, “A”) + 1
End If
■もう一つちょっと便利な使い方を
コード後半部分
■前半で準備した変数の値をシートのデータベース用のセルに転記する内容の解説です。
ここではデータベースが3列だけで単純ですから普通に3行のコードを書けばいいのですが
データベースが何十列とある場合はその列数分書くのは実用的ではないのでFor~Nextの繰り返し処理を使った書き方をしてみます。
‘変数に取得した値を配列変数に格納 (■ 配列は0から始まるので注意 )
atai = Array(setNumb, simei, yomi)
■0から始まるの意味は配列ataiのインデックスのことです
atai(0) には変数setNumbに入った値
atai(1) には変数simeiに入った値
atai(2) には変数yomiに入った値
■ Forで使う変数 i には1~3までの数値が繰り返し入りますが、配列のataiに対しては0から始まるので1を引く必要があります
For i = 1 To 3 ’繰り返たび変数 i に1~3が順に入り3回繰り返す処理
.Cells(lastgyou + 1, i) = atai(i – 1)
Next i
仕上げテスト
コードの入力が終わったら、早速てすとしてみましょう。
ここでは4人の適当な氏名を入力して、一人ずつ入力後下のボタンを押します。
データベースの項目の下に氏名とよみが転記できました。
順次コマンドボタンを押すごとに入力氏名が転記されていくのが確認できるはずです。
■以上うまくいったでしょうか?
上手く動作しなかったらコードをよく見直してください。どこか一文字でも間違えたらだめです。
■この回はこれで終わります。次回はコンボボックスのつかいかたを解説します。
■ Forの解説をとばしてしまいましたが、別の回で解説しますので、今回は単純な繰り返しなのでなんとなくわかったくらいでいいのです。まず最初はコピペしてコードを貼り付けして動かしてみてください。早く知りたい人はネットで ”VBA Forの使い方” などと検索してください。
エラー処理について
ファンクションプロシージャの使い方
コードの前半部分~ 後半部分までの処理をFuncionプロシージャを使って同じ動作ができる処理に改善しました。ファンクションプロシージャの使い方も合わせて下のカードから見てください
コメント