Private Sub 依頼表No1_BeforeUpdate(Cancel As Integer)
Dim ErrFLG As Boolean
Dim nCHKNO As Long
Dim strKUBUN As String
strKUBUN = Left(Me![依頼表No1], 1) 'チェックする頭文字の代入
nCHKNO = Val(Mid(Me![依頼表No1], 3)) '番号を変換
ErrFLG = False 'フラグにFalseを初期代入
'頭文字のチェック
If strKUBUN <> "A" And strKUBUN <> "X" And strKUBUN <> "Z" Then
ErrFLG = True 'ERRをONにする
End If
'コード範囲のチェック
If nCHKNO < 100 Or 999 < nCHKNO Then '100より下、999より上か?
ErrFLG = True 'ERRをONにする
End If
'エラーの判断
If ErrFLG = True Then
MsgBox "データはA-201,X-777,Z-234などの形式で入力してね", vbExclamation, "エラー"
Cancel = True
End If
End Sub
Private Sub 依頼表No1_BeforeUpdate(Cancel As Integer)
Dim nCHKNO As Long
Dim strKUBUN As String
strKUBUN = Left(Me![依頼表No1], 1) 'チェックする頭文字の代入
nCHKNO = Val(Mid(Me![依頼表No1], 3)) '番号を変換
'頭文字のチェック
If strKUBUN <> "A" And strKUBUN <> "X" And strKUBUN <> "Z" Then
Me![依頼表No1].SelStart = 0 '先頭から
Me![依頼表No1].SelLength = 1 '間違いは頭文字なので
MsgBox "頭文字はA,X,Z です", vbExclamation, "頭文字エラー"
Cancel = True 'キャンセルをセットして
Exit Sub '関数を途中で抜ける
End If
'コード範囲のチェック
If nCHKNO < 100 Or 999 < nCHKNO Then '100より下、999より上か?
Me![依頼表No1].SelStart = 2 '数値のエリア開始位置
Me![依頼表No1].SelLength = 99 '文字数をオーバーしてセットしてみたら?
MsgBox "コードは100〜999までです", vbExclamation, "コード範囲エラー"
Cancel = True 'キャンセルをセットして
Exit Sub '関数を途中で抜ける
End If
End Sub
頭文字のチェックでは
If strKUBUN <> "A" And strKUBUN <> "X" And strKUBUN <> "Z" Then
Me![依頼表No1].SelStart = 0 '先頭から
Me![依頼表No1].SelLength = 1 '間違いは頭文字なので
と1文字目を選択させてから
MsgBox "頭文字はA,X,Z です", vbExclamation, "頭文字エラー"
メッセージ表示
Cancel = True 'キャンセルをセットして
Exit Sub '関数を途中で抜ける
処理のキャンセルをセットしてから関数を抜けてます
End If
コード範囲のチェックでは、
If nCHKNO < 100 Or 999 < nCHKNO Then '100より下、999より上か?
Me![依頼表No1].SelStart = 2 '数値のエリア開始位置
Me![依頼表No1].SelLength = 99 '文字数をオーバーしてセットしてみたら?
とコードの入力開始位置2(012の3文字目)から、
オヤ?99文字指定?これでも動くんだぁ。
※正確な文字数じゃなくても大丈夫でした
MsgBox "コードは100〜999までです", vbExclamation, "コード範囲エラー"
Cancel = True 'キャンセルをセットして
Exit Sub '関数を途中で抜ける
処理のキャンセルをセットしてから関数を抜けてます
End If
いろいろとみなさんも遊んでみてください。
Private Sub btnLOGIN_Click()
'パスワードが合っているかチェックする
If Me![PASS] <> Me![USER_ID].Column(2) Then 'コンボボックスの3列目
MsgBox "パスワードが違います、確認して下さい"
Me![PASS] = "" '元の文字を消す
Me![PASS].SetFocus 'フォーカスを移動する
Exit Sub '途中で処理を抜ける
End If
'管理者とオペレータを判断してフォームを開く
Dim stLinkCriteria As String
If Me![USER_ID].Column(3) = True Then 'コンボボックスの4列目
DoCmd.OpenForm "F_MENU_K" '管理者用
Else
DoCmd.OpenForm "F_MENU_OP" 'オペレータ用
End If
End Sub
前半でパスワードのチェックを行ってます。
ポイントは、コンボボックスの
Me![USER_ID].Column(2)
です。
複数列から構成されているコンボボックスで、
.Column(0) (1)...と選択されている列を取出すことが出来ます。
※0から始まっているのに注意して使ってみてください。
If Me![PASS] <> Me![USER_ID].Column(2) Then
で入力されたパスワードが合っているかチェックして
<>の違う時に、
MsgBox "パスワードが違います、確認して下さい"
Me![PASS] = "" '元の文字を消す
Me![PASS].SetFocus 'フォーカスを移動する
Exit Sub '途中で処理を抜ける
とメッセージ表示、フォーカスをパスワードにあて、関数を抜けてます。
パスワードのチェックがOKだったら、
次は開くフォームをF_KUBUNの値で切り替えます。
ここもコンボボックスでF_KUBUNが4列目のデータとして取出せるので、
If Me![USER_ID].Column(3) = True Then
でチェックして、
DoCmd.OpenForm "F_MENU_K" '管理者用
と
DoCmd.OpenForm "F_MENU_OP" 'オペレータ用
を切り替えて表示してます。
最後は、Accessの終了処理
~~~~~~~~~~~~~~~~~~~~~~~~
Private Sub btnCLOSE_Click()
'終了の確認
If MsgBox("終了しますか?", vbYesNo) = vbYes Then
DoCmd.Quit
End If
End Sub
Private Sub コマンド9_Click()
On Error GoTo Err_コマンド9_Click
Dim stDocName As String
Dim stLinkCriteria As String
stDocName = "F_MEMU_K"
DoCmd.OpenForm stDocName, , , stLinkCriteria
Exit_コマンド9_Click:
Exit Sub
Err_コマンド9_Click:
MsgBox Err.Description
Resume Exit_コマンド9_Click
End Sub
Private Sub btnLOGIN_Click()
'パスワードが合っているかチェックする
If Me![PASS] <> Me![USER_ID].Column(2) Then 'コンボボックスの3列目
MsgBox "パスワードが違います、確認して下さい"
Me![PASS] = "" '元の文字を消す
Me![PASS].SetFocus 'フォーカスを移動する
Exit Sub '途中で処理を抜ける
End If
'ログインのフォームを見えなくする
Me.Visible = False 'Visible = False
'管理者とオペレータを判断してフォームを開く
Dim stLinkCriteria As String
If Me![USER_ID].Column(3) = True Then 'コンボボックスの4列目
DoCmd.OpenForm "F_MENU_K" '管理者用
Else
DoCmd.OpenForm "F_MENU_OP" 'オペレータ用
End If
End Sub
フォーム、F_LOGINから
'ログインのフォームを見えなくする
Me.Visible = False 'Visible = False
とフォームを非表示にしてから、
'管理者とオペレータを判断してフォームを開く
Dim stLinkCriteria As String
If Me![USER_ID].Column(3) = True Then 'コンボボックスの4列目
DoCmd.OpenForm "F_MENU_K" '管理者用
Else
DoCmd.OpenForm "F_MENU_OP" 'オペレータ用
End If
管理者を判断して、F_MENU_K , F_MENU_OP のフォームを開いてます。
F_MENU_OP が 開かれたら、
XXXさん落ち着いてがんばってね
とメッセージを表示してみます。
XXXさんの名前は、
F_LOGIN フォームのコンボボックスUSER_IDの2列目に入ってます。
F_MENU_OPの開くイベントで下記のように使ってみました。
Private Sub Form_Open(Cancel As Integer)
Dim strMSG As String 'メッセージ作成用
strMSG = Forms![F_LOGIN]![USER_ID].Column(1) '名前を代入
MsgBox strMSG & "さん、落ち着いてがんばってね" 'メッセージの表示
End Sub
Private Sub btnEND_Click()
Dim strMSG As String 'メッセージ作成用
strMSG = Forms![F_LOGIN]![USER_ID].Column(1) '名前を代入
If MsgBox(strMSG & "さんお疲れ様、終了します", vbYesNo) = vbYes Then
DoCmd.Close acForm,"F_MENU_OP" 'F_MENU_OPフォームを閉じます
Forms![F_LOGIN]![USER_ID] = "" 'ユーザーIDをクリア
Forms![F_LOGIN]![PASS] = "" 'パスワードをクリア
Forms![F_LOGIN].Visible = True '表示する
Forms![F_LOGIN]![USER_ID].SetFocus 'フォーカスをID選択へ
End If
End Sub
画面でグー・チョキ・パーと名前を受取りたいと思います。
※フォームの入力は
1グー、2チョキ、3パーの数値
と
ユーザー名の文字列
作成イメージは、
参照
フォームでセットされた値を使用するのに、
簡単に、グローバル変数で値をやり取りしてみたいと思います。
(前回のAccessでは、閉じないで非表示の参照でしたが、
今回は、グローバル変数に値をセットしてフォームを閉じます)
流れは、メインのモジュールで、
ユーザーフォームを開く
[ユーザーフォーム側処理] 実行が押されたらグローバル変数にデータをセット
閉じる
戻ってきたら、
グローバル変数を参照して処理を行う。
メインの標準モジュールに
~~~~~~~~~~~~~~~~~~~~~~~~
Public nINPUT As Integer '選択した手
Public strName As String 'お名前
Sub test2()
UserForm1.Show 'ユーザーフォームの表示
MsgBox strName & "さんが選択したのは" & nINPUT & "です"
End Sub
と記述します。
ポイントは、Sub関数の外側に
Public nINPUT As Integer '選択した手
Public strName As String 'お名前
とPublicで変数を宣言してます。
この変数宣言を行うと、変数をどこでも使用できます。
次にフォームで実行のボタンが押されたら、
フォームの値をPublic宣言した変数に代入し、
フォームを閉じます。
UserForm1のモジュール
~~~~~~~~~~~~~~~~~~~~~
Private Sub btnRUN_Click()
'選択した手を代入
nINPUT = 0 '初期化
If Me.OP01.Value = True Then nINPUT = 1 'グー
If Me.OP02.Value = True Then nINPUT = 2 'チョキ
If Me.OP03.Value = True Then nINPUT = 3 'パー
'名前を代入
strName = Me.txtUSERNAME.Text
'フォームを閉じる
Unload Me
End Sub
Sub test3()
'初期処理
Dim strNO As String '値を受け取るため文字型の変数を宣言
Dim nCON As Integer 'コンピュータの手1〜3の数値が入る
Dim nPC As Integer 'ユーザーさんの手
Dim strTE(3) As String '(*1)配列変数を宣言
strTE(1) = "グー" '(*2)配列にメッセージを代入
strTE(2) = "チョキ"
strTE(3) = "パー"
'ユーザーにグ・チ・パを入力させる
'InputBoxで入力してもらう
strNO = InputBox("1.グー 2.チョキ 3.パー","アナタの手を入力で下さい")
'入力値の判断、エラーならメッセージを表示させ抜ける
'If文で1,2,3以外を判断する
If strNO <> "1" And strNO <> "2" And strNO <> "3" Then
MsgBox "[" & strNO & "]は不正な入力です"
Exit Sub '<--Exit Subを使用してここでプログラムを抜ける
End If
'コンピュータの手を決定
Randomize ' 乱数発生ルーチンを初期化します。
nCON = Int((3 * Rnd) + 1) '1 から 3 までの乱数を発生させます。
'結果判断と表示
'ユーザーの手を表示する
nPC = Val(strNO) 'Val関数で数値型に変換する
MsgBox "あなたの手は" & strTE(nPC) & "です" '(*3)ここでnPC番目を表示
'(*4)同様にコンピュータの手を表示する
MsgBox "コンピュータの手は" & strTE(nCON) & "です"
'結果の判断
'まず、引き分けを判断
If nPC = nCON Then MsgBox "引き分けです"
'次に自分が勝ちの手を判断 グーvsチョキ,チョキvsパー,パーvsグー
If nPC = 1 And nCON = 2 Then MsgBox "アナタの勝ちです"
If nPC = 2 And nCON = 3 Then MsgBox "アナタの勝ちです"
If nPC = 3 And nCON = 1 Then MsgBox "アナタの勝ちです"
'コンピュータが勝ちか判断 グーvsパー,チョキvsグー,バーvsチョキ
If nPC = 1 And nCON = 3 Then MsgBox "私(コンピュータ)の勝ちです"
If nPC = 2 And nCON = 1 Then MsgBox "私(コンピュータ)の勝ちです"
If nPC = 3 And nCON = 2 Then MsgBox "私(コンピュータ)の勝ちです"
End Sub
これを、INPUTBOXの部分を今回のフォームに直します。
Sub test4()
'初期処理
Dim strNO As String '値を受け取るため文字型の変数を宣言
Dim nCON As Integer 'コンピュータの手1〜3の数値が入る
Dim nPC As Integer 'ユーザーさんの手
Dim strTE(3) As String '(*1)配列変数を宣言
strTE(1) = "グー" '(*2)配列にメッセージを代入
strTE(2) = "チョキ"
strTE(3) = "パー"
'ユーザーにグ・チ・パを入力させる
UserForm1.Show 'ユーザーフォームの表示
nPC = nINPUT '選択された手を代入
'×ボタンで終了時は何もしない(キャンセル判断)
If nPC = 0 Then
Exit Sub '<--Exit Subを使用してここでプログラムを抜ける
End If
'コンピュータの手を決定
Randomize ' 乱数発生ルーチンを初期化します。
nCON = Int((3 * Rnd) + 1) '1 から 3 までの乱数を発生させます。
'結果判断と表示
'ユーザーの手を表示する
MsgBox strName & "さんの手は" & strTE(nPC) & "です" '(*3)ここでnPC番目を表示
'(*4)同様にコンピュータの手を表示する
MsgBox "コンピュータの手は" & strTE(nCON) & "です"
'結果の判断
'まず、引き分けを判断
If nPC = nCON Then MsgBox "引き分けです"
'次に自分が勝ちの手を判断 グーvsチョキ,チョキvsパー,パーvsグー
If nPC = 1 And nCON = 2 Then MsgBox strName & "さんの勝ちです"
If nPC = 2 And nCON = 3 Then MsgBox strName & "さんの勝ちです"
If nPC = 3 And nCON = 1 Then MsgBox strName & "さんの勝ちです"
'コンピュータが勝ちか判断 グーvsパー,チョキvsグー,バーvsチョキ
If nPC = 1 And nCON = 3 Then MsgBox "私(コンピュータ)の勝ちです"
If nPC = 2 And nCON = 1 Then MsgBox "私(コンピュータ)の勝ちです"
If nPC = 3 And nCON = 2 Then MsgBox "私(コンピュータ)の勝ちです"
End Sub