MS Access Tips/Sample and VBA and Blog customize etc...

ID, パスワードが一致したらフォームを開く

ID, パスワードを登録したテーブルがあり、ログイン用のフォームでIDとパスワードをユーザーに入力してもらい、IDとパスワードがテーブルのものと一致したら、次のフォームが開くようにしたいのです。

知恵袋で上記のような質問がありました(一部改変)。以前にも同じような質問に回答したことがあります。

WEB検索すればありそうなのですが、そのものズバリは意外とないようですので、アップしておきます。

FrmRogIn.png

難易度:

仕様

テーブル名 T_ID_pass

フィールド データ型
ID テキスト型
pass テキスト型

ログインフォーム F_LogIn
ID入力テキストボックス txtID
パスワード入力テキストボックス txtPass ログインコマンドボタン cmdLogIn

下記の設定にしておくのをお勧めします。
ログインフォームを「起動時のオプション」でに最初に開くフォームに指定。「作業ウィンドウ固定」を「はい」にしておく。txtPass の「定型入力モード」を「パスワード」に設定。

ログイン完了後、呼び出されるフォーム F_入力

モジュール

ログインボタンのクリック時

Private Sub cmdRogIn_Click()
Dim Res
If IsNull(Me.txtID) Then
MsgBox "IDを入力してください"
Me.txtID.SetFocus
Exit Sub
End If
If IsNull(Me.txtPass) Then
MsgBox "パスワードを入力してください"
Me.txtPass.SetFocus
Exit Sub
End If
Res = DLookup("Pass", "T_ID_pass", "ID='" & Me.txtID & "'")
If IsNull(Res) Then
MsgBox "該当するIDはありません。正しいIDを入力してください。"
Me.txtID.SetFocus
Exit Sub
End If
If Res = Me.txtPass Then
DoCmd.OpenForm "F_入力" '----ID,pass合致でフォームを開く。
DoCmd.Close acForm, "F_LogIn"
Else
MsgBox "パスワードが異なります。", vbOKOnly + vbCritical
Me.txtPass.SetFocus
End If
End Sub

注: これはあくまでフォームでIDとパスワードのチェックをするだけのもので、セキュリティを考慮したものではありません。

エラー対策、SQLインジェクション対策

上記のコードでは実は、txtID に引用符(')を含む文字列を入力されるとエラーになります。さらには、SQLインジェクションを利用されるおそれもあります。例えば、txtID に

' OR 'A'='A
と入力されると、
Res = DLookup("Pass", "T_ID_pass", "ID='" & Me.txtID & "'")
If IsNull(Res) Then
MsgBox "該当するIDはありません。正しいIDを入力してください。"
のチェックは通過してしまいます(次のpassのチェックで引っかかるので実害を受ける可能性は低いですが)。詳細は、SQLインジェクションでWEB検索してみてください。

対策としては、引用符(')を '' に置換してエスケープさせることで、回避できます。

Res = DLookup("Pass", "T_ID_pass", _
"ID='" & Replace(Me.txtID, "'", "''") & "'")
If IsNull(Res) Then
MsgBox "該当するIDはありません。正しいIDを入力してください。"

サンプルMDB が下記からダウンロードできます。
FrmRogIn_07.zip (Access 2007 形式 - 18kb)
FrmRogIn.zip (Access 2002-2003 形式 - 17kb)
FrmRogIn_2k.zip (Access 2000 形式 - 17kb)

29 Comments

t.t says..."LOGIN画面ででデータベースウインドウを表示させない"

hatena様
accessクラブでいつもお世話になっている超初心者のt.tです。
いつもありがとうございます。

hatenachipsでLOGIN画面の記事が出ていました。
大変参考になったのですが、データベースウインドウが
表示されパスワード管理TBLを開くことができるため
パスワードとIDを持っていない人までDBにアクセス
出来てしまいます。

起動時の設定でデータベースウインドウを表示させない
方法をとってもSHIFTキーを押しながら開くボタンを押す
と、データベースウインドウが表示されてしまいます何か
良い方法は無いのでしょうか?
教えて下さい。

よろしくお願いします。

2010.03.06 17:58 | URL | #- [edit]
hatena says..."Shiftキー起動を無効"

t.tさん、こんにちは。

Shiftキー起動を無効にする方法があります。
「Acess AllowBypassKey」でWEB検索してみてください。

これで完全というわけではありませんが、かなり、有効な方法です。

2010.03.07 18:30 | URL | #5uE6dEgY [edit]
t.t says..."SHIFTキーを無効にする"

hatena様

t.tです。

「Acess AllowBypassKey」でWEB検索してみました。

accessクラブで丁寧に解説してありました。
手順書に従ってやるとSHIFTキーを押しながら開くボタン
を押すしてもデータベースウインドウが表示されなくなりました。

ありがとうございました。










2010.03.09 10:07 | URL | #- [edit]
cazz says..."ID コンボボックス"

調べていたらこちらにたどり着きました。
上記のように設定は出来たのですが、
IDをテキスト入力ではなく、コンボボックスで選んで
パスワード入力するようにはできないでしょうか?
よろしくお願いします。

2013.06.15 16:30 | URL | #8iCOsRG2 [edit]
hatena says..."re: ID コンボボックス"

デザインビューで ID のテキストボックスを右クリックして「コントロールの種類の変更」→「コンボボックス」をクリック。
値集合ソース を T_ID_pass と設定する。

以上でOKです。

2013.06.15 17:30 | URL | #5uE6dEgY [edit]
cazz says..."ID コンボボックス"

ありがとうございます。
なんとか出来ましたが、ログイン画面が出たときに
「#エラー」が出ます。値集合ソースでセレクトしてるせいみたいですが、消す方法ありますでしょうか?
これをしないとIDごとの売上が反映されなくなってしまいます。
よろしくお願いします。

2013.06.15 18:16 | URL | #8RmuVk9E [edit]
hatena says..."「#エラー」"

値集合ソースに設定するのは実際のテーブル名にしてますよね。

もしそうなら、原因は別にあると思います。

このページのサンプルで前回の回答のように設定したら問題なく動作しました。

2013.06.15 18:26 | URL | #5uE6dEgY [edit]
cazz says..."#エラー"

わかりました。既定値の部分に「DFirst("[社員 ID]","社員の権限","[権限 ID]=2")と書いてました。これを消すと「#エラー」は出なくなりました。ただ他との連携がなくなりました。

2013.06.15 18:41 | URL | #8RmuVk9E [edit]
hatena says..."他との連携?"

「他との連携」とは具体的にどのようなことでしょうか。

こちらからは、そちらのファイルは見れないので、何をしようとして、どのように設定して、どううまくいかないのか、具体的に説明してもらわないと、回答しようがありません。

2013.06.16 00:30 | URL | #5uE6dEgY [edit]
cazz says...""

すみません。何度も。。

もともとaccessのテンプレート「ノースウィンドウ」から
作ったのですが、ログイン画面で担当者を選んでログイン
すると担当が入力したホーム画面が開きます。
これにパスワードを用いると担が入力したホームが出て来ません。
今はaccess自体にパスワードをかけました。
何かわかるようでしたらお願いします。

2013.06.16 02:00 | URL | #3/2tU3w2 [edit]
hatena says..."情報不足"

> ログイン画面で担当者を選んでログイン
> すると担当が入力したホーム画面が開きます。
> これにパスワードを用いると担が入力したホームが出て来ません。

この部分のコードが間違っているのでしょう。
実際のコードを提示してください。

あと、Access と OS のバージョンも。

2013.06.16 07:21 | URL | #5uE6dEgY [edit]
cazz says..."コード"

Access2013 と OS win7になります。

ログインIDはコンボボックスになっており、

データタブ:
値集合ソース:SELECT 社員区分.社員ID, 社員区分.名前 FROM 社員区分 ORDER BY 社員区分.名前;
既定値:DFirst("[社員 ID]","社員の権限","[権限 ID]=2")

イベントタブ:
更新後処理:埋め込みマクロ
一時変数設定
名前 CurrentUserID
式=[Screen].[ActiveControl]

その他タブ:
名前:cboCurrentEmployee
タグ:CurrentUserSelector~Extensions=NWDefaultToPurchaseApprovalsUser~EditListItemsForm=Employee List~TableOrQueryName=Employees Extended~SourceID=ID~Column1=Employee Name~Column2=Job Title


ログインボタン
クリック時:埋め込みマクロ
if Not IsNull([cboCurrentEmployee]) Then
一時変数設定
名前:CurrentUserID
式=[cboCurrentEmployee]

フォーム開く:ホーム

のようになってます。わかりづらいですよね。
基本的にはaccessのテンプレート「ノースウィンドウ」から
作っています。

よろしくお願いします。

2013.06.17 00:24 | URL | #8iCOsRG2 [edit]
hatena says..."埋め込みマクロ"

埋め込みマクロですね。

このページで紹介している方法はVBAを使ってます。

このコメント欄で質問しているので、このページの方法でうまくいかないということだと思ってました。

埋め込みマクロは読みづらいですし、テンプレート「ノースウィンドウ」からどのように変更しているかも不明なので、ここでは回答は難しいです。(私自身は、普段、埋め込みマクロを使ってません)

このページの方法でうまくいかないということなら、どのようなコードを書いたのか提示していただければアドバイスすることは可能です。

2013.06.17 00:46 | URL | #5uE6dEgY [edit]
cazz says..."vba"

ありがとうございます。
逆に埋込みを使わないで、ログインidパスワードを使って違うフォーム開き、id引き継ぐvbaの書き方はどうすればいいでしょうか?

2013.06.17 21:32 | URL | #8iCOsRG2 [edit]
hatena says..."id引き継ぎ"

いろいろな方法がありますので、状況に応じて最適なのを選べばいいでしょう。

・OpenFormメソッドの OpenArgs引数で渡す

・グルーバル変数を使う

・ログインフォームを閉じずに、非表示にするだけにして、参照する。

・TempVars(一時変数)オブジェクトに格納する。

など。


TempVars の場合のコード例

このページのコードの21行目の後に下記のコードを挿入

  If Res = Me.txtPass Then
    TempVars.Add "MyID", Me.txtID 'IDを一時変数に格納
    DoCmd.OpenForm "F_入力" '----ID,pass合致でフォームを開く。
    DoCmd.Close acForm, "F_LogIn"


入力フォームで参照する場合
テキストボックスに表示させるには、コントロールソースを
=[TempVars]![MyID]

VBAで参照する場合は、TempVars!MyID で参照できます。


このページのサンプルを前提のコードですので名前等は実物のものに変更してください。

2013.06.18 02:03 | URL | #5uE6dEgY [edit]
cazz says..."id引き継ぎ"

ありがとうございます。

下記のコードを
-----------------------------------------
If Res = Me.txtPass Then
DoCmd.OpenForm "F_入力" '----ID,pass合致でフォームを開く。
DoCmd.Close acForm, "F_LogIn"
Else
-----------------------------------------
下記のコードに変更して

If Res = Me.txtPass Then
    TempVars.Add "MyID", Me.txtID 'IDを一時変数に格納
    DoCmd.OpenForm "F_入力" '----ID,pass合致でフォームを開く。
    DoCmd.Close acForm, "F_LogIn"
-----------------------------------------
下記の入力は、どこにいれるのでしょうか?

-----------------------------------------
入力フォームで参照する場合
テキストボックスに表示させるには、コントロールソースを
=[TempVars]![MyID]
-----------------------------------------
よろしくお願いします。

2013.06.18 18:47 | URL | #- [edit]
hatena says...""

> 下記の入力は、どこにいれるのでしょうか?
>
> -----------------------------------------
> 入力フォームで参照する場合
> テキストボックスに表示させるには、コントロールソースを
> =[TempVars]![MyID]
> -----------------------------------------

ID を表示したいテキストボックスのコントロールソースに設定します。

2013.06.18 19:02 | URL | #5uE6dEgY [edit]
cazz says..."コード"

何度もすみません。
サンプルを試しにやってみました。

「F_入力」に「テキストボックス」を作り、コントロールソースに
「=[TempVars]![MyID] 」を入れましたが、動作はするのですが、
IDが表示されませんでした。

他には何をすればよいでしょうか?

よろしくお願いします。

2013.06.18 22:42 | URL | #- [edit]
hatena says..."コード訂正"

一時変数に格納するコードを下記に変更してください。

    TempVars.Add "MyID", Me.txtID.Value 'IDを一時変数に格納

.Valueを追加しました。

サンプルをこのコードに変更して、=[TempVars]![MyID] でIDが表示されるのを確認しました。(Access2010ですが)

2013.06.19 00:03 | URL | #5uE6dEgY [edit]
cazz says..."コード訂正"

さっそく試してみましたが、表示されません。
サンプルで試しているのですが、何か名前を加えるのでしょうか?
よろしくお願いします。

コード
 
   Option Compare Database
Option Explicit

Private Sub cmdRogIn_Click()
Dim Res
If IsNull(Me.txtID) Then
MsgBox "IDを入力してください"
Me.txtID.SetFocus
Exit Sub
End If

If IsNull(Me.txtPass) Then
MsgBox "パスワードを入力してください"
Me.txtPass.SetFocus
Exit Sub
End If

Res = DLookup("Pass", "T_ID_pass", _
"ID='" & Replace(Me.txtID, "'", "''") & "'")
If IsNull(Res) Then
MsgBox "該当するIDはありません。正しいIDを入力してください。"
Me.txtID.SetFocus
Exit Sub
End If



If Res = Me.txtPass Then
DoCmd.OpenForm "F_入力" '----ID,pass合致でフォームを開く。
DoCmd.Close acForm, "F_LogIn"
Else

If Res = Me.txtPass Then
TempVars.Add "MyID", Me.txtID.Value 'IDを一時変数に格納
DoCmd.OpenForm "F_入力" '----ID,pass合致でフォームを開く。
DoCmd.Close acForm, "F_LogIn"
End If

MsgBox "パスワードが異なります。", vbOKOnly + vbCritical
Me.txtPass.SetFocus
End If
End Sub


「F_入力」に「テキストボックス」を作りコントロールソースに
=[TempVars]![MyID] を入れただけです。

よろしくお願いします。

2013.06.19 11:02 | URL | #- [edit]
hatena says..."コードの挿入位置"

コードの挿入位置がおかしいです。
全部出しますね。

Private Sub cmdRogIn_Click()
Dim Res
  If IsNull(Me.txtID) Then
    MsgBox "IDを入力してください"
    Me.txtID.SetFocus
    Exit Sub
  End If
  
  If IsNull(Me.txtPass) Then
    MsgBox "パスワードを入力してください"
    Me.txtPass.SetFocus
    Exit Sub
  End If
    
  Res = DLookup("Pass", "T_ID_pass", _
    "ID='" & Replace(Me.txtID, "'", "''") & "'")
  If IsNull(Res) Then
    MsgBox "該当するIDはありません。正しいIDを入力してください。"
    Me.txtID.SetFocus
    Exit Sub
  End If
  
  If Res = Me.txtPass Then
    TempVars.Add "MyID", Me.txtID.Value 'IDを一時変数に格納
    DoCmd.OpenForm "F_入力" '----ID,pass合致でフォームを開く。
    DoCmd.Close acForm, "F_LogIn"
  Else
    MsgBox "パスワードが異なります。", vbOKOnly + vbCritical
    Me.txtPass.SetFocus
  End If
End Sub

2013.06.19 16:15 | URL | #5uE6dEgY [edit]
cazz says..."コード"

ありがとうございます。
出来ました。
表示はされたのですが、F_入力に「サブフォーム」を作り
ログインしたIDのみのデータが表示するようにしたいのですが、
うまくいきません。
それと、全画面表示でコントロール類が中央になるような設定も
できますでしょうか?
図々しくてすみません。よろしくお願いします
「ウィンドウを表示させない」はうまくできました!
よろしくお願いします。

2013.06.19 18:45 | URL | #- [edit]
hatena says..."別の掲示板で"

> 表示はされたのですが、F_入力に「サブフォーム」を作り
> ログインしたIDのみのデータが表示するようにしたいのですが、
> うまくいきません。
> それと、全画面表示でコントロール類が中央になるような設定も
> できますでしょうか?

このページの記事の内容とは関係ないことになりますので、別にAccess系の掲示板で質問しなおしたほうがいいと思います。

このようなやりとりにブログのコメント欄は向いていませんので。

サブフォームにログインしたIDのみ表示させるのは、簡単なので、回答しておきます。

ID を表示ているテキストボックス名を txtID とします。

サブフォームのレコードソースのフィールド名を ID とします。

サブフォームのプロパティを下記のように設定します。

リンク親フィールド txtID
リンク子フィールド ID

以上です。

2013.06.19 19:15 | URL | #5uE6dEgY [edit]
cazz says...""

ありがとうございます。

長々すみませんでした。

頑張ってみます。

また、参考にさせていただきます。

ありがとうございました。

2013.06.19 22:17 | URL | #- [edit]
hatena says..."moug の Access(VBA)掲示板"

> それと、全画面表示でコントロール類が中央になるような設定も
> できますでしょうか?

どうしてもうまくできないようでしたら、
VBAが必須になりますので、
下記で質問するがお勧めです。

Excel VBA を学ぶなら moug モーグ|Access (VBA)
http://www.moug.net/faq/viewforum.php?f=4

2013.06.21 17:19 | URL | #5uE6dEgY [edit]
KY says..."一時変数の値を保存"

突然失礼します。
いつもAccessで困った際に参考にさせていただいております。

このページを参考にログインフォームを作成し、開いた入力用フォームで
データを入力します。
フォームで入力したデータはテーブルに保存するのですが、一時変数で表示させているユーザー名も同じテーブルに保存する事は可能でしょうか。

もしお分かりになるようでしたらご教授いただけると幸いです。

宜しくお願い致します。

2014.08.15 19:18 | URL | #ZKhxdi3Y [edit]
hatena says..."re:一時変数の値を保存"

> フォームで入力したデータはテーブルに保存するのですが、一時変数で表示させているユーザー名も同じテーブルに保存する事は可能でしょうか。

フォームの更新前処理で、代入すればいいのでは。

Me.ユーザー名 = 一時変数

2014.08.16 14:48 | URL | #5uE6dEgY [edit]
KY says...""

hatenaさんご教授ありがとうございます。

> フォームの更新前処理で、代入すればいいのでは。

Me.ユーザー名 = 一時変数
とあるのですがこれは入力用フォームの更新前処理に対してとの理解で宜しいでしょうか。
説明不足でありましたが、元々は入力フォームにある入力者と言うテキストボックスへマニュアルで各ユーザーがユーザー名を入力しておりましたが、出来ればこの入力を省きログイン時のID(一時変数)を上記テキストボックスのフィールドへ代入しテーブルのフィールドへ保存出来ないかと思った次第です。

少し試してはみましたが、うまく行きませんでした。

誠に申し訳ありませんが、もう少し詳細の方法をご教授いただけると幸いです。
宜しくお願い致します。

hatenaさん

お世話になっております。
上記の件ですが、別のフィールド(入力必須)の更新後処理で代入する事で出来るようになりました。
お騒がせしてすいませんでした。

因みに、T_ID_passテーブルにIDとPW以外にUserNameというフィールドを設け一時変数として格納する値をLoginIDではなくUserNameにする事は可能でしょうか。

2014.08.22 16:25 | URL | #ZKhxdi3Y [edit]
monster_777 says..."教えてください。"

検索していると、たどりつきました。

hatena さま ご教授お願いします。

現在、メイン画面は、Switchboard のメニュー選択となっています。
埋め込みマクロでボタンをクリックすると、それぞれのフォームが開きます。メニュー数は、4メニューぐらいです。

登録したIDによって、開けるメニューの制限をしたいと思っています。

よろしくお願いします。

2016.03.26 16:54 | URL | #- [edit]

Leave a reply






Trackbacks

trackback URL
https://hatenachips.blog.fc2.com/tb.php/220-a53c2c42
該当の記事は見つかりませんでした。