• 締切済み

Accessでのvbaについての質問

Accessでのvbaを使用したプログラムについてお聞きしたいです。前にも似たようなことを質問していましたが、まだうまくいってません。マスタメンテナンス画面を作成しているのですがテキストボックスの入力チェック が上手くいきません。テキストボックス はコードという名前をつけています。 以下のコードでコーディングしています。 未入力チェック関数 Public Function EmptyCheck(Koumoku As Variant) As Boolean '引数で渡された項目が入力されているかチェック If Koumoku = ""Then EmptyCheck = True Else EmptyCheck = False End If End Function 桁数チェック関数 Public Function NumberCheck(Koumoku As Variant, Number As Integer) As Boolean If Len(Koumoku) <>Number Then NumberCheck = True Else NumberCheck = False End If End Function 半角英数字チェック関数 Public Function ZokuseiCheck(Koumoku As Variant) As Boolean If IsNumeric(Koumoku) = False And Not Koumoku Like "[a-z]*"And Len(Koumoku) <>6 Then ZokuseiCheck = True Else ZokuseiCheck = False End If End Function コード処理 Private Sub コード_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 13 Then ' If EmptyCheck(コード) = True Then MsgBox "コードを入力してください。" コード.SetFocus KeyCode = 0 Exit Sub ElseIf NumberCheck(コード, 6) = True Then MsgBox "コードの桁数が不正です。" コード.SetFocus KeyCode = 0 Exit Sub ElseIf ZokuseiCheck(コード) = True Then MsgBox "コードの属性が不正です。" コード.SetFocus KeyCode = 0 Exit Sub Else コード.Locked = True End If End If 上手くいかない点は以下の通りです。 1、テキストボックス(コード)の未入力チェックが上手く行きません。テキストボックスが空白の時も""になったりNullになったり変わるのでIf Koumoku = ""ThenにしてしまうとNullになった時処理されずそのまま次のテキストボックスにカーソルが移ってしまう時があります。なんでNullになったり""になったりで変わるのかも謎です。あと空白の時、Koumoku=""で一致しているにも関わらず、Falseで返されてしまい、未入力処理がされません。IsNullを使ってNull値判定してもKoumoku=Nullで一致してるのにFalseで返されました。 2、桁数チェックも上手く行きません。コード処理の方で桁数チェック関数に6という数字を渡して6桁入力としているのですが6桁でもエラーになってしまう時があります。LEN関数でどのように文字数を測っているのかも よくわからないです。 3.これは単純に半角英数字の判定の仕方が間違っているんだと思いますが、やり方がよく分からず、上手く判定できません。 4.これは入力チェックに当てはまるのですがEnterキーを押した時に処理するようにコードを書いていましたが変な結果が出ます。最初にテキストボックスでEnterキーを押して未入力の時に、「コードを入力してください。」とメッセージが出るのはいいのですがその後入力してもまた同じメッセージが出てきます。ほかのテキストボックスをクリックしてカーソルを移さないと同じメッセージが出続けます。桁数や半角英数字チェックの時も同じです。他のカーソルをクリックしないと次の項目のチェックにいかず、同じエラーメッセージが出続けます。何とかほかのカーソルに移さずに修正したら正しく処理が通るようにできないでしょうか。 5、最後に何も問題なかったらテキストボックスにロックかけるよう処理をしているのですが「コントロールの変更を保存していないときはコントロールをロックできません」というエラーメッセージが出てくる時があります。意味が分からず調べても出てこなかったので意味のわかる方何が悪くてエラーになっているのか教えて下さい。 調べてもデバッグしても原因が分からないものばかりです。 長文になってしまいましたがわかる方よろしくお願いします。

みんなの回答

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.5

あと (コード) を (Me.コード.Value) にして値限定にするのもありかも。

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.4

半角英数字チェックになぜ Len(Koumoku) <>6 が入っているのか不明ですが(無駄なものは入れずにテストするのが普通だと…) チェックは以下参照 VBAを使って全角が含まれているかどうか確認したい https://mgate.info/computer/software/msoffice/vbamacro/428/ 桁数は実際にLENで何文字と認識されているのか確認してみるとか。 一度にすべてを設定しないでひとつが正常に動作してから次のコードを追加したほうがいいと思うけど。

  • bardfish
  • ベストアンサー率28% (5029/17766)
回答No.3

テキストボックスはテーブルがバインドされていたりしますか? データソースにテーブル(のField)がバインドされていると実いろいろとやっかいです。それ以上に便利なんですけどね。 もしデータソースが指定されているならばテーブルの値の制約にNOT NULLを指定したり、DEFAULT値を設定するなどVBA以外のところで工夫が必要かもしれません。 もしくは一切バインドせ全てVBAで更新もやらせるとか・・・ 私はどちらかというとVBAでSQLを発行してデータの取得や更新を行います。 で、そこからAccessのデータベースファイルをVB.NETを開いてフロントエンドのUIをVB.NETで作成しています。 vb.netだとテキストボックスの未入力チェックは非常に簡単だったりします。 If TextBox1.Text.Length = 0 Then MessageBox.Show("未入力です", "入力チェック", MessageBoxButton.OK, MessageBoxIcon.Information) って感じです。 ついでに数値型変数に代入された数値を6桁で足りないところをゼロで埋めるときは Dim InputNumber As Integer = Textbox1.Text ConsoleWrite.Line(InputNumber.Tostring("000000")) となります。 ※ConsoleWrite.Line()はExcelやAccessのVBAで言うところのDebug.Print()になります。Debug.Printも使えますが.net Frameworkを使用するならonsoleWriteLineの方が好ましい。

  • kzr260v2
  • ベストアンサー率48% (852/1775)
回答No.2

setfocusやMsgBoxなど多用すると、想定してないタイミングでイベントが発生していたり、2重にイベントが発生するなど、想定外の動作をしていることがあります。 そんな可能性があるときは、debug.printを使って、イベントが想定した順番であるか確認すると良いです。functionやsubの開始時と抜けるタイミングでfunction名などdebug.printすると順番などがイミディエイトウィンドウに視覚化できます。グローバル変数をカウントアップして、それをdebug.printするのも良くある手法です。 問題がある箇所が見つかったら、それに関連する制御のタイミングを入れ替えたり、別のイベントを利用したり、最悪の場合でもsetfocusなどは別途タイマーを使って制御すると解決できることがあります。 ※ このようなタイミングが関係する現象は、パソコンによって発生したりしなかったり、もしくは現象が変化したりと、実運用開始後にも手間がかかることが多いです。 例えばMsgBoxの使用はやめて、コントロール付近にlabelを配置し、そこにエラーや警告を表示したり、setfocusを使用しない設計や運用に変更したりと、別な考え方で対応することも検討すると良いです。 ※ UI内でフォーカスを変更したり、メッセージボックスなどフォーカスを専有するものを利用したりすると、イベントが想定外に発生することがありますが、これはVBAに限らず、別のライブラリ(.NET Frameworkなど)を使用したり、別のプラットフォーム(別のos)でも起こりうるものです。 以上、参考にならなかったらごめんなさい。

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.1

f Nz(Koumoku) = ""Then 試したのかな 締め切らずに同じ質問しないように。 一度に複数の質問をしないように。 何を入力して桁数チェックができないのか不明。

関連するQ&A