小規模老人保健施設の給食業務向けExcelVBA練習帳、給食帳票管理にVBAを活用、UserFormからセルを操作する3、TextBox

Excel VBA

前書き

Excel初心者向けVBA練習帳シリーズではVBAのプログラム記述においては、VBAを知らないほんとの初心者を対象に記事を書いています。
そのため、プログラムの構造や書き方に非常に回りくどい冗長なところが多くあります。
自分自身もVBAは多少長く経験はありますが、独学で習得しているので間違って覚えている部分や上手くできていないところも多くありますから、プログラムについては動作確認の上記事に掲載しております。それでもバグやエラーが発生する場面もあろうかと思います。その時はお気軽にお問い合わせいただくなどお願いいたします。

UserFormからセルを操作する3、TextBoxの活用

■前回までは、フォームの起動回数を確認してラベル表示するところまでやりました。変数の宣言やMsgBoxの簡単な使い方、文字列の結合や扱いなども練習しました。

■ 今回からは、例として、人事関連の氏名データベースで名前項目に氏名を転送する場面を想定してフォームのテキストボックスに名前を入力してその値をシートの特定の列に転記する処理を考えてみます。

■その前に、今回からはコードの内容を少し変更しておきます。

内容:ブックが開いたときフォームを開く設定を変更して、シート1のシート上に貼り付けたコマンドボタンでフォームが開くように変更しました。あと起動回数を確認するメッセージもいちいち表示しないようにしました。

コードのコメント化

■せっかく書いたコードですが処理内容を変更する場合、コードを消してしまうのではなくコメント化していつでも元に戻せるようにしておくことにしておきます。

■コメント化は簡単です。そのコード行の先頭にアポストロフィー(’)を付けるだけです。アポストロフィーを消すと元のコードに戻ります。その行のアポストロフィーから右側にある文字列がすべてコメントとみなされます。

■下図ではブックがオープンするときにフォームを開くコードをコメント化しています。

■下図では、フォームが開く前に起動回数を確認するメッセージが表示しないようにコメント化してます

シートにコマンドボタンを貼り付ける

■初めてVBAを使うときはExcelには開発タブが準備されていません。

リンク集に開発タブの登録方法を書いておきましたので、下のカードを参考にして開発タブを登録してください。

小規模老人保健施設の給食業務向けExcelVBA練習帳、給食帳票管理にVBAを活用、リンク集1、三角定規アイコン、デザインモードの設置、開発タブの設置の方法
■リンク集 デザインモード(三角定規風アイコン)をツールバーに登録 三角定規アイコンが見つからないとき" ■デザインモードにする三角定規のアイコンは初期設定ではメニューバーに無いのでアイコンを追加で―メニューバーに登録するやり方です。...

設定した開発タブから挿入をクリックします。シートに貼り付け用のコントロールのメニューが二段になって開くので、下段のActiveXコントロールから赤丸囲みのボタンをクックします。

■シートに戻るとマウスポインタが + の形状になるので、それをシートの適当なセル位置でマウスの左ボタンクリックしたまま適当な大きさになるよう引きずって四角形にしたところで指を離すとCommmandButton1と書いたボタンが配置できたと思います。

■張り付いたボタンを右クリックしたメニューからプロパティー(I)を選択します。

 

■コマンドボタン用のプロパティー一覧が開くので

Caption(キャプション)項目でCommmandButton1と書かれているのをフォーム開くと書き換えます。

■以上で準備が終わったところで、一旦上書き保存します。

(開いているプロパティーウインドウは右上の×ボタンで閉じます。)

■保存したらブックを閉じて、再度開いてみましょう。

以前の様にブックを開いても何も起きないと思います。たださっき作ったコマンドボタンが一個あるだけです。

コマンドボタンをクリックすると、前のように確認のメッセージは表示しないでダイレクトにフォームが開きます。起動回数はインクリメントされていますね。

フォームは×ボタンで閉じます。

■以上で今回のテーマに取り掛かる準備が整いました

TextBox活用の概要

フォームに貼り付けたテキストボックスにテスト用に適当な氏名を入力します。

フォームのコマンドボタンをクリックするとテキストボックスの値をシートのB列に転記します

前準備1

Sheet1の一行目にデータベースの項目をセットします

A列に 登録番号

B列に 氏名

C列に よみ

それぞれ背景色を薄いグレーにしておきます

■コマンドボタン背景色も見やすい色に変更しておきます

Excelのメニューバーから三角定規のアイコンを探してクリックします

コマンドボタンの右クリックメニューからプロパティーを選択。

プロパティー一覧からBackColorの項目で④の▼ボタンをクックします。

三角定規のアイコンが見つからない場合は下のカードを参照してください

小規模老人保健施設の給食業務向けExcelVBA練習帳、給食帳票管理にVBAを活用、リンク集1、三角定規アイコン、デザインモードの設置、開発タブの設置の方法
■リンク集 デザインモード(三角定規風アイコン)をツールバーに登録 三角定規アイコンが見つからないとき" ■デザインモードにする三角定規のアイコンは初期設定ではメニューバーに無いのでアイコンを追加で―メニューバーに登録するやり方です。...

パレットタブを選択するとカラーパレットが開くので、お好きな色をクリックします。

前準備2

フォームのデザインモードでテキストボックスで漢字入力ができるようにします。

■テキストボックスを選択してプロパティーウインドウからIMEMode項目を探して右端の▼ボタンをクリックしたらリストからを選択します。(これだけです)もちろんコードでも設定できます。

コードでセットするときはフォームのイベントイニシャライズプロシージャに次の一行を加えておきます。

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

 

コードを変更しました

下のカードを参照してください。ファンクションプロシージャの使い方に合わせてより簡潔にプログラムできるよう改善しました。動き的には全く変わりないです。

小規模老人保健施設の給食業務向けExcelVBA練習帳、給食帳票管理にVBAを活用、UserFormからセルを操作する4、Function関数
前書き Excel初心者向けVBA練習帳シリーズではVBAのプログラム記述においては、VBAを知らないほんとの初心者を対象に記事を書いています。 そのため、プログラムの構造や書き方に非常に回りくどい冗長なところが多くあります。何を隠そう...

ここから下の解説もそのまま残しておきます。どちらを使っても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

■ If関数の使い方
If 比較式 Then
~A
Else
~B
End If■例
If A+5=10 Then
 MsgBox ”A=5である”
Else
 MsgBox ”A=5ではない”
End If■あんまり適当ではないけどコードの意味としてはOKかな?
ほかにもいろんな使い方があるのですがここでは簡単な説明で終わりにします。詳しく知りたいときはネットで検索してくださいね。

■もう一つちょっと便利な使い方を

■With の使い方
With オブジェクト ここに、オブジェクトを省略してプロパティーを利用できるEnd With■普通に書く例、lastgyou =Sheet1.Cells(Rows.Count, “A”).End(xlUp).Row■Withを使った例、
With Sheet1
‘氏名が入力されている最終行を取得
lastgyou = .Cells(Rows.Count, “A”).End(xlUp).Row
End With■コードが一行だけなら意味ないけど複数行書くときは非常に楽です
(オブジェクトを省略できるだけなので、ドット(.)は忘れないように)
■変数の準備はこれでOKですね

コード後半部分

■前半で準備した変数の値をシートのデータベース用のセルに転記する内容の解説です。

ここではデータベースが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の繰り返し処理を使うとその行が何百何千あろうと1行のコードで表現できるので他の場面でも多様されます。

For i = 1 To 3    ’繰り返たび変数 i に1~3が順に入り3回繰り返す処理

.Cells(lastgyou + 1, i) = atai(i – 1)

Next i

仕上げテスト

コードの入力が終わったら、早速てすとしてみましょう。

ここでは4人の適当な氏名を入力して、一人ずつ入力後下のボタンを押します。

データベースの項目の下に氏名とよみが転記できました。

順次コマンドボタンを押すごとに入力氏名が転記されていくのが確認できるはずです。

■以上うまくいったでしょうか?

上手く動作しなかったらコードをよく見直してください。どこか一文字でも間違えたらだめです。

■この回はこれで終わります。次回はコンボボックスのつかいかたを解説します。

■ Forの解説をとばしてしまいましたが、別の回で解説しますので、今回は単純な繰り返しなのでなんとなくわかったくらいでいいのです。まず最初はコピペしてコードを貼り付けして動かしてみてください。早く知りたい人はネットで ”VBA Forの使い方” などと検索してください。

エラー処理について

ここまでの氏名を登録するプログラムにはエラーが起きる可能性がある部分があり対策する必要があります。例えば同姓同名がある場合でも登録できてしまうため後々何らかのエラーが起きる可能性がある、氏名を入力途中でも、空白でも登録できる、直接シートのセルに直接書き込みができる。などなどほかにもありそうです。本来そうしたあらゆる場面を想定してエラー処理をするべきですが、ここではまだそこまでの処理をしていません。エラー処理に関しては別の機会にしたいと思いますので今回は、ま、”こんな風にやるのか!” 程度で体感していただければと思います。

ファンクションプロシージャの使い方

コードの前半部分~ 後半部分までの処理をFuncionプロシージャを使って同じ動作ができる処理に改善しました。ファンクションプロシージャの使い方も合わせて下のカードから見てください

小規模老人保健施設の給食業務向けExcelVBA練習帳、給食帳票管理にVBAを活用、UserFormからセルを操作する4、Function関数
前書き Excel初心者向けVBA練習帳シリーズではVBAのプログラム記述においては、VBAを知らないほんとの初心者を対象に記事を書いています。 そのため、プログラムの構造や書き方に非常に回りくどい冗長なところが多くあります。何を隠そう...

コメント

タイトルとURLをコピーしました