三流君 VBAで楽しくプログラミング(Excel/Access VBAの解説/サンプルです)
[VBA系のバックナンバー]
[VBA系 TOP]
[三流君 TOP]
<Access Form TextBoxの.SelLength .SelStartプロパティ>
こんにちは、三流プログラマーKen3です。
今回は、
Access のテキストボックスの
.SelLength (選択文字数)
.SelStart (選択開始位置)
です。
/*
* 1.今回のキッカケ
*/
下記の質問をBBS( http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi )で貰いました
>おなまえ:MachineUser
>タイトル:キャンセル処理後の選択
>
>AccessでのVBAでフォーム上にあるテキストボックスの中身のチェックを
>BeforeUpdateイベントにて行っているのですが、間違った値を入力したと
>きにキャンセル処理をさせています。
>このキャンセル処理をさせた後、入力文字列を選択状態にしたいのですが、
>どのようにすればよろしいのでしょうか?
----
と質問がありました。
/*
* 2._BeforeUpdateで処理をキャンセルする
*/
まずは、ノーマルなキャンセル処理を書きます。
更新前のイベント処理
頭文字がA,X,Z 番号が100〜999をチェック
データはA-201,X-777,Z-234などの形式
*入力禁則でできそうってのは、置いといて、
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 |
と単純に、データをチェック、エラーならCancel = Trueとしました。
[No.60 Cancel=Trueの使い方(例題:Excel 右クリック禁止)]
http://www.ken3.org/backno/backno_vba13.html#60
で、Cancel=Trueの使い方を少し書きました。
今回みたいに更新前にデータをチェックして、更新をキャンセルすることもできます。
Cancel=Trueはいろいろと使えるので、覚えて置いてください
/*
* 3.SelLength、SelStart、SelText プロパティ
*/
そこまでは出来てるんだよ、
質問されたのは、このエラーの時、
>入力文字列を選択状態にしたい
だろ、、、と一流読者のお叱りを受けたところで、
そろそろマウスでドラッグした時のみたいな反転イメージを作りたいと思います。
テキストボックスのプロパティを探ると、
Me![依頼表No1].
とピリオドを打ちこむと、プロパティ・メソッドの一覧が表示されます。
ここから使えそうなプロパティを見てみると(それにしてもいっぱい在るよね)
SelLength、SelStart、SelText プロパティが見つかりました
ヘルプを見ると、
SelLength コントロールで選択されている文字数を示します。
SelStart 選択されたテキストの先頭、またはテキストが選択されていない場合は、
カーソルの位置を示します。
SelText プロパティは、選択されたテキストの文字列を示します。
コイツを使って、エラー処理の時、勝手に文字を選択します。
'エラーの判断
If ErrFLG = True Then
Me![依頼表No1].SelStart = 0 '先頭から
Me![依頼表No1].SelLength = Len(Me![依頼表No1]) '文字数分選択する
MsgBox "データはA-201,X-777,Z-234などの形式で入力してね", vbExclamation, "エラー"
Cancel = True
End If
と、エラーの時、
.SelStart = 0 で先頭から
.SelLength = Len(Me![依頼表No1]) で文字数分反転選択させます
-- 余談 --
今回はSelTextは使わなかったけど選択された一部を見たい時などに使ってみてね。
プロパティ、メソッドの探り方
http://www.ken3.org/vba/excel-help.html
こっちもヨロシク
/*
* 4.蛇足の回答
*/
.SelStart = 0 先頭から
.SelLength = Len(Me![依頼表No1]) 全部
だとツマラナイので間違った場所を選ぶコードを書いてみます。
オイオイ、せっかくキレイに終わったと思ったのに、
余計な蛇足の回答すると失敗するぞ(笑)
まぁ、蛇足も必要ってことで(謎)もう少しお付き合いください。
(※読者の声:長くなるだけだろ?)
エラーのチェック場所が2ヶ所なので、エラーの位置別に選択位置を変えてみます。
'更新前のイベント処理
'頭文字がA,X,Z 番号が100〜999をチェック
'データはA-201,X-777,Z-234などの形式
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
いろいろとみなさんも遊んでみてください。
/*
* 5.おわりの挨拶
*/
今回は、
BeforeUpdateイベントでエラー時、文字列を選択したい
でした。
拾い読みして、
1つでも何かの参考となれば幸いです。
Excel/Access大好き、三流プログラマーKen3でした。
----------------------------------
関連項目(ただのバックナンバー紹介)
----------------------------------
[No.60 Cancel=Trueの使い方(例題:Excel 右クリック禁止)]
http://www.ken3.org/backno/backno_vba13.html#60
で、Cancel=Trueの使い方を少し書きました。
今回みたいに更新前にデータをチェックして、更新をキャンセルすることもできます。
プロパティ、メソッドの探り方
http://www.ken3.org/vba/excel-help.html
こっちもヨロシク
<Access ユーザーマスターのチェックとメニュー切り替え>
こんにちは、三流プログラマーKen3です。
今回から少し、
Access で ユーザーのローカル管理
・ユーザー選択画面
・データ入力
・データ印刷
を書いてみたと思います。
サンプルファイルは、
http://www.ken3.org/vba/lzh/vba066.lzh
にdb066-97.mdbが保存されています。
(Access97形式、2000の人は変換してね)
マスターテーブルにデータを追加して、遊んでみてください。
/*
* 1.今回のキッカケ
*/
In message "有難うございました",
前* **さん wrote...
>すみませんが、現在アクセス VBA関係で直面している問題がありますのでまた質問
>させていただきたいのですが
>
>私の希望は、アクセスの画面を開いたときに、フォームが出てオペレーターは入力の
>み、パスワードを持つ担当者が、検索、修正ができるようにしたいと思っています
>
>その場合、オペレーターに自分が入力したデータだけを打ち出させて、目検してもら
>いたいのですがその日、自分が入力したデータだけを打ち出すことができるでしょう
>か
----
質問来てからの日数が経っているので、もう解決してしまったと思うが、
ネタ的に使えそうなので、使ってみたいと思います。
/*
* 2.客先で要望を聞く
*/
まぁ、普通のシステム作成だと要望を聞いて、仕様書を作成します。
とある入力センターに打ち合わせに向かいました。
※作り話だよ
客先担当者のお話
>私の希望は、アクセスの画面を開いたときに、フォームが出てオペレーターは入力の
>み、パスワードを持つ担当者が、検索、修正ができるようにしたいと思っています
>
>その場合、オペレーターに自分が入力したデータだけを打ち出させて、目検してもら
>いたいのですがその日、自分が入力したデータだけを打ち出すことができるでしょう
>か
---
三流プログラマーKen3
まずは、管理者とオペレーターで使える機能に制限を持たせたいんですね。
管理者の機能は
・ユーザーマスターのメンテナンス
・検索と修正機能
・納品用の印刷や納品用CSV作成などの出力機能
オペレーターの機能は
・データの入力機能
・入力データの目検用の印刷機能
共通機能は、
・ログイン画面
ラフですが、こんな感じでいいですか?
あの〜、何を言っているのか?サッパリなんですが?イメージが沸かなくて。
そうですよね(苦笑しながら)、
では、次回の打ち合わせの時、案を作って持ってきます、
あっ、その時までに入力するデータの項目とサイズを教えてもらえませんか?
あと、差し障りが無ければ実際に入力する伝票を次回お借りしたいです。
それと、
えっ、まだあるの?
できたら集計印刷のイメージを教えてもらえると助かります。
次回の打ち合わせに
私が用意するもの
・システム化の案
・概算見積もり
お客様に用意してもらうもの
・入力データの項目とサイズ、実際に使用している伝票
・集計印刷のイメージとレイアウトはラフな手書き
/*
* 3.要望を仕様書に落す
*/
画面の遷移図を作成する
~~~~~~~~~~~~~~~~~~~~~~
まぁ、1機能1画面だから機能一覧と似ちゃうけど
Windoes起動
↓
xxxx.mdb をダブルクリックして起動する
ログイン画面の表示
|
+----- 終了ボタン Accessの終了
|
+----- ログインボタン データチェック後、
管理者メニュー
オペレータメニュー
どちらかのメニューを表示する
管理者メニュー
|
+----- マスターメンテナンス マスターメンテ画面を起動
|
+----- 管理帳票印刷 管理帳票印刷画面へ
|
+----- CSV納品ファイルの作成 納品ファイル作成画面へ
|
+----- 作業終了 管理者メニューを閉じてログイン画面へ
オペレータメニュー
|
+----- データ入力 データ入力画面の表示
|
+----- 目検 入力データを印刷する
|
+----- 作業終了 オペレータメニューを閉じてログイン画面へ
テーブル(ファイル)フォーマット
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MST_USER ユーザーマスターテーブル
F_USER_ID Text(10) 10文字まで、GusetやA001などのコード 重複不可
F_NAME Text(20) ユーザーの名前 小林君や遠藤君
F_PASS Text(20) パスワード
F_KUBUN True/False True管理者、False一般オペレータ
T_DATA 入力データ管理テーブル
F_NO オートナンバー
・
・ 客先から後で聞く
・
F_INPUT text(文字型) 入力したユーザーのID
画面レイアウト
~~~~~~~~~~~~~~
ログイン画面 F_LOGIN
USER [ ________ ] ▼ コンボボックスで選択
PassWord [ ********** ]
┌────┐
│ログイン│
└────┘
┌──────┐
│システム終了│
└──────┘
ユーザーを選択、パスワード入力後、ログインボタンを押してください。
管理者メニュー画面 F_MENU_KANRI
┌────────┐
│ マスターメンテ │
└────────┘
┌────────┐
│ 管理帳票印刷 │
└────────┘
┌────────┐
│納品ファイル作成│
└────────┘
┌────────┐
│ 終 了 │
└────────┘
オペレータメニュー画面 F_MENU_OP
┌─────┐
│ 入 力 │
└─────┘
┌─────┐
│目検用印刷│
└─────┘
┌─────┐
│ 終 了 │
└─────┘
印刷(帳票)レイアウト
~~~~~~~~~~~~~~~~~~~~~~
イメージを貰っていないのでまだ。
まぁ、ラフに書いて、打ち合わせ後に修正するか。
/*
* 4.ログイン画面の作成
*/
時間あるし、ログイン画面でも作成して持って行くか。
ログイン画面 F_LOGIN
USER [ Ken3______ ] ▼ コンボボックスで選択
PassWord [ ********** ]
┌────┐
│ログイン│
└────┘
┌──────┐
│システム終了│
└──────┘
イベント動作仕様(操作に対応する処理)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
初期処理 ・・・ 画面が開いたら項目を初期値に(空白にする)
ログインボタンが押されたら
MST_USER ユーザーマスターテーブルを検索して、
入力されたパスワードとテーブルのF_PASSが一致するかチェック。
ア.エラーの時、エラーメッセージ表示
イ.一致(正常の時)
F_KUBUNを判断し、フォームを開く
F_KUBUN = True 管理者メニュー画面 F_MENU_KANRIを開く
F_KUBUN = False オペレータメニュー画面 F_MENU_OPを開く
システム終了ボタンが押されたら
Accessを終了させる
まずは、テーブルを作ってと、
次はフォームを作成します。
ポイントはUSERIDを入れるコンボボックスです。
クエリーを1つ作り(Q_USER)値集合ソースに指定、
列幅を4cm;0cm;0cm;0cmとして、
^^^^^^^^^^^^^^^^^^^^^
頭のF_USER_IDのみ表示させてます。
*F_NAME, F_PASS, F_KUBUN は見せないけど値は取りたかったので。
次は、ログインボタンを押された時の処理を記述します。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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 |
と、
DoCmdの.Quitメソッドで終了してます。
長かったけど、パスワードのチェック画面ができました。
※手抜きだけどね。
※慣れないうちは、コマンドボタンウィザードを使って、
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DoCmdを探る場合、コマンドボタンのウィザードを使うといいですよ。
開くのコマンドはこんな感じで作ってくれます
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 |
同じくアプリケーション終了も作ることができます(調べることができます)
/*
* 5.おわりの挨拶
*/
今回は、長かったけど、
・要求を聞いて、仕様を作成して行く
・ログイン画面の作成
でした。
サンプルファイルは、
http://www.ken3.org/vba/lzh/vba066.lzh
にdb066-97.mdbが保存されています。
(Access97形式、2000の人は変換してね)
マスターテーブルにデータを追加して、遊んでみてください。
次回はたぶん、続きの入力関係でログインしたユーザー単位の管理です。
拾い読みして、
1つでも何かの参考となれば幸いです。
Excel/Access大好き、三流プログラマーKen3でした。
<Access Formを隠す Me.Visible = False (Closeとの違い)>
こんにちは、三流プログラマーKen3です。
前回から、
Access で ユーザーのローカル管理
・ユーザー選択画面
・データ入力
・データ印刷
を書いてます。
サンプルファイルは、
http://www.ken3.org/vba/lzh/vba067.lzh
にdb067-97.mdbが保存されています。
(Access97形式、2000の人は変換してね)
マスターテーブルにデータを追加して、遊んでみてください。
/*
* 1.今回の目的
*/
メインテーマの
誰が入力したデータか?
~~~~~~~~~~~~~~~~~~~~~~
を知りたい。
これを実現するために、前回Loginフォームの処理を作りました。
さてと、入力のチェックは終わったけど、この値を使用したいよね。
そんな時、どうしようかなぁ・・・と考える。
グローバル変数に保存する方法にしようか迷ったが、
今回は、フォームを非表示して、コントロールの値を参照する方法にします。
そんなたいした説明じゃないので、ご安心を。
/*
* 2.フォームの非表示
*/
フォームの非表示って簡単で、
フォームオブジェクトの.Visible を False に設定するだけです。
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 |
へぇ〜
'ログインのフォームを見えなくする
Me.Visible = False 'Visible = False
こんな一行で非表示になるんたぁ。
自分のフォームを表すMeを使用して、プロパティ.Visibleにセットしただけです。
DoCmd.Close でフォームを閉るでいいんじゃないの?
まぁ、続きがあるんだから落ち着きなって。
/*
* 3.開いている別のフォームの値を参照する
*/
フォーム、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 |
値の参照方法は簡単で、
Forms![F_LOGIN]![USER_ID].Column(1)
と
Forms![フォーム名]![コントロール名].プロパティやメソッド
で、使用可能です。
なんとか無事に表示されました。
無事に表示されない例は、F_LOGINを開いていない状態で、
F_MENU_OPを開くと、
実行時エラー '2450'
F_LOGINフォームが見つからないとエラーが発生します
( 参照 )
これは、エラーメッセージのままで、
開いていないフォームの値を参照しに行ったためです。
/*
* 4.フォームの再表示
*/
今度は、オペレーターがメニューを閉じたら、LOGIN画面を再表示させます。
┌─────┐
│ 終 了 │ btnEND_Click
└─────┘
ボタンがクリックされたら、
XXXXさんお疲れ様 終了しますか?
とメッセージで確認を行ってから、
メニューフォームを閉じ、LOGIN画面を再表示します。
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 |
MsgBoxで確認後、
DoCmd.Close でフォームを閉じ、
Forms![F_LOGIN].Visible = True で再表示を行ってます。
Forms![F_LOGIN]![USER_ID] = "" 'ユーザーIDをクリア
Forms![F_LOGIN]![PASS] = "" 'パスワードをクリア
Forms![F_LOGIN]![USER_ID].SetFocus 'フォーカスをID選択へ
は、おまけで、表示データのクリアとフォーカスをID選択へ持って行ってます。
( 参照 )
/*
* 5.おわりの挨拶
*/
Closeしないで、.Visible = Falseでメモリ上にロードされた状態で残しておく
と
残しておいたフォームに対して、
Forms![フォーム名]![コントロール名].プロパティやメソッド
で、アクセス可能なことがわかったと思います。
サンプルファイルは、
http://www.ken3.org/vba/lzh/vba067.lzh
にdb067-97.mdbが保存されています。
(Access97形式、2000の人は変換してね)
マスターテーブルにデータを追加して、遊んでみてください。
なんか、スッキリしないけど。。。。
次回はたぶん、続きで、入力テーブルにデータをやっとセットします。
拾い読みして、
1つでも何かの参考となれば幸いです。
Excel/Access大好き、三流プログラマーKen3でした。
----------------------------------
関連項目(ただのバックナンバー紹介)
----------------------------------
[No.66 Access ユーザーマスターのチェックとメニュー切り替え]
http://www.ken3.org/backno/backno_vba14.html#66
簡単なログイン処理と今回の元になるいいかげんな設計を書いてます。
--------------------
読者からのお便り紹介
--------------------
In message "uhcd.sys 確認。",
いちにいさん wrote...
>やっぱ、OS毎入れ換えんとダメやね。
>色々と絡みがありそうだし。
>一体何処が違うんやろ。はぁ〜。
>
>んじゃ。派遣がんばってね。(女の子が沢山居る職場(笑))
----
女の子がたくさん居る職場かぁ・・・
※たくさん居てもイイ思いで無かったしなぁ(実話(笑))
http://www.ken3.org/etc/500yen/zaitaku.html
に転職・SOHO・派遣の情報載せつつ、自分でも探そうとしてるけど、
女の子が多い、そんな条件が検索できるといいね(オイオイ)
社員数100名とかじゃなくて、
男性90名女性10名、男性60名女性40名とか?
えっ、女の子にKen3は相手にされないからイミ無いって(笑)
まぁ、そんな男女比は置いといて(そんなの載ってないよ)、
たまに平均年齢24.3歳の若い会社とかアピールしてるよね。
人との出会いは何かの縁だから、。。。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<Excel Formで値を設定、標準モジュールで使用したい>
こんにちは、三流プログラマーKen3です。
今回は、ハシ休めで(飛び飛び解説とも言う)
Excel UserForm で設定した値を標準モジュールで使用したいと思います。
サンプルファイルは、
http://www.ken3.org/vba/lzh/vba068.lzh
にtest068-Book.xlsが保存されています。
/*
* 1.今回のキッカケ
*/
HPの問合せフォームを使ってくれて、下記の問合せが来ました。
---
>まささん <*********@hotmail.com > から
>こんばんは。はじめまして。
>以下の質問があります。
>メインプロシジャからユーザフォームを呼び出し、ユーザフォームで
>値を入力後、ユーザフォームに作成したコマンドボタンを押下するこ
>とにより、ユーザーフォームに作成したプロシジャ内でその値を変数
>に入れる。その後、メインプロシジャに戻り、ユーザフォームで値を
>入れた変数をメインプロシジャで使用することはできますか。
>できるならその方法を教えて下さい。
>お手数ですが、宜しくお願いします。
----
さてと、やりたいことを整理して、
[メインプロシージャ]
ユーザーフォームを開く
・
・ユーザーフォームが終了まで待つ
・
ユーザーフォームで設定された値を利用して
XXXXXXと処理を行う
[ユーザーフォーム]
テキストボックスや他のコントロールで値をいじる
コマンドボタンが押されたら値を呼び出しモジュールに返したい
まずは、値を無視して、ユーザーフォームを開いて閉じるまで、
呼び出し側が止まっているか、通過するか、チェックしてみます。
Sub test()
UserForm1.Show 'ユーザーフォームの表示
MsgBox "終了" '確認メッセージ
End Sub |
実行すると、ユーザーフォームが表示され、
フォームを閉じると、
終了のメッセージが表示されました。
このことから、ユーザーフォームが終了するまで、
メインのモジュールは待たされていることが確認できました。
あとは、値のやり取りかぁ。
/*
* 2.グローバル変数経由でやってみたいと思います。
*/
画面でグー・チョキ・パーと名前を受取りたいと思います。
※フォームの入力は
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 |
たんにPublic宣言した変数に値をセットしてます。
strName = Me.txtUSERNAME.Text
みたいに普通に使ってます。
で、普通にフォームをUnload Meで閉じます。
実行結果は、
参照
/*
* 3.なつかしの乱数でジャンケン(笑)
*/
チョイ前、乱数でジャンケンを行うサンプルを書きました。
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 |
ただ、ユーザーフォームを呼び出して、値を代入しただけです。
こんな感じで、グローバル変数経由で値を処理することが出来ます。
いろいろと遊んでみてください。
/*
* 4.おわりの挨拶
*/
今回のポイントは、
・ユーザーフォームが閉じるまで処理を待ってくれる
・グローバル変数の宣言方法と使い方
サンプルファイルは、
http://www.ken3.org/vba/lzh/vba068.lzh
にtest068-Book.xlsが保存されています。
拾い読みして、
1つでも何かの参考となれば幸いです。
Excel/Access大好き、三流プログラマーKen3でした。
<Access コンボボックスを自動で開きたい>
こんにちは、三流プログラマーKen3です。
今回は、
掲示板に質問があった、
Access コンボボックスを自動で開きたい
です。
/*
* 1.今回のキッカケ
*/
掲示板、
http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi?mode=allread&no=99&page=0
に来た質問です。※何か質問あったら遠慮なく、回答遅いけど。
---
>投稿時間:2003/04/25(Fri) 14:33
>投稿者名:miki
>タイトル:accessでコンボボックスを自動で開く方法について
>
> accessフォームのコンボボックスで、フォーカスを取得したら自動
>的にリストが開くようにしたいのですが、方法がいまいちわかりません
>。フォーカス取得時のイベントでF4キーの送信をすればいいのだと思
>うのですが、キー送信の書き方が解りません。ヒントを頂けたら大変有
>り難いです。
> 上記以外の良い方法がありましたらそれもご教授いただけると嬉し
>いです。
---
さて、やりたいことを整理して、
と思ったら、もう整理されてますね。
F4 keyの送り方ですね。
/*
* 2.SendKeysでF4_Key(特殊なキー)を送る方法
*/
SendKeys "{F4}"
~~~~~~~~~~~~~~~
でF4を送ることが出来ます。
ポイントは
{F4}
^^^^^^^^^と{}でF4を囲うぐらいかなぁ。(Access97で確認)
ヘルプを見ると、
BackSpace {BACKSPACE}、{BS}、または {BKSP}
Ctrl + Break {BREAK}
Enter {ENTER}または {~}
・
・
・
Tab {TAB}
↑ {UP}
F1 {F1}
など載っているので、確認してください。
あとは、コンボボックスのフォーカスXXX系のイベントに書けばOKだと思います。
If Len(コントロール & "") = 0 Then
SendKeys "{F4}"
End If
みたいにして、選択されて無い時だけ開くと、お客さんに喜ばれると思います。
※毎回通るたびに開くとうざいので。
コンボボックスイベント
何かの参考となれば幸いです。
では、また。
/*
* 3..Dropdown ってあるらしい
*/
なんか、忘れてない?
えっ、できたよF4送って開けたよ。
ここ、ここ。
> 上記以外の良い方法がありましたらそれもご教授いただけると嬉し
> いです。
ほかの方法ありませんか?知ってたら教えて。
読み替えると?プロならもっと良い方法しってるだろ、隠さず教えろよ?
なんては言ってないけど、
自分はこの道(方法)で目的地に向かいます。
もっと簡単な道(方法)あったら教えてくださいかぁ、、、
向上心が含まれてる質問だよね。
※類似品で、オレ様の方法はコレ、これよりいい方法出してみろ三流PG
と完璧回答送ってくるのもありだよねぇ(そんなイヤな人居ないけど)
そんな時間稼ぎはいいから、ハヤク教えろ。
はいはい、
コンボボックスのコントロールに
.Dropdown ってあって、これがスバリみたいです。
使い方は、簡単で、
Private Sub USER_ID_Enter()
Me!USER_ID.Dropdown
End Sub |
Me!コンボボックス.Dropdown でOKです。
なんて私が見つけたように書いたけど、
~~~~~~~~~~~~~~~~~~~~~~~~
たまたま掲示板見てた人にメール貰った。
※なんで直接掲示板に書いてくれないのだろう?
意外と書きにくい空気の掲示板なのかなぁ?
こちらも、時間があったら試してみてね、では、また。
-- 余談 --
[No.157 聞き易い空気・環境を作る(人気者目指して自己分析?)]
http://www.ken3.org/backno/backno_guchi31.html#157
で、軽く
>--- 枠外解説・愚痴 ---
>質問し易い・しにくい空気って在ると思う。
>新人君が2・3人居てA君が先輩に聞きに行ってたりすると、B君も聞きに行き易い。
>誰も書きこまれていない掲示板だと、なんか書きこみにくいよね。
>あっ、例題的には誰も入っていない定食屋・ラーメン屋にはなんか入りにくいよね。
>人が集まっているって安心感があるのかなぁ。
>よく後輩が質問をしに来る先輩には、他の後輩も聞きに行く、それで人気があがる?
>場合もあるので、自分は嫌われてる?
>なんて被害妄想を感じてる中堅社員さんは、
>質問に答えてるって姿を見せるのも手かなぁ。
>
>えっ、質問が来ないほうが自分の作業に集中できていいって?
>質問に答えると自分の勉強にもなりますよ。
>自分を成長させるには他人に教えるコーチをやるのも1つの勉強だと思って、
>ダマされたと思ってやってみてください。
>※新人や後輩から質問・反応こなくなると、私みたいに成長できないですよ(笑)
---
とか適当にほざいてます、暇な時、のぞきに来てください。
/*
* 4.おわりの挨拶
*/
今回のポイントは、
・SendKeys "{F4}"でF4を送り、コンボボックスを自動で開く
・.Dropdownを使用して、コンボボックスを開く
拾い読みして、
1つでも何かの参考となれば幸いです。
Excel/Access大好き、三流プログラマーKen3でした。
--------------------
読者からのお便り紹介
--------------------
掲示板にあった質問なのですが、
http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi?mode=allread&no=100&page=0
>投稿時間:2003/04/25(Fri) 15:12
>投稿者名:たけを
>タイトル:レプリカの同期エラー
>
>いつもメルマガ楽しみにしています。
>XPでACCESS2002を使っているのですが
>複数拠点にて使用するためにデータMDBのレプリカを各拠点で使用し
>週に2度ほど集めて同期をとるといった方法を行っているのですが
>データ更新量が多いと同期エラーがでて同期を取ることができないことがあります。
>ヘルプを見ると
>レジストリのMaxLocksPerFileの設定を超えていますのであるので
>適当に大きくしてもとれず
>他の理由として
>・使用できるメモリ量
>・レコードセットの行のサイズ
>・ネットワークOSの制限
>とあるのですが
>メモリは512Mつんでいますし
>レコードセットの行サイズは一度無理をしてテーブルを2つに分けたので
>これ以上分割するとわけのわからない構造になってしまいます。
>現在エラーの起きるテーブルは
>全部で10フィールドで
>内訳は
>オートナンバー 1
>超整数 1
>数値バイト 3
>テキスト50文字 2
>通貨 1
>日付 1
>Yes/No 1
>となっています。
>そのほかにレプリカにしたら自動でできるフィールドがあります。
>ネットワークOSの制限というのもローカルHDに持ってきても
>同期エラーになりとれませんでした。
>どうにか同期エラーが起きなくしたいのですがどなたか解決方法はないでしょうか。
----
何かヒントでもある人は助けてあげてください。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
私も探してるけど、いつもの姑息な逃げ手も浮かばなくて。。。
検索して目的の情報を探す。
目的の情報を探すには、最近はググれとよく聞きます。なので、検索ボックスを付けました。
いろいろなキーワードを入れて、検索してみてください。
ページフッター
ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。
質問や要望など メッセージを送る(三流君に連絡する)
質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
|
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
|
急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。
リンクや広告など
項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。
開発時の操作:
[F1を押してHELPを見る]/
[Debug.Print と イミディエイトウインドウ]/
[実行時エラーでデバッグ]/
[ウォッチ式とSTOP]/
[参照設定を行う]
仕様書(設計書?) XXXX書類:
[基本設計書や要求仕様書]/
[テスト仕様書 テストデータ]/
[バグ票]/
[関数仕様書]/
[流れは 入力・処理・出力]
Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です
Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます
Blog:[三流君の作業日記]/
[サンプルコードのゴミ箱]/
広告-[通販人気商品の足跡]
[三流君(TOP ken3.org へ戻る)]
/ [VBA系TOPへ]
/ [VBA系バックナンバー目次へ移動]