• 締切済み

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
  • ベストアンサー率65% (1615/2454)
回答No.5

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

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.4

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

  • bardfish
  • ベストアンサー率28% (5029/17765)
回答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% (788/1620)
回答No.2

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

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.1

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

関連するQ&A

  • Accessでのテキストボックスのv記載方法

    Accessでのvbaを使用したコードの書き方について教えて欲しいです。 vbaを使用したますたメンテナンス(データ管理)のコードをAccessで組んでいるのですがで組んでいるのですがどうも上手くいかないところが多いです。 1. コードという名前のテキストボックス(プロパティ→すべて→名前でつけた名前を使用しています)の入力チェックが上手くいきません。ここでは自作関数を呼び出してif文で空白かどうかチェックしてるのですが コード(テキストボックス)=Nullとなってしまい、""のチェックに引っかかってくれません。どうしたら空白=""になってくれるのでしょうか。 デバッグをしてみたらテキストボックスは常にNull(Variant型)なってるのではなくたまに""(String型)になったりするので何が原因で型が変わってるのかも謎です テキストボックスだから""で空文字判定できると思うのですが… 書いたのは以下のコードです。 わかる方よろしくお願いします。 Public Function EmptyCheck(Koumoku As String) As Boolean '引数で渡された項目が入力されているかチェック If Koumoku = ""Then Koumoku.SetFocus Exit Function EmptyCheck = Ture Else EmptyCheck = False End If End Function Private Sub コード_KeyDown(KeyCode As Integer, Shift As Integer) 'Enterキー押したときに処理を開始する If KeyCode = 13 Then If EmptyCheck(コード) = True Then MsgBox "TextBox &を入力してください。" End If

  • エクセル VBA タブストップに対する質問2

    下記の「エクセル VBA タブストップに対する質問」に書き込みした者ですが、一難去ってまた一難です。又、暗雲が漂ってきました。 条件は下記といっしょで テキストボックスが1~5まであり、テキストボックス2~4まではデータが入っています。 全てのTabStopはTrue、TabIndexは順に1~5が入っています。 テキストボックス1に何もデータを入れないで、Enterが押された場合、 テキストボックス1をアクティブにしたいのですが、下記で質問した回答で動かしても、きちんと動いてくれません。 どうかご指導よろしくお願いいたします。 Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 13 Then 'ENTER If TextBox1.Value = "" Then TextBox1.SetFocus End If End If End Sub このコードでテキストボックス1に何も入れずにEnterを押すとテキストボックス2がアクティブになってしまいます。

  • エクセルVBAについて質問です。

    エクセルVBAについて質問です。 ユーザーフォームのテキストボックスに数字以外を入力するとエラーメッセージが出るように関数を作ったのですが、 Private Function AA(objtextbox As MSForms.TextBox) As Boolean Dim A As String AA = False A = Trim(objtextbox.Text) If objtextbox.Text <> "" Then If IsNumeric(A) = False Then MsgBox "数値 Error", vbCritical With objtextbox .SetFocus .SelStart = 0 .SelLength = Len(.Value) End With AA = True End If End If End Function Private Sub textbox1_exit(ByVal cancel As MSForms.ReturnBoolean) cancel = AA(TextBox1) End Sub テキストボックス200近くある場合、1つ1つに Private Sub textbox1_exit(ByVal cancel As MSForms.ReturnBoolean) cancel = AA(TextBox1) End Sub と作っていかなくてはいけないのでしょうか? プロシージャ名に変数使おうとしたら上手くできませんでした。 どなたか助けてください。

  • Access 97 VBAについて

    Access VBAについて教えてください。 初心者ですが、レポートに表示されるテキストボックスの”項目名”と”内容”プロパティーに重複データ非表示にしています。そして、非表示となった部分に”〃”を表示するため別のテキストボックス、”隠しオブジェクト1”及び”隠しオブジェクト2”を配置しています。???にどんな記述が必要かわかりません。”項目名”だけであれば問題なく表示されるのですが”内容”についても同様に処理したいのです。 どうぞ宜しくお願いいたします。 Option Compare Database Option Explicit '値を保持するために外側に変数を定義します。 Dim varA As Variant --------------------------------------------------- Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)   If Me.項目名 = varA Then    Me.隠しオブジェクト1.Visible = True Else Me.隠しオブジェクト1.Visible = False End If varA = Me.項目名 ???? If Me.内容 = varA Then Me.隠しオブジェクト2.Visible = True Else Me.隠しオブジェクト2.Visible = False End If varA = Me.内容 End Sub

  • VBAの比較処理においてバグ?

    環境はVistaBusiness、Excel2003です。 以下のような比較処理をして条件を満たせばTrueを返す関数を作成しましたが 偶然このパラメータ(関数上は引数としてデータ取得)が入ってきた場合に Trueを返すようになってしまいました。 論理的に考えれば当然Falseになるのかと思うのですが なぜかTrueが返ってきます。 If 163.05 < 163.07 Then If 163.04 < (163.05 - 0.01) Then Chk = True Exit Function End If End If Chk = False 但しこの数字を下記のように変更すると意図するとおり Falseが返ってきます If 163.06 < 163.07 Then If 163.05 < (163.06 - 0.01) Then Chk = True Exit Function End If End If Chk = False これはバグなのでしょうか? お分かりになる方がいれば回答お願いします。

  • VB.Netのテキストボックスのコントロール

    VB2010を使用しています。チェックボックスのon/offでテキストボックスの入力を制限しようとしています。 If Check1.Checked = True Then For Each Cont As Control In Me.Groupko顧客数.Controls If Cont.Name Like "Text*" Then ここの記述ですが         『Cont.ReadOnly = True』と書いても構文が違うのか認識しません?? End If Next Else           逆のコードの予定 End If 大量のテキストボックスがあるので一つ一つコードを書くのは面倒なので ご教授お願いします。

  • エクセルVBAでユーザーフォームのテキストボックス

    ユーザーフォーム上にテキストボックスを8個設置しました。 そこに数値が入力された場合は自動的にカンマ区切りが表示されるように以下のコードを書きました。 これで希望の動きはしてくれるのですが、このやりかたは正しいでしょうか? また、テキストボックスは8個あるので、それぞれに下記のように8通りコードをかかなければいけないのでしょうか?ご教示ください。 Private Sub TextBox1_Change()   If IsNumeric(TextBox1.Value) Then Application.EnableEvents=False     TextBox1.Text = Format(TextBox1.Value, "#,##0") Application.EnableEvents=True   End If End Sub 途中(2~7)略 Private Sub TextBox8_Change()   If IsNumeric(TextBox8.Value) Then Application.EnableEvents=False     TextBox8.Text = Format(TextBox8.Value, "#,##0") Application.EnableEvents=True   End If End Sub

  • エクセル VBAのチェックボックスについて

    お読みくださり、ありがとうございます。 エクセル初心者でございます。 エクセルのマクロなのですが、 お詳しい方、是非教えて欲しいです!汗 調子に乗って入力フォームなるものを作りました。 入力フォームの中にて、チェックボックスで「ある」「なし」の項目を入れてみたのですが、チェックしていないのに、値が入る現象が起きています汗 以下、素人が書いたコードを恥を承知で記載させていただきます。 Private Sub CheckBox1_Click() If CheckBox1.Value = True Then OK = "○" End If End Sub Private Sub CheckBox2_Click() If CheckBox2.Value = True Then NO = "×" End If End Sub Private Sub UserForm_Click() End Sub '以下のコードは、登録ボタンがクリックされたときの処理! Private Sub 登録ボタン_Click() If TextBox1.Text = "" Then MsgBox "グッズ名を入力してください。" Exit Sub End If If TextBox2.Text = "" Then MsgBox "アプローチ先を入力してください。" Exit Sub End If With Worksheets("協賛グッズ") With Cells(Rows.Count, 2).End(xlUp) .Offset(1, 0).Value = TextBox1.Text .Offset(1, 1).Value = mori .Offset(1, 2).Value = mori2 .Offset(1, 3).Value = TextBox2.Text .Offset(1, 5).Value = TextBox3.Text .Offset(1, 6).Value = TextBox4.Text .Offset(1, 7).Value = TextBox5.Text .Offset(1, 8).Value = TextBox6.Text End With End With TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" CheckBox1.Value = False CheckBox2.Value = False End Sub 以上です。 おかしなところ満載かと思いますが、 チェックを入れた項目だけ値を入れたいと考えております。 おわかりになるかたおりましたら何卒お助けください汗 よろしくお願いいたします。

  • レコードセットからの抽出方法

    Access2000を使用しています。 下記のコードのとおり 入力用テキストボックスに座席コードを入力して seat テーブルから座席コードと入力したものからレコードを探して表示できているんですが、 レコードセットで抽出した座席番号が「P」のものだけ チェックボックス(pri.value=true) にしたいのですが動きませんどのようなコードを書けばいいんでしょうか? Dim rst As New ADODB.Recordset Set rst = New ADODB.Recordset rst.Open "select * from seat where 座席コード='" & Me.入力用テキストボックス & "'", _ CurrentProject.Connection, adOpenKeyset, adLockOptimistic If rst.EOF = True Then MsgBox ("座席情報はありません。") Me.入力用テキストボックス = "" End If If rst.EOF = False Then Me.座席コード = rst![座席コード] Me.座席番号 = rst![座席番号] Me.入力用テキストボックス = "" Me.受付時間 = Now() End If If Left(rst![座席番号], 1) = "P" Then Me.pri.Value = True

  • VBA の IF then 文につぃて

    access2000でテーブルに連結していないフォームがあり その中のテキストボックスにバーコードや磁気カードで読み込ませその桁数によって処理を分けようと思っていますが、どのようにコードを書けばよいのかおしえてください。 たとえば、 private sub() if 入力テキスボックス が 8桁 then 磁気カード処理 if 入力テキストボックスが 11桁 then バーコード処理 end if end sub public sub 磁気カード処理() public sub バーコード処理() のような形です。 どうかお願いします

専門家に質問してみよう