マクロでいこう! ~ Excel活用HomePage ~

VBAでラクしたい ~Part 2~

こちらのコーナーでは、VBAの使い方を中心にご紹介していきます。
作者自身の経験から書いておりますので、本とかとは違ったコトを
書いてるトコロもあるかもしれません。 そういう場合は、良さそうな方を信じましょう(^_^;
TOPVBAでラクしたい ~Part 2~ > 書式を決めて入力しよう

書式を決めて入力しよう

今回はまたチョット戻って、フォームでの入力について考えてみましょう。

例えば「氏名」を入力する場合。たぶん漢字やひらがなを使って入力することがほとんどだと思い
ますが、今の状態ですといちいち日本語入力を起動しなければなりませんよね。

そして次に「E-Mailアドレス」の入力があります。そうするとまた日本語入力を解除して半角英数
にして・・・と、これは結構面倒な作業になってしまいます(^_^;)

ユーザーの入力作業をよりカンタンにするためには、この辺の配慮は欠かせませんね。ヽ(^-^ )

そのためには「特定のコントロールの入力時に日本語入力のOn/Offを自動で切り替える」という
処理を追加してやります。

処理と言いましても、コントロールのプロパティで設定するだけです。


まずは「氏名」テキストボックス(TxtName)をクリックします。

そしてプロパティの中の「IME Mode」を見てみましょう。今は「0- fmIMEModeNoControl」になって
いますよね。これはその内容の通り「制御ナシ」ということです。

ここではほとんど「漢字・ひらがな」を入力すると仮定して「4- fmIMEModeHiragana」にしておき
ましょう。試しにこの状態で起動してみて下さい。どうですか?「氏名」にカーソルを合わせると
日本語入力が自動的に起動してくれます d(^-^ )

同様に「E-Mailアドレス」はどうでしょう?
ここは「半角英数」で入力した方がスッキリしますよね(全角英数より・・・)
ということでここは「2- fmIMEModeOff」に設定しましょう。「誕生日」も同様の設定をしておき
ましょう。


さぁこれで快適入力環境が出来た! めでたしめでたし・・・なのか?(^_^;)


入力環境はこれで準備が整ったに過ぎません。ここでもう一つ決めておかねばない重要な要素が
あります。それは書式。

「氏名」は特に決まった形式が無いのでいいのですが、「日付」なんかは書こうと思えば色々な
パターンが考えられますよね(1999/01/01, 19990101, 1999.01.01, H11.1.1  etc...)
こういうデータが混在してはよろしくありませんので、ここでは "yyyy/mm/dd" の形に統一する
ことにいたしましょう(^-^;)

ある特定の形に統一するということは、当然それに当てはまらない値が入力された場合の対処も
考えなければなりません。そう! それがいわゆる入力チェックってやつです。

以前、未入力チェックだけは組み込みましたけど、今度は入力された文字列の内容を調べて、そ
れに対してメッセージを表示したりするわけですね。

とりあえずここでは2段階方式で考えてみます

【注:この方法はあくまで我流です。他に良い方法がございましたら、是非ご一報を】

まず初めに「入力された値が日付として認識できるかどうか」を調べます。
次に「文字列の長さは指定された通りか」を調べます。yyyy/mm/dd ですから / の記号を含めて
10文字ですよね。この長さに等しく且つ日付として認識できる値であれば、ここではOKとい
うことにいたします(^-^;)


では最初の処理を書きましょう。

値が日付かどうか、日付に変換可能な値かどうか調べるには IsDate関数を使いますヽ(^-^ )

IsDate(調べる文字列)

の結果が True であれば日付、False であれば、日付としては認められないということになりま
すので

    '日付に変換できる値かチェック
    If IsDate(TxtBirthday.Text) <> True Then
        MsgBox ("正しい日付を入力して下さい")
        Exit Sub
    End If

としておけばよいでしょう。

次に、指定された文字列の長さを調べるには Len関数を使います
#コレ前にやりましたっけ??(^_^;)??

Len(調べる文字列)

で、その文字列の文字数を返してくれますので

    '文字数が10文字かチェック
    If Len(TxtBirthday.Text) <> 10 Then
        MsgBox ("日付を yyyy/mm/dd の形式で入力して下さい")
        Exit Sub
    End If

と、すればいいと思います(^-^;)


この2つをセットにして「登録」「修正」それぞれの処理に追加してみましょう。

-----------------------------------------------------------------------------------

Private Sub CmdAddNew_Click()

Dim RetVal As Integer

    '*** 何も入力されていなければ、警告メッセージを表示 ***
    If Trim(TxtName.Text) = "" Then
        RetVal = MsgBox("氏名を入力して下さい", vbCritical, "入力エラー")
        TxtName.SetFocus
        Exit Sub
    End If
    If Trim(TxtEmail.Text) = "" Then
        MsgBox ("E-Mailアドレスを入力して下さい")
        TxtEmail.SetFocus
        Exit Sub
    End If
    If Trim(TxtBirthday.Text) = "" Then
        MsgBox ("誕生日を入力して下さい")
        TxtBirthday.SetFocus
        Exit Sub
    End If

    '*** 日付入力値整合チェック ***
    '日付に変換できる値かチェック
    If IsDate(TxtBirthday.Text) <> True Then
        MsgBox ("正しい日付を入力して下さい")
        Exit Sub
    End If
    
    '文字数が半角10文字かチェック
    If Len(TxtBirthday.Text) <> 10 Then
        MsgBox ("日付を yyyy/mm/dd の形式で入力して下さい")
        Exit Sub
    End If


    '*** 自動採番処理 ***
    Cells(LngRecRow, cRecNumCol).Value = LngCurRecNumDsp

    '*** データ登録処理 ***
    DataWrite
    
    '*** 行位置を下に移動 ***
    LngRecRow = LngRecRow + 1
    
    '*** テキストボックスの値クリア ***
    NoRecShow
    
    '*** 登録済のレコード件数取得(見出し行分除く) ***
    LngAllRecCnt = Range("A1").CurrentRegion.Rows.Count - 1
    '*** 表示用レコード数を変数にセット ***
    LngCurRecNumDsp = LngAllRecCnt + 1  '現在のレコード番号
    LngAllRecCntDsp = LngAllRecCnt + 1  '全レコード件数
    '*** レコード件数表示 ***
    TxtRecCnt.Text = LngCurRecNumDsp & "件目/全" & LngAllRecCntDsp & "件"

    
End Sub


Private Sub CmdUpdate_Click()

    '*** データ修正処理 ***
    DataWrite
    
    '*** 日付入力値整合チェック ***
    '日付に変換できる値かチェック
    If IsDate(TxtBirthday.Text) <> True Then
        MsgBox ("正しい日付を入力して下さい")
        Exit Sub
    End If
    
    '文字数が半角10文字かチェック
    If Len(TxtBirthday.Text) <> 10 Then
        MsgBox ("日付を yyyy/mm/dd の形式で入力して下さい")
        Exit Sub
    End If

End Sub

-----------------------------------------------------------------------------------


それでは次回までごきげんよぉ~(^^)/~


TOPVBAでラクしたい ~Part 2~
Copyright (C) 2006 マクロでいこう!. All Rights Reserved.