TextBoxに数字のみ入力させる 【VBA在庫管理#33】

Excel VBA 部品在庫管理アイキャッチ画像部品在庫管理

やっとアベノマスク届きました、どうもoReです。

今回は、テキストボックスに入力規制していきます。

IME Mode

IMEってあれです、あれ

  ↓これw

IME画像

 

ひらがなにしたり、英数にしたりするやつね。

まずは、このIMEを規制しちゃいます。

 

IMEModeの構文

Object.IMEMode[= fmIMEMode ]

 

fmIMEMode一覧

定数動作
fmIMEModeNoControl0IMEを制御しない(デフォ)
fmIMEModeOn1IMEオン(日本語モード)
fmIMEModeOff2IMEオフ(英語モード)
fmIMEModeDisable3IMEオフ(無効)
fmIMEModeHiragana4IMEオン(全角ひらがな)
fmIMEModeKatakana5IMEオン(全角カタカナ)
fmIMEModeKatakanaHalf6IMEオン(半角カタカナ)
fmIMEModeAlphaFull7IMEオン(全角英数字)
fmIMEModeAlpha8IMEオン(半角英数字)

 

IMEを無効にするfmIMEModeDisableを使用します。

・Disable ディィセェィブル

Disableは、『無効にする』という意味みたいです。

 

コードで書く場合

UserForm_Initializeに書きます。

  ↓こんな感じ

Private Sub UserForm_Initialize()
    TextBox1.IMEMode = fmIMEModeDisable 'IMEを無効にするよ
End Sub

  ↓もしくは

Private Sub UserForm_Initialize()
    TextBox1.IMEMode = 3 'IMEを無効にするよ
End Sub

 

VBEで設定する場合

TextBox1を選択プロパティのIME Mode
3 – fmIMEModeDisableを設定

IMEプロパティ設定画像

動作確認してみてください。

半角英数になり、ひらがなに変更できなくなりましたか?

oReのぞき見

KeyPressプロシージャ

・Press プレェス

Pressは、押す』という意味みたいです。

 

まあ、キーをおっぺすと発動するプロシージャってことです。

おっぺす?という方のためにw

おっぺすをググると、千葉の方言だったり埼玉の方言だったりまちまちなのね。

いやいや…九州の方言じゃね!?
わたくし高校生のころ九州にいましたが、普通に使ってましたけど…

意味合いは、『押し倒す』的な使い方でしたね。

よく女子をおっぺしてビンタくらってましたから、多分間違いありません。

 

では、さっそく使ってみましょう。

オブジェクトをTextBox1プロシージャをKeyPress

KeyPressプロシージャ画像

 

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

End sub

 

ついでに、KeyDownプロシージャも入れて違いをみましょうか。

  ↓こんな感じ

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    MsgBox "KeyDown" & KeyCode
End Sub
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    MsgBox "KeyPress" & KeyAscii
End sub

これで、いろんなキーをポチポチおっぺしてみてください。
※ビンタに注意

なんとなく、違いがわかりましたかね?

 

KeyDownとKeyPressの違い

・返り値が違う

KeyDownは、押されたキーの『KeyCode』を返す
KeyPressは、押されたキーの『KeyAscii』を返す

※Ascii アスキィー 詳しくはググってね。

 

・発動条件が違う

KeyDownは、全てのキーで発動する
KeyPressは、入力キーのみで発動する
※Enterキーや、Shiftキーなどの制御キーでは発動しない

 

という事で、KeyPressプロシージャを使用して、
入力キーのみに規制しましょう。

KeyDownプロシージャは消しちゃってください。

 

数字キー以外規制

数字キーの返り値を調べると

数字キー返り値 ※Asciiコード
048
149
250
351
452
553
654
755
856
957

このように返ってきますね。

では、どの入力キーをおっぺしても『9』が入力されるようにしてみましょう。

  ↓こんな感じ

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = 57 'キーをおっぺしたら9キーをおっぺした事にするよ
End Sub

9しか入力されなくなりましたか?

oReのぞき見

では、KeyAsciiに0を入れてみましょう。

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = 0
End Sub

入力できなくなりましたか?

0は、どのキーにも割り付けられていない為、
なにもキーをおっぺしてないのと同じ事になります。

 

あとは、条件分岐で返り値の48~57以外を規制してあげればOKです。

  ↓こんな感じ

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii < 48 Then 'Asciiが48より小さい場合
        KeyAscii = 0
    ElseIf KeyAscii > 57 Then 'Asciiが57より大きい場合
        KeyAscii = 0
    End If
End Sub

ちゃんと、数字キーのみしか入力できなくなりましたか?

oReのぞき見

Or・And演算子

・Or オァ ・And アンドゥ

Orは、『又は』という意味みたいです。

Andは、『そして』という意味みたいです。

 

OrとAndの使い方は

If 条件1 Or 条件2 Then
条件1 又は 条件2
どちらかの条件を満たしていたら
If 条件1 And 条件2 Then
条件1 そして 条件2
どちらの条件も満たしていたら

といった使いかたをします。

 

  ↓こんな感じに変更

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii < 48 Or KeyAscii > 57 Then 'Asciiが48より小さい又は、57より大きい場合
        KeyAscii = 0
    End If
End Sub

  ↓もしくは

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0 'Asciiが48より小さい又は、57より大きい場合
End Sub

ちゃんと入力規制掛かってますか?

oReのぞき見

まとめ

IMEの構文
Object.IMEMode[= fmIMEMode ]
IMEを無効 fmIMEModeDisable
KeyPressプロシージャ
入力キーのみで発動し、キーの『KeyAscii』を返す
Or演算子
どちらかの条件を満たしていたら
And演算子
どちらの条件も満たしていたら

アベノマスクoRe心の俳句

次回 フォーム上で画像を表示させてみるよ

ExcelVBA部品在庫管理【目次】へ戻る

コメント

  1. hase より:

    すいません、、、出庫したい数が在庫より多い場合に警告を出したいです。。。
    If文をつくりましたがうまくいきませんでした。

    どこかに

    If Knskcell.Offset(0, 3) < TextBox3 Then
      msg的で在庫より多いです的なメッセージ
    Else
      実行プログラム
    Endif 
    

    入れればいいと思いますが、、、あてはめた場所が悪いのか
    全部在庫より多いですと言われてしまいました。。。
    もしわかれば、、、ご教授頂ければ幸いです。

    Private Sub CommandButton2_Click()
      Dim Knskcell As Range
      Dim Noproduct As String
    
      If ComboBox1 = "" Then
           MsgBox "入出庫名を入力してください"
        ElseIf TextBox2 = "" Then
           MsgBox "バーコードデータを入力してください"
        ElseIf TextBox3 = "" Then
           MsgBox "個数を入力してください"
        Else
        
            If IsNumeric(TextBox3) = True Then
            Else
                MsgBox "数字のみ入力してください。"
                TextBox3 = 0
            End If
        
            Set Knskcell = Range("C:C").Find(what:=TextBox2, lookat:=xlWhole)
            Noproduct = "部品が登録されていません。"
            
                If Knskcell Is Nothing Then
                    MsgBox Noproduct
                Else
                    Knskcell.Offset(0, 3) = Knskcell.Offset(0, 3) - TextBox3
                    With Worksheets("入出庫履歴")
                    .Rows(Rows.Count).Delete  '最終行を削除
                    .Rows(3).Insert
                    .Range("B3") = Now
                    .Range("C3") = ComboBox1
                    .Range("D3") = Knskcell.Offset(0, -1)
                    .Range("E3") = Knskcell.Offset(0, 1)
                    .Range("F3") = Knskcell.Offset(0, 2)
                    .Range("G3") = TextBox3 * 1
                    .Range("H3") = "出庫"
                    End With
                    Call UserForm_Initialize  'ユーザーフォームを初期化するよ
                    MsgBox "出庫しました。"
                End If
            
            With Knskcell
            .Offset(0, 6) = .Offset(0, 3) - .Offset(0, 4)  '過剰在庫数=在庫数-最大在庫数
             If .Offset(0, 6) < 0 Then .Offset(0, 6) = 0  '過剰在庫数が0より小さい場合0
            
            .Offset(0, 7) = .Offset(0, 5) - .Offset(0, 3)  '在庫不足数=最少在庫数-在庫数
              If .Offset(0, 7) < 0 Then .Offset(0, 7) = 0  '過剰在庫数が0より小さい場合0
            
            .Offset(0, 8) = .Offset(0, 4) - .Offset(0, 3)  '部品注文数=最大在庫数-在庫数
              If .Offset(0, 8) < 0 Then .Offset(0, 8) = 0  '過剰在庫数が0より小さい場合0
            End With
    
        End If
    End Sub
    
    • oReoRe より:

      hase様
      はじめまして。
      コメントありがとうございます。

      >あてはめた場所が悪いのか
      全部在庫より多いですと言われてしまいました

      あてはめた場所ではなくて、
      比較演算がうまくいってない様です。

       

      比較演算する場合も

      基本的に 数値 < 数値

       

      If Knskcell.Offset(0, 3) < TextBox3 Then
      

      上記のTextBox3は『文字列』なので、
      『数値』にしてあげれば比較演算できると思います。

      ・Val(TextBox3)

      もしくは、

      ・TextBox3 * 1

       

      ↓こんな感じです

      If Knskcell Is Nothing Then
        MsgBox Noproduct
      ElseIf Knskcell.Offset(0, 3) < Val(TextBox3) Then
        MsgBox "在庫より多いです"
        TextBox3 = ""
      Else
       省略
      End If
      
  2. HASE より:

    遅くなり申し訳ありません!
    ありがとうございます!
    おっしゃったとおりに変更したところうまく演算してくれました!

    大変感謝しております!

  3. yukie より:

    プログラム超超超初心者です
    #35まで同じように出来て感動しています。

    上のコメントをみまして、あたしも警告文をいれたいのですが、、、
    今までの中でどこを変えたらいいのかご教示頂けますと助かりますm(__)m
    すみません汗

    あと、バーコードがすでに登録されている場合、二重登録を防ぐ方法はありますか?

    オレグラミングをめちゃくちゃ頼りにしておりまして(//∇//)
    お返事と続きもお待ちしています♡

    • oReoRe より:

      yukie様
      はじめまして。
      コメントありがとうございます。

      >今までの中でどこを変えたらいいのか…

       

      ↓このへんですかね

      '入出庫処理
      Private Sub NyuSyukko(ByVal NS As String)
        Dim Knskcell As Range
      
        If ComboBox1 = "" Then
          MsgBox "入出庫者名を入力してください。"
        ElseIf TextBox2 = "" Then
          MsgBox "バーコードデータを入力してください。"
        ElseIf TextBox3 = "" Then
          MsgBox "個数を入力してください。"
        Else
          Set Knskcell = Range("C:C").Find(what:=TextBox2, lookat:=xlWhole)
      
          If Knskcell Is Nothing Then
            MsgBox "部品が登録されていません。"
          Else
            If NS = "入庫" Then
              Knskcell.Offset(0, 4) = Knskcell.Offset(0, 4) + TextBox3
            ElseIf NS = "出庫" Then
              '在庫数より多い場合
              If Knskcell.Offset(0, 4) < Val(TextBox3) Then
                MsgBox "在庫より多いです。"
                TextBox3 = ""
                Exit Sub
              Else
                Knskcell.Offset(0, 4) = Knskcell.Offset(0, 4) - TextBox3
              End If
            End If
            省略
            Call UserForm_Initialize
            MsgBox NS & "しました。"
          End If
        End If
      End Sub
      

       

      >バーコードがすでに登録されている場合、二重登録を防ぐ方法はありますか?

       

      ↓こんな感じにTourokuフォームに追加ですかね

      Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        Dim Knskcell As Range
      
        'バーコード二重登録防止処理
        If KeyCode = 13 And TextBox1 <> "" Then 'enterキーかつ、TextBox1が空じゃない場合
          Set Knskcell = Sheet1.Range("C:C").Find(what:=TextBox1, lookat:=xlWhole)
          If Not Knskcell Is Nothing Then
            MsgBox "このバーコードは既に登録されてます。"
            TextBox1 = ""
          End If
        End If
      End Sub
      

       

      多分…(*ノωノ)

  4. yukie より:

    お忙しい中、お返事ありがとうございます

    今、上記のコードを早速入力して、試してみました。
    動作確認できました!!!
    素晴らし過ぎて、感動しております( ;∀;)
    本当にありがとうございますm(__)m

    続きも楽しみにしております♪

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