出産前後の痔にはご注意!

いろいろなサイトを参考にアクセスを勉強しはじめたところです。


個人情報保護のためにログインユーザのみが自分の情報を閲覧できるようにしたいと思っています。
(商品テーブルがあったとして、八百屋さんがログインしたときは八百屋さんのデータだけを、、という感じに)

今のところはユーザ毎にログインしたIDが抽出条件になっていてそれをサブフォームに表示させたいと思っております。
VBAでログインIDを取得することまではできたのですが、それを抽出条件にする方法がわかりません。

例えばVBAで取得した結果をクエリの抽出条件に代入することは可能なのでしょうか?

抽象的な質問の仕方になってしまっているかと思いますが、、よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

折角のやる気に水をさすようで残念ですが


VBA でどんなに足掻いても、所詮はAccessですから
それなりのモノにしかなりませんよ。 キッパリ
セキュリティの観点から考えると
1・OSレベルのアクセス権で制御(ユーザー分ファイルを分割しなくてはならない)
2・Accessのワークグループ情報に基づく制御
MDBファイルであれば有効ですがACCDBではなくなってしまいました。
Access 2003 のユーザーレベル セキュリティを Access 2010 で設定または変更する
http://office.microsoft.com/ja-jp/access-help/HA …
またユーザーごとにテーブルを分けなくてはなりませんので
後々管理が煩雑になると思います。
3・VBAで頑張って、最終的に、MDE か ACCDEにしても
分かる人には分かっちゃうので、余り期待しないほうが良いかと。

それを踏まえたうえで、クエリの抽出条件に
environ("username")
としてみてください。Windowsのログオン名で選択されます。
ただし、大文字・小文字・全角・半角は同一視されます。
    • good
    • 0
この回答へのお礼

丁寧なお返事ありがとうございます。

そもそもアクセスがなんたるかを知らずにおそるおそるテーブルをつくって、、と作業を進めていて躓いて困っていたところでした。

頂いた回答をもとに上司(私同様にほとんど素人です)と相談したところ、

1・OSレベルのアクセス権で制御(ユーザー分ファイルを分割しなくてはならない)
→不可:端末管理は他部署担当のために依頼しても断られるとのこと

2・Accessのワークグループ情報に基づく制御
→不可:上記理由に加え、私が現場から離れても素人レベルでメンテナンスできるものをつくってくれとのこと

3・VBAで頑張って・・・
→苦慮中:いろいろ調べたのですが結局のところ、仰るとおりやはりわかってしまうようですね。。
教えていただいたように、environ("username")は試してもう一度上司にセキュリティ上の保証ができない確認をとって作業をつづけるか考えなおしてみようと思います。

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

お礼日時:2011/03/27 10:41

クエリの条件とするには、


テーブルの値で結合か抽出条件に記載するかと思います。

案1)
ログイン者テーブルを作って、値(八百屋さんのID)を格納して、
八百屋さん、魚屋さん、おもちゃ屋さんらの元にするテーブルと、
項目結合すればできるのではないでしょうか。

案2)
global変数に格納したら抽出条件に記載できないか。


フォームなどでも画面のどこかに現在のログイン者を表示させるかと思うので、
mdbのどこでも使えるものとして確保したらいいのではと思います。
    • good
    • 0
この回答へのお礼

早速のお返事ありがとうございます。

頂いた回答(案1)をすぐに試してみたのですが、私の技術がまだまだ初心者レベルのために四苦八苦しております。ツール作成の要件として、私以外の(ほぼ)素人がメンテナンスが可能なものをという指示があったのでそのラインぎりぎりかなと今は上司に方針を含めて確認をとっているところです。
(案2)については何度も失敗しながらようやく理解が進んできたところです(未だ成功には至っていませんが、、)。
少なくとも要求されている要件が入門者レベルの私には合っていないとよくわかったので合わせて上司に再度相談してみます。
個人情報の徹底管理・誰にでもメンテナンスできる簡易性、両方を満たすのは難しいのだと思いました。

お手間とらせて申し訳ありませんでした。
お返事ほんとうにありがとうございました。

お礼日時:2011/03/27 10:51

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QACCESSでフォームを使って、テーブルを参照、データ入力、データ更新をしたいのです

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入力画面
       ↓
レコード番号を入れると、そのレコードのデーターが画面に表示され、
その画面で修正可能
       ↓
 保存 ボタンで保存

という流れです。

レコードナンバーはIDを使おうと思っています。

データの量が莫大な為、コンポボックスなどは使えません。

できるだけ、VBAなどは使わずに作りたいです。

よろしくお願い致します。

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入...続きを読む

Aベストアンサー

まずそのテーブルを基にしてフォームを作成します。
そのフォームのヘッダー部分にテキストボックスを配置後、一旦
上書き保存。
フォームのレコードソースを
SELECT *
FROM テーブル名 WHERE ID=[Forms]![フォーム名]![テキストボックス名]
とします。
次にテキストボックスの更新後処理に
Me.Requery
とすれば完成です。
フォームを開いてテキストボックスにID入力後エンターしてください。

保存に関しては、コマンドボタン作成後クリック時イベントに
DoCmd.RunCommand acCmdSaveRecord
とすれば良いでしょう。

この手のモノは検索すれば相当数ヒットするので、そちらを参考にされるのもよろしいかと。

QアクセスVBAのMe!と[ ]

基本的なことですみません。

アクセスのイベントプロシージャで、Me!ってありますけど、これはどういう意味なんでしょうか?

また、Me!の後に、Me!.~~と書く場合と、Me!.[~~]と書く場合がありますが、どこが違うのでしょうか?

Aベストアンサー

>プロシージャ内で[]を使う場合は、そのフォーム外のオブジェクトを使う場合と考えてよろしいでしょうか?
別のオブジェクトを使う場合だけではありません。
Hensu = Me![Text1]のようにHensuという変数に自身のTest1の値を代入する場合のように。
[]で括られているのがオブジェクト名やコントロール名だよという事。
クエリの抽出条件に存在しない[?]とすれば?というコントロール等が参照できないので?というダイアログが表示されるように?というオブジェクトやコントロールは何?と聞いてくるように。
>フォーム内のオブジェクトの場合はあくまでMe!で良いのでしょうか
Forms.[フォーム名]![コントロール名]やForms![フォーム名]![コントロール名]が構文。
アクティブなフォームが自分自身ならForms![フォーム名]の変わりにMeでもOKですという事。

と言う解釈の方が良いと思います。

Qアクセエスのレコードの更新をVBAでするには?

アクセスで、一覧表のフォームにボタンを取りつけています。レコードの内容を変更したら、ペンの形のマークが現れますね。これは変更中ということですが、そこでボタンを押しても変更は確定されないから、更新確定させたいのです。

それで、DoCmd.Requery を最初の行に入れてみたら、元の一覧表は最初のレコードに飛んでしまう。

元の一覧表の位置を動かさないために、Ctrl+Enter キーを押して更新確定させたような状態をVBAで実現する方法あるのでしょうか?

よろしくお願いします。

Aベストアンサー

No1 です。
今回の場合には
Docmd.RunCommand acCmdSaveRecord の方が良かったですね
文字通りレコードを保存します。
Requery に引きづられてしまいました (^_^;)

Recalc、Refresh、Requery の使い分けは下記が参考にはなりますか?
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QACCESSでVBAから選択クエリの抽出条件を指定したい

選択クエリの抽出条件はデザインビューの「抽出条件」欄に直接条件式を書き込むのが普通だと思いますが、この条件式をVBAで記述することは出来るでしょうか?

DoCmd.RunSQL ではアクションクエリしか実行できないようだし、
DoCmsOpenQuery では引数に抽出条件を指定することが出来ないし困っています。

Aベストアンサー

おつかれさま~(^_^)
惜しいですね!
もう少しですね

さてさて、明日出張なので今日はたぶん最後のレスになってしまいますが、
ちなみに明日は返答できないのであしからず。。。

> Forms("サブフォーム").RecordSource = strSQL
駄目でしたか。。。

もし私が記載した内容で埋め込みのサブフォームを
利用しているのであれば
自分を参照する為に「Me」を使って

Me.埋め込みフォーム.Form.RecordSource = StrSQL
Me.埋め込みフォーム.Requery

に変更すれば動くと強く思います。
# 念じてます(^^)

ちなみに、
Me.
と打ち込んだ時点でオートコンプリート(名称あってるかな~)
機能が働いて参照できるオブジェクトが表示される
はずです。
その中にKojiさんが書いた埋め込みオブジェクトが
きっとあるはず
もしかすると"FormA"とか名前を付けたつもりでも
Visual Basic Editor君が気を利かせて
Form_formA
とかになってる場合があります。
最近やってないんでうろ覚えなんですが、こんな処を注意すれば大丈夫!

追伸
このコードって検索とかで使えますから
覚えておくときっと役に立ちますよ♪

おつかれさま~(^_^)
惜しいですね!
もう少しですね

さてさて、明日出張なので今日はたぶん最後のレスになってしまいますが、
ちなみに明日は返答できないのであしからず。。。

> Forms("サブフォーム").RecordSource = strSQL
駄目でしたか。。。

もし私が記載した内容で埋め込みのサブフォームを
利用しているのであれば
自分を参照する為に「Me」を使って

Me.埋め込みフォーム.Form.RecordSource = StrSQL
Me.埋め込みフォーム.Requery

に変更すれば動くと強く思います。
# 念じてま...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QAccessのフォームのみ表示させたい

Accessを起動した際、フォームのみ表示するにはどうすればよいのでしょうか?
(Accessを起動すると、オブジェクトメニュー?(テーブルやクエリ等のオブジクトを選択するウィンドウ)を表示させないで、フォームのみを表示させるには?)
また、上記と同じようにして、なおかつAccessを起動させないでフォームで起動や終了といったことが出来るのでしょうか?
やはりこれはVB等プログラミングでないと出来ないのでしょうか?ちなみに私はプログラミングは全く出来ません。
わかる方、教えて下さい。宜しくお願いします。

Aベストアンサー

ツールメニュー
”起動時の設定”を開き

フォーム/ページの表示にて起動時に表示させたいフォームを選択すれば、そのMDBを開いた時に、該当のフォームが表示されます。

メニュー画面等を作り、各処理のフォームを開いたり、アクセスを終了するマクロを呼び出すボタンを作ればフォームからの終了等も可能です。

また、データベースウィンドウの表示のチェックボックスを外せば、質問者様の言われているオブジェクトメニューは表示されなくなります。

メンテナンス等を行いたい時はshiftキーを押下しながら立ち上げればデータベースウィンドウが表示できます。

QDAOとADOの違いについて

Accessからイントラネット上のデータベースに接続するための接続方法で困っています。
DAOとADOの違いが分からず困っています。
メリット、デメリットが分かる方、どうか教えてください。

宜しくお願い致します。

Aベストアンサー

DAO(データアクセスオブジェクト)はAccessで使用されるMicrosoftJetデータベースエンジン を公開した最初のオブジェクト指向インターフェイスです。DAOは単一システムのアプリケーションや小規模でローカルなネットワークで使用するのに最も適しています。
とMSDNライブラリでは説明しています。
DAOはJetデータベースエンジンを対象にして開発されているのでJetのもつセキュリティ機能・データ定義機能などを十分に操作することができます。
ADO(ActiveXDataObjects)ではオブジェクトの種類が簡素化されているためJetデータベースエンジンの細かな機能を制御することができないといった点が不足している部分がありますがADOXやJROの各オブジェクトモデルで使用できる機能を使えばADOで不足している機能をほとんど補うことができます。
DAOはデータベースにAccessを使用するアプリケーションの場合、最大のパフォーマンスを得ることができます。しかしアプリケーションを運用していくうちに規模が大きくなってデータベースをSQLServerに移行することがあるかもしれません。
そのような可能性が含まれているのであれば最初からADOで開発しておいたほうが無難です。ADOはSQLServerに対する処理で良いパフォーマンスを得ることができます。

Jetデータベースエンジンを主なターゲットにしているならDAOで可。それ以外のデータベースを利用するのであればADOを選択する方が良いのではと思います。

DAO(データアクセスオブジェクト)はAccessで使用されるMicrosoftJetデータベースエンジン を公開した最初のオブジェクト指向インターフェイスです。DAOは単一システムのアプリケーションや小規模でローカルなネットワークで使用するのに最も適しています。
とMSDNライブラリでは説明しています。
DAOはJetデータベースエンジンを対象にして開発されているのでJetのもつセキュリティ機能・データ定義機能などを十分に操作することができます。
ADO(ActiveXDataObjects)ではオブジェクトの種類が簡素化されて...続きを読む

Qaccess フォームを開くと「パラメーターの入力」ウィンドウが開いてしまう

access2007
OS:winXP
 access初心者です。
 テーブルにて主キーの変更を行なったらその後フォームを開くたびに「パラメーターの入力」ウィンドウが勝手に出てくるようになってしまいました。
 何も入力せずにOKを押せばそのままフォームは開くのですが煩わしいので非表示にしたいです。
 変更するにはどのようにしたら良いのでしょうか?また、再発防止のためになんでこのような設定になってしまったのかも教えていただけるとありがたいです。

Aベストアンサー

横レス失礼致します。

> 「パラメーターの入力」ウィンドウに出てくる項目はテーブルからは消去したのですが、
> フォームのデザインビューで表示されるフィールドリストの中には残っていました

フィールドリストに残っているということは、そのフォームのレコードソースに指定している
テーブル/クエリに、その名前のフィールドがある、ということを意味しています。
テーブルからは削除済みとのことですので、恐らくそのフォームはレコードソースに
クエリ(又はSQL文)を使用しているものと推測します。

テーブルから削除されたフィールドがクエリ内に残っていると、そのクエリを実行したとき
(→そのクエリをレコードソースとするフォームを開いた場合を含む:コントロールでの
使用有無は問いません)に、「パラメータの入力」ダイアログが表示されます。
ですので、まずはレコードソースに指定しているクエリまたはSQL文の中に、テーブルから
削除したフィールドが残っていると思いますので、探してみてください。
(フィールドリストに、そのフィールドの名前が出ている(=「式1」などになっていない)という
 ことは、クエリのデザインビュー上で「フィールド名: ~」とするか、SQL文上で「As」を
 使用して、別名をつけているものと思います)

横レス失礼致します。

> 「パラメーターの入力」ウィンドウに出てくる項目はテーブルからは消去したのですが、
> フォームのデザインビューで表示されるフィールドリストの中には残っていました

フィールドリストに残っているということは、そのフォームのレコードソースに指定している
テーブル/クエリに、その名前のフィールドがある、ということを意味しています。
テーブルからは削除済みとのことですので、恐らくそのフォームはレコードソースに
クエリ(又はSQL文)を使用しているものと推測します...続きを読む

QAccessログイン権限

Access2003を使用しています。

ログイン画面を作成しておりログイン自体はできたのですが、
管理者とそうでないユーザーに分けて、ログイン時に管理者であればfrm_mainを、
そうでなければfrm_main2を開くようにしたいのですがうまくいきません。

現在の仕様では、ログイン画面(frm_ログイン)とメイン画面(frm_main、frm_main2)があり

テーブル名:tbl_ユーザー
フィールド名:ユーザー名、パスワード、アカウント

アカウントで"1"が管理者、"2"が一般ユーザー
このようになっています。
ーー以下VBAコードーー
Private Sub rogin_Click()

Dim a

If IsNull(Me.[UserName]) Then
MsgBox "ユーザー名が未入力です"
Me.[UserName].SetFocus

ElseIf IsNull(Me.[password]) Then
MsgBox "パスワードが未入力です"
Me.[password].SetFocus

Else
a = DLookup("パスワード", "tbl_ユーザー", "ユーザー名='" & Me.[UserName] & "'")

If IsNull(a) Then
MsgBox "該当する ユーザー名 は存在しません"
Me.[UserName].SetFocus

ElseIf StrComp(a, Me.[password], vbBinaryCompare) = 0 Then

On Error GoTo Err_rogin_Click

Dim stDocName As String
Dim stLinkCriteria As String

If アカウント = "1" Then

stDocName = "frm_main"

Else

stDocName = "frm_main2"

End If

DoCmd.OpenForm stDocName, , , stLinkCriteria

DoCmd.Close acForm, Me.Name

Else
MsgBox "パスワードが違います"
Me.[password].SetFocus

End If
End If

Exit_rogin_Click:
Exit Sub

Err_rogin_Click:
MsgBox Err.Description
Resume Exit_rogin_Click

End Sub
ーー以上ーー
現在はこのようになっているのですが、これだとなぜかアカウントが"1"でも"2"でも
frm_mainが開いてしまいます。

長くなって申し訳ないのですが、アドバイスをお願いします。

Access2003を使用しています。

ログイン画面を作成しておりログイン自体はできたのですが、
管理者とそうでないユーザーに分けて、ログイン時に管理者であればfrm_mainを、
そうでなければfrm_main2を開くようにしたいのですがうまくいきません。

現在の仕様では、ログイン画面(frm_ログイン)とメイン画面(frm_main、frm_main2)があり

テーブル名:tbl_ユーザー
フィールド名:ユーザー名、パスワード、アカウント

アカウントで"1"が管理者、"2"が一般ユーザー
このようになっています。
ーー以...続きを読む

Aベストアンサー

変数「アカウント」に誰も値を代入していないから?


書き方(ADOで)の例となります。

Private Sub rogin_Click()
  Dim rs As New ADODB.Recordset
  Dim stDocName As String
  Dim bOk As Boolean

  If (IsNull(Me.[UserName])) Then
    MsgBox "ユーザー名が未入力です"
    Me.[UserName].SetFocus
    Exit Sub
  End If

  If (IsNull(Me.[Password])) Then
    MsgBox "パスワードが未入力です"
    Me.[Password].SetFocus
    Exit Sub
  End If

  bOk = False
  rs.Source = "SELECT * FROM tbl_ユーザー WHERE [ユーザー名]='" & Me.[UserName] & "';"
  rs.Open , CurrentProject.Connection, adOpenKeyset, adLockReadOnly
  If (rs.RecordCount = 1) Then ' ★
    If (StrComp(rs("パスワード"), Me.[Password], vbBinaryCompare) = 0) Then
      If (rs("アカウント") = "1") Then
        stDocName = "frm_main"
      Else
        stDocName = "frm_main2"
      End If
      bOk = True
    End If
  End If
  rs.Close

  If (bOk = True) Then
    'ユーザー名・パスワードが一致した
    DoCmd.OpenForm stDocName
    DoCmd.Close acForm, Me.Name
  Else
    MsgBox "ユーザー名/パスワード が違います"
    Me.[UserName].SetFocus
  End If
End Sub


※ エラー処理は盛り込んでください

※ ★部分は、同姓同名がなく、ユーザー名で1件のレコードが抽出されたらの意味

※ ユーザー名・パスワードの入力があった場合、どちらを間違ったか特定させないようにメッセージは1つに

変数「アカウント」に誰も値を代入していないから?


書き方(ADOで)の例となります。

Private Sub rogin_Click()
  Dim rs As New ADODB.Recordset
  Dim stDocName As String
  Dim bOk As Boolean

  If (IsNull(Me.[UserName])) Then
    MsgBox "ユーザー名が未入力です"
    Me.[UserName].SetFocus
    Exit Sub
  End If

  If (IsNull(Me.[Password])) Then
    MsgBox "パスワードが未入力です"
    Me.[Password].SetFocus
    Exit Sub
...続きを読む

QEXCEL VBA で指定した範囲に入力があるかどうか?

こんばんは!!
EXCEL VBAを使い出して、初日からつまずいてます・・・。
みなさん、アドバイスよろしくお願いします!!

で、早速、質問なんですけど、
指定したセル範囲のいずれかに入力があるか調べたいんですけど、それができるプロパティとかってあるんでしょうか?
地道にセル毎にチェックするしかないいんでしょうか??

たとえば、範囲をA1:H1として、その範囲内のセルに何か入力があったらTrueが返ってくるとか・・・。

もし、知ってる方がいらっしゃたら教えてください!!
よろしくお願いします!!!!!

Aベストアンサー

>これは、まず範囲を選択して、入力チェック()を呼ぶことなのでしょうか
書いたモジュールは範囲が指定してあります。("A1:H11"は間違いです。質問からすると"A1:H1"です)何もしないで入力チェックを実行します。
モジュールを CountA(Selecton) に変えれば任意の選択範囲がチェックの対象になります。任意の範囲を選択して実行します。
メッセージは確認するためで、IF ・・・・ で入力有無が判定できます。

>ワークシート関数CountAってどうやったら出てくるんですか??
ついApplicationと書いてしまうんですが、『WorksheetFunction.』と打てば、候補の関数名が表示されると思います。

下記の fnc入力チェック は入力有無を返すユーザー定義関数です。
書き方の例です。分かりやすくなった?この例は引数に"A1:H1"をセットしています。任意の範囲にするには Selection.Address に変えます。

Sub 入力チェック()
  Dim 入力有無フラグ As Boolean        '入力有無の答え

  入力有無フラグ = fnc入力チェック("A1:H1")  'モジュール内でA1~H1を指定(固定)

  MsgBox 入力有無フラグ            '帰ってきた答えをメッセージボックスで確認
End Sub

'入力有無を返すユーザー定義関数
Function fnc入力チェック(checkAddress As String)
  If WorksheetFunction.CountA(Range(checkAddress)) > 0 Then
    fnc入力チェック = True
  Else
    fnc入力チェック = False
  End If
End Function

>これは、まず範囲を選択して、入力チェック()を呼ぶことなのでしょうか
書いたモジュールは範囲が指定してあります。("A1:H11"は間違いです。質問からすると"A1:H1"です)何もしないで入力チェックを実行します。
モジュールを CountA(Selecton) に変えれば任意の選択範囲がチェックの対象になります。任意の範囲を選択して実行します。
メッセージは確認するためで、IF ・・・・ で入力有無が判定できます。

>ワークシート関数CountAってどうやったら出てくるんですか??
ついApplicationと書いてし...続きを読む


人気Q&Aランキング