Accessのセキュリティについての質問

このQ&Aのポイント
  • Accessのセキュリティについて質問します。現在、アルバイトさんによる顧客データの入力を行っており、社員がデータをチェックしています。しかし、現在のセキュリティ対策は不十分であり、アルバイトさんにも社員以外からもデータが閲覧される可能性があります。そこで、アルバイトさんによるデータ入力を制限しつつ、他部署の社員もデータを閲覧できないようにする方法を探しています。
  • Accessのセキュリティに関する問題があります。アルバイトさんによる顧客データの入力が行われており、社員がデータをチェックしています。しかし、現在のセキュリティ対策ではアルバイトさんによるデータの閲覧制限ができず、他部署の社員もデータを閲覧することができてしまいます。アルバイトさんがデータを入力できる状態を維持しつつ、他部署の社員からのデータ閲覧を制限する方法をご教示ください。
  • Accessのセキュリティに関する質問です。現在、アルバイトさんが顧客データの入力を行っており、社員がデータをチェックしています。しかし、現在のセキュリティ対策ではアルバイトさん以外の社員もデータを閲覧することができてしまいます。アルバイトさんがデータ入力を行える状態を維持しつつ、他部署の社員からのデータ閲覧を制限する方法を教えてください。
回答を見る
  • ベストアンサー

accessのセキュリティ

質問させていただきます。 accessを使用し、顧客データを入力しています。 10名程度のアルバイトさんで入力をしていて、データ(テーブル)を社員がチェックする形です。 今現在はシフトを押して開かないとデータが見れないようにしていますが、セキュリティとしては程遠いものがあります。 access自体にパスワードをかけたらアルバイトさんが入力できなくなりますし、教えるのも本末転倒ですよね。 テーブルだけパスワードをかける方法はないと聞いたことがありますが、なにかいい方法はないものでしょうか?アルバイトさんや他部署の社員からもなにか方法をクリアしないとデータがみられないようなもの。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.11

>冒頭でお話させていただいたアルバイト10名程度の入力を開始すると、一人がフォームを開けると、テーブルが開きっぱなしになってしまって他の人がフォームを開けないのです。 共有の方法について説明していませんでしたね。 共有の方法ですが、データは共有しますが、入力フォームは共有しません。 つまり、管理者用のMDBは、ネットワーク上の共有フォルダに置きます。 入力用のMDEは、それぞれのパソコンにコピーして使います。  *仕様上、これを共有する事は出来ません。  *配布するのはMDBではなく、MDEの方です。 2台でテストしてみましたが、リンクテーブルを作る際に数秒の待ち時間が出来ますが、問題なく2台同時に利用出来ました。 ------------------------------------------------------------ MDEに関しては下記など参考に。 http://www.accessclub.jp/supbeg/002.html MDBをMDEに変換することで、ソースの改変、閲覧を禁止できます。それと、若干のパフォーマンスの向上ですね。その他の機能はMDBと変わりません。 念のため補足: 世の中には、MDEからMDBへの逆変換サービスが有るようです(有償)。MDEにしたからと言って絶対に安全とは言い切れないようです。過信は禁物ですね。 ファイルその物をコピーして持って帰られると、解析される恐れがあります。これを防ぐには、USBメモリーの持込や使用を防ぐなど、ソフト以外のセキュリティ管理も必要になってきます。 セキュリティを万全にするのは難しいですね。細かい事を心配すると切りがありません。ある程度の線引き(妥協)は必要だと思います。 ------------------------------------------------------------ あと、これも念のため・・・ 現状で10名程度で同時に入力しているのですよね? その共有は問題なく行えているのでしょうか? 現状で問題ないなら、問題ないかも知れませんが、気になる点を挙げておきます。 XPには同時接続数の制限があり、Homeでは、最大 5台。Professionalでも、最大10台です。 この点で何か不具合が出ないか、心配しています。 現状で10名程度と言う事ですが、11人目で何か不具合が出るかも。(私自身はこの限界をテストした事が無いので、どうなるか分かりません) http://support.microsoft.com/kb/314882/ja あと、ACCESSの限界ですが、仕様上は255ユーザまで共有出来ますが、実用的な限界は10~20と言う意見もあります。これも限界近くなので、不具合やパフォーマンスの低下など、少し心配です。 http://q.hatena.ne.jp/1139276943 限界近くの運用と言うのを念頭に、こまめにバックアップを取る等、対策はして置いて下さいね。

Armadillo5
質問者

補足

仰る様にしたらできました! 今現在は、一つのaccessがあるPCに、6台くらいがネットワークで見に行ってます。ショートカットをデスクトップに作ってアルバイト専用としています。 今回のMDEファイルはショートカットではなくコピーなんですよね? MDEに変換するにあたって2003ファイル形式にしました。管理者用もユーザー用も2003ファイル形式にしたほうがいいのでしょうか? なぜ前任者は2000ファイル形式にしたんだろう。。 >XPには同時接続数の制限があり、Homeでは、最大 5台。Professionalでも、最大10台です。 仰るとおり10台までで限界ですね。ほんとに今ギリギリなんだなぁと実感しました。かといってもっと高度なデータベースとなると。。。恐ろしいので月に一回はバックアップを取っています。 おすすめのデータベースになるものってありますか?近いうち限界がくると思います。わたしの知識では外注が一番安全なのはわかっているんですけどね(笑)初歩的なことしてても、性格が合っているのか楽しくてしょうがないんです。 >ファイルその物をコピーして持って帰られると、解析される恐れがあります。これを防ぐには、USBメモリーの持込や使用を防ぐなど、ソフト以外のセキュリティ管理も必要になってきます。 セキュリティを万全にするのは難しいですね。細かい事を心配すると切りがありません。ある程度の線引き(妥協)は必要だと思います。 たしかに仰る通りです。 まだ設立して数年の会社です。個人情報の管理を徹底的に固めようと思っていますが、まだまだです。 もしご面倒でなければvenzou様のお時間のあるときにまたお力をお貸し頂ければ幸いです。

その他の回答 (10)

  • venzou
  • ベストアンサー率71% (311/435)
回答No.10

>キャンセルや閉じた場合、テーブルも一緒に削除する方法はあるのでしょうか? Form_Openをキャンセルした場合は、Closeイベントが発生しないので、下記の場所でも、リンクテーブルを削除するようにして下さい。 '入力なき時は、フォームオープンをキャンセルします。 If varname = "" Then Cancel = True 'ここでもリンクテーブルを削除します DeleteLink "*********" End If ------------------------------------------------------------ 入力用のMDBを強制終了した場合などに、リンクテーブルが残る場合があるので、下記の関数を少し修正しておきます。 CreateLinkで、テーブルが存在した場合にエラーになるので、削除して作り変える様に変更。 DeleteLinkで、テーブルが存在しない場合にエラーになるので、その修正。ついでにDAOを使うように変更しました。 Public Sub CreateLink(strName)  Dim tdf As DAO.TableDef  DeleteLink strName  Set tdf = CurrentDb.CreateTableDef(strName)  tdf.Connect = "MS Access;DATABASE=" & MdbPath & ";PWD=" & PassWord & ";"  tdf.SourceTableName = strName  CurrentDb.TableDefs.Append tdf End Sub Public Sub DeleteLink(strName)  Dim tdf As DAO.TableDef  For Each tdf In CurrentDb.TableDefs   If LCase(tdf.Name) = LCase(strName) Then    CurrentDb.TableDefs.Delete strName    Exit For   End If  Next End Sub

Armadillo5
質問者

補足

もう、完璧です。。 venzou様のご好意と文章力に感謝致します。 実際に作業を想定してやってみたのですが、冒頭でお話させていただいたアルバイト10名程度の入力を開始すると、一人がフォームを開けると、テーブルが開きっぱなしになってしまって他の人がフォームを開けないのです。 正直mdeというファイルが詳しく分かっていないので、venzou様に言われたときから少し後回しにしてるんです。それとなにか関係があるのでしょうか?mdeなら複数入力が可能とか。 御蔭様で今のところ他のことは全てクリアしてます!

  • venzou
  • ベストアンサー率71% (311/435)
回答No.9

同じく、デスクトップにデータベースを置き確認しましたが、エラーが再現出来ませんでした。私は、WindowsXP、Access2000です。 エラー3044 は、パスのエラーで、フォルダが開けいない時に出るようです。 管理者用のMDBの名前や保存先を変えてみて下さい。 "C:\TEMP\TEST.MDB" など無難な名前で試してみて下さい。 あと、念のため、CreateLink関数の別バージョンを2つ作りましたので、これも試してみて下さい。 その1(接続文字を少し変更しただけ) ----------------------------------------------------------- Public Sub CreateLink(strName)  DoCmd.TransferDatabase acLink, "ODBC", "MS Access;DATABASE=" & MdbPath & ";PWD=" & PassWord & ";", acTable, strName, strName End Sub ----------------------------------------------------------- その2(DAOを利用し、リンクテーブルを作る) ----------------------------------------------------------- Public Sub CreateLink(strName)  Dim tdf As DAO.TableDef  Set tdf = CurrentDb.CreateTableDef(strName)  tdf.Connect = "MS Access;DATABASE=" & MdbPath & ";PWD=" & PassWord & ";"  tdf.SourceTableName = strName  CurrentDb.TableDefs.Append tdf End Sub -----------------------------------------------------------

Armadillo5
質問者

補足

DAOで動きました! メニュー画面のボタンをクリックした時に、入力フォームの新しいレコードに移るアクションを入れていたので、クリック時の使用するテーブルなどを入れる同じ場所に入れました。なんとか新しいレコードにいけましたよ。 なんとか9割がた完成っぽいんですが、ひとつのフォームで、開く時に入力者氏名を求められるようになっているフォームがあるんです。フォームでではなくて小窓みたいなやつに入力して、OKボタンを押したらそのフォームが開きます。 今そのフォームにもリンクで作ったのですが、この入力者氏名を求められる時に、キャンセルとか閉じるボタンを押したら使用するテーブルができたままになってしまうんです。なので次回ボタンを押すと、そのテーブルは既にあります的ことになります。 Private Sub Form_Open(Cancel As Integer) Dim Textname As TextBox Dim strmsg As String Dim varname As Variant Set Textname = Me.入力者表示 strmsg = "入力者氏名を入力して下さい" varname = InputBox(strmsg) '入力なき時は、フォームオープンをキャンセルします。 If varname = "" Then Cancel = True End If Textname = varname End Sub こんな感じです。フォームの開く時です。 キャンセルや閉じた場合、テーブルも一緒に削除する方法はあるのでしょうか?

  • venzou
  • ベストアンサー率71% (311/435)
回答No.8

>なぜか入力用から管理者が見つからないと出てしまいます。 リンクしようとした、データベースが存在しないと下記のエラーになると思います。この場合は、ファイル名をよく確認して下さい。 ------------------------------------------------------------ 実行時エラー'3024' ファイル 'C:\Document and Settings\****\デスクトップ\access\管理者用.mdb'が見付かりませんでした。 ------------------------------------------------------------ リンクしようとした、テーブルが存在しない場合は下記です。この場合は、テーブル名を確認して下さい。 ------------------------------------------------------------ 実行時エラー'3011' オブジェクト'Table999'が見つかりませんでした。オブジェクトが存在していること、名前やパス名が正しいことを確認して下さい。 ------------------------------------------------------------ フォームに必要なテーブルが足りない場合は下記です。この場合は、CreateLink の行を追加し、エラーメッセージに出てくるテーブルへのリンクを作って下さい。 ------------------------------------------------------------ 入力テーブルまたはクエリ'Table1'が見つかりませんでした。そのテーブルやクエリが存在していること、または名前が正しいことを確認して下さい。 ------------------------------------------------------------ これ以外の場合は、エラーが出る行と、エラーメッセージの詳細を補足して下さい。 また、SHIFT押しで入力用のMDBを開き、「ファイル」→「外部データの取り込み」→「テールのリンク」で、手作業でリンクテーブルを作り、入力用のフォームが正常に開くかも確認してみて下さい。 ついでに、確認したい事があるので、OSの種類を教えて下さい(管理者用のMDBを保存する予定のパソコンと、ユーザが使用するパソコン)。あと、Accessのバージョンも教えて下さい。

Armadillo5
質問者

お礼

補足が途中でした。 こちらをごらんください。 貴重なお時間感謝致します。 エラー3044 パス”Document~.mdb”は正しくありません。パス名に間違いがないことと、ファイルが置かれたサーバーに接続していることを確認してください。 とでます。 ユーザー用のテーブルはすべて削除するんですよね。 メニューフォームにある呼び出すボタンがダブリチェック入力ボタン 呼び出したいフォームがダブリチェックフォーム リンクしたいテーブルがダブリチェックテーブル だとクリック時で Private Sub ダブリチェック入力ボタン_Click() 'フォームに必要なテーブルを記述する CreateLink "ダブリチェックテーブル" DoCmd.OpenForm "ダブリチェックフォーム" End Sub であってますよね? Option Compare Database '管理者用のMDBファイルの場所とパスワード Private Const MdbPath = "C:\Document and Settings\****\デスクトップ\access\管理者用.mdb" Private Const PassWord = "****" Public Const SW_HIDE = 0 Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long 'Accessのアプリケーションを非表示にする処理 Public Sub HideApplication() Dim tmp As Long tmp = ShowWindow(Application.hWndAccessApp, SW_HIDE) End Sub 'リンクテーブルを作るサブルーチン Public Sub CreateLink(strName) DoCmd.TransferDatabase acLink, "ODBC", ";DATABASE=" & MdbPath & ";PWD=" & PassWord & ";", acTable, strName, strName End Sub 'リンクテーブルを削除するサブルーチン Public Sub DeleteLink(strName) DoCmd.DeleteObject acTable, strName End Sub やはりパス名がおかしいのでしょうか? 入力用にリンクテーブルを作って、メニューを通さず直接操作しました。問題なく動きました。 access2003ですが、2000の形式となっています。前管理者が作成したのでなぜかはわかりかねますが。 OSは管理者、ユーザー共にXPです。 今現在は作成段階なので同じデスクトップ上で動かしています。

Armadillo5
質問者

補足

貴重なお時間感謝致します。 パス”Document~.mdb”は正しくありません。パス名に間違いがないことと、ファイルが置かれたサーバーに接続していることを確認してください。 とでます。 ユーザー用のテーブルはすべて削除するんですよね。 メニューフォームにある呼び出すボタンがダブリチェック入力ボタン 呼び出したいフォームがダブリチェックフォーム リンクしたいテーブルがダブリチェックテーブル だとクリック時で Private Sub ダブリチェック入力ボタン_Click() 'フォームに必要なテーブルを記述する CreateLink "ダブリチェックテーブル" DoCmd.OpenForm "ダブリチェックフォーム" End Sub であってますよね? Option Compare Database '管理者用のMDBファイルの場所とパスワード Private Const MdbPath = "C:\Document and Settings\****\デスクトップ\access\管理者用.mdb" Private Const PassWord = "****" Public Const SW_HIDE = 0 Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long 'Accessのアプリケーションを非表示にする処理 Public Sub HideApplication() Dim tmp As Long tmp = ShowWindow(Application.hWndAccessApp, SW_HIDE) End Sub 'リンクテーブルを作るサブルーチン Public Sub CreateLink(strName) DoCmd.TransferDatabase acLink, "ODBC", ";DATABASE=" & MdbPath & ";PWD=" & PassWord & ";", acTable, strName, strName End Sub 'リンクテーブルを削除するサブルーチン Public Sub DeleteLink(strName) DoCmd.DeleteObject acTable, strName End Sub やはりパス名がおかしいのでしょうか? access2003ですが、2000の形式となっています。前管理者が作成したのでなぜかはわかりかねますが。 OSは管理者、ユーザー共にXPです。 今現在は作成段階なので同じデスクトップ上で動かしています。

noname#140971
noname#140971
回答No.7

金曜日は就業時間ギリギリで示唆に終っていましたので、もう、少し、丁寧に。 [イミディエイト] ? DLink("tab1", "C:\Temp\db5.mdb") True ? DBSelect("SELECT * FROM tab1") ? DLink("tab1", "C:\Temp\db4.mdb") True ? DBSelect("SELECT * FROM tab1") 1;20080214; このように、リンクを動的に変化させることで[tab1]をダミーと本物を切り替えています。 この場合、[db5.mdb]がダミーで[db4.mdb]が本物です。 [イミディエイト] ? GetLink("tab1") C:\Temp\db4.mdb リンク情報は、このようにして参照します。 DLink、GetLink、DBSelectの3つの関数があれば、いかようにもリンクを動的に設定し確認できるでしょう。 Public Function DBSelect(ByVal strQuerySQL As String, _              Optional ByVal strSeparator1 As String = ";", _              Optional ByVal strSeparator2 As String = "") As String On Error GoTo Err_DBSelect   Dim I   As Integer   Dim J   As Integer   Dim R   As Integer   Dim C   As Integer   Dim M   As Integer   Dim N   As Integer   Dim rst  As ADODB.Recordset   Dim fld  As ADODB.Field   Dim Datas As String      Set rst = New ADODB.Recordset   ' =================   ' Begin With: rst   ' -----------------   With rst      .Open strQuerySQL, _         CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then       M = .RecordCount - 1       N = .Fields.Count - 1       .MoveFirst       For R = 0 To M         For C = 0 To N           Datas = Datas & .Fields(C) & strSeparator1         Next C         If Len(strSeparator2) Then           Datas = Datas & strSeparator2         End If         Datas = Datas & vbCrLf         .MoveNext       Next R      End If   End With   ' ---------------   ' End With: rst   ' =============== Exit_DBSelect:   DBSelect = Datas   Exit Function Err_DBSelect:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBSelect End Function Public Function DLink(ByVal tblName As String, ByVal lnkString As String) As Boolean On Error GoTo Err_DLink   Dim isOK   As Boolean   Dim catDB   As ADOX.Catalog   Dim tblList  As ADOX.Table   Dim strTables As String   isOK = True   Set catDB = New ADOX.Catalog   With catDB     .ActiveConnection = CurrentProject.Connection     For Each tblList In .Tables       If tblList.Name = tblName Then         tblList.Properties("Jet OLEDB:Link Datasource") = lnkString         tblList.Properties.Refresh         Exit For       End If     Next   End With Exit_DLink:   DLink = isOK   Exit Function Err_DLink:   isOK = False   Resume Exit_DLink End Function Public Function GetLink(ByVal tblName As String) As String On Error GoTo Err_GetLink   Dim catDB   As ADOX.Catalog   Dim tblList  As ADOX.Table   Dim strTables As String   Set catDB = New ADOX.Catalog   With catDB     .ActiveConnection = CurrentProject.Connection     For Each tblList In .Tables       If tblList.Name = tblName Then         GetLink = tblList.Properties("Jet OLEDB:Link Datasource")         Exit For       End If     Next   End With Exit_GetLink:   Exit Function Err_GetLink:   Resume Exit_GetLink End Function なお、Access2000以後でないと ADOXはサポートされていません。 また、参照設定で、ADO Ext.XX を参照させる必要があります。

noname#140971
noname#140971
回答No.6

そういう手がありましたね。 [イミディエイト] ? GetTablesList() tab1 このように、ADOX でリンクテーブルの情報が参照できます。 また、下の4行でそのパス情報を動的に設定できます。 後の仕掛けは、No5さんの回答の通りです。 Public Function GetTablesList() As String   Dim catDB   As ADOX.Catalog   Dim tblList  As ADOX.Table   Dim strTables As String   Set catDB = New ADOX.Catalog   With catDB     .ActiveConnection = CurrentProject.Connection     For Each tblList In .Tables       If tblList.Type <> "VIEW" And UCase(Left(tblList.Name, 4)) <> "MSYS" Then         strTables = strTables & tblList.Name & ";"       End If     Next     strTables = Left(strTables, Len(strTables) - 1)   End With   GetTablesList = strTables End Function If tblList.Type = "Link" Then   tblList.Properties("Jet OLEDB:Link Datasource") = xxxx   tblList.Properties.Refresh End If

  • venzou
  • ベストアンサー率71% (311/435)
回答No.5

出来るだけ簡単な方法を提案します。 大まかに方法を説明すると ・データとフォームを分離します。 ・データはデータベースパスワードを設定し守ります。 ・リンクテーブルを動的に作成します。 ・パスワードはVBAに記述し、MDEにする事で隠します。 ・Accessのアプリケーション自体を非表示にします。 データとフォームを分離する点では、No1さんの回答と同じですが、連結フォームから、非連結フォームへの変更は面倒なので、リンクテーブルを利用します。 リンクテーブルを普通に作ると、内容を見られてしまうので、必要な時にVBAで動的に作成します。処理が終われば、リンクテーブルを削除します。 具体的な手順を説明します。 まず、現状のMDBファイルを、管理者用と呼ぶ事にします。 管理者用のMDBファイルをコピーし、ユーザ用のMDBファイルを作ります。 管理者用のMDBファイルに、データベースパスワードを設定します。 ユーザ用のMDBファイルを開きます、以下はユーザ用のMDBでの作業です。 ユーザに不要なものは削除します。(レポートや、使わないフォームなど) テーブルは全て削除します。(テーブルは管理者用のテーブルにリンクさせます。後述) 使用する全てのフォームのプロパティで、「ポップアップ」と「作業ウインドウ固定」を「はい」にします。(アプリケーションを隠すので必要になります。) 新規のモジュールを追加し下記を記述(後で使うサブルーチンです) ファイル名とパスワードを正しい物に変更し、適当な名前で保存します。 (このパスワードはMDEにするので、覗かれる心配はありません。後述) ------------------------------------------------------------ '管理者用のMDBファイルの場所とパスワード Private Const MdbPath = "c:\temp\db1.mdb" Private Const PassWord = "hoge" Public Const SW_HIDE = 0 Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long 'Accessのアプリケーションを非表示にする処理 Public Sub HideApplication()  Dim tmp As Long  tmp = ShowWindow(Application.hWndAccessApp, SW_HIDE) End Sub 'リンクテーブルを作るサブルーチン Public Sub CreateLink(strName)  DoCmd.TransferDatabase acLink, "ODBC", ";DATABASE=" & MdbPath & ";PWD=" & PassWord & ";", acTable, strName, strName End Sub 'リンクテーブルを削除するサブルーチン Public Sub DeleteLink(strName)  DoCmd.DeleteObject acTable, strName End Sub ------------------------------------------------------------ メニュー用のフォームを追加します。(すでに有れば、それを利用します) 起動時の設定で、このフォームを表示します。 このフォームも「ポップアップ」と「作業ウインドウ固定」を「はい」にします。 開く時と、閉じる時のイベントプロシージャを下記にします。 ------------------------------------------------------------ Private Sub Form_Open(Cancel As Integer)  HideApplication End Sub Private Sub Form_Close()  DoCmd.Quit End Sub ------------------------------------------------------------ この設定で、ユーザ用のMDBを開くと、メニュー用のフォームだけが表示され、Accessのアプリケーションのウインドウは表示されません。また、メニューを閉じると、Accessも終了します。 次に、メニューから他のフォームを開く時に、必要なテーブルのリンクテーブルを作ってから開く様にします。 メニューのコマンドボタンのイベントプロシージャの例 ------------------------------------------------------------ Private Sub コマンド0_Click()  'フォームに必要なテーブルを記述する  CreateLink "Table1"  CreateLink "Table2"  DoCmd.OpenForm "フォーム1" End Sub ------------------------------------------------------------ 開いたフォームを閉じる時に、リンクテーブルを削除します。 これはメニューフォームではなく、それぞれのフォームの「閉じる時」のイベントプロシージャです。 ------------------------------------------------------------ Private Sub Form_Close()  'フォームで使ったリンクテーブルを削除する  DeleteLink "Table1"  DeleteLink "Table2" End Sub ------------------------------------------------------------ これで、SHIFT押しでデータベースを開いてもテーブルは存在しない状態になります。 最後の仕上げで、ユーザ用のMDBファイルからMDEファイルを作り、ユーザにはMDEファイルを使ってもらいます。ユーザ用のMDBファイルは保守のために残しますが、ユーザからは開けない場所に保存して下さい。 ============================================================ 上記の作業で、テーブルを隠す事が出来ると思います。 基本的には、上記の修正のみで、既存のフォームがそのまま使用できると思います。 テーブルが、ODBCのリンクテーブルになりますので、フォームの内容によっては、この点で修正が必要になるかもしれません。(単純な連結フォームなら問題ないと思います。)

Armadillo5
質問者

お礼

途中までなんとかできましたが、なぜか入力用から管理者が見つからないと出てしまいます。場所の指定が間違っているのでしょうか? 今現在は作成中なので、デスクトップのaccessというフォルダに、管理者システムという名前で入っています。 とりあえず入力用でポップアップだけ開けるとこまではなんとかできたんですが。管理者と繋がらなくて。。

noname#140971
noname#140971
回答No.4

今、実際に全てを作成しつつ進めていますので多少不完全なところが・・・。 DBSelect関数から次の2行を消して下さい。 Dim N AS Integer N = .FieldCount - 1 これは、For Each に変更しましたので今回は不要。 まあ、あっても動きますが・・・。

noname#140971
noname#140971
回答No.3

Q、もしお手数でなければ詳細をお願いしてもよろしいでしょうか? A、暇ですから、なんなりと。 <エクスポート手順> 1、Access を起動して新しい空のMDBを所定のフォルダに作成します。 2、既存のMDBからは入力フォームだけをエクスポートします。 <先ずは、連結テストの準備> 標準モジュールに<データベース関数>などの名前を付けて以下の関数を登録して下さい。 Public Const pubCNNSTRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Sales2005\sales2005.mdb" Public Function CNNTest(ByVal strCNNString As String) As Boolean On Error GoTo Err_CNNTest   Dim isNotOK As Boolean   Dim cnn   As ADODB.Connection     Set cnn = New ADODB.Connection   With cnn     .ConnectionString = pubCNNSTRING     .Open   End With Exit_CNNTest:   CNNTest = Not isNotOK   Exit Function Err_CNNTest:   isNotOK = True   Resume Exit_CNNTest End Function Public Function DBSelect(ByVal strQuerySQL As String) As String On Error GoTo Err_DBSelect   Dim I      As Integer   Dim J      As Integer   Dim R      As Integer  ' データを代入する配列 DataValue(,) のインデックスを決める行カウンター   Dim C      As Integer  ' データを代入する配列 DataValue(,) のインデックスを決める列カウンター   Dim M      As Integer  ' データを代入する配列 DataValue(,) の一つ目の添字の最大値=行総数 - 1   Dim N      As Integer  ' データを代入する配列 DataValue(,) の二つ目の添字の最大値=列総数 - 1   Dim rst     As ADODB.Recordset   Dim fld     As ADODB.Field   Dim strList   As String   ' 全てのデータをセミコロン(;)で区切った1行の文字列を格納する変数      Set rst = New ADODB.Recordset      ' =================   ' Begin With: rst   ' -----------------   With rst      .Open strQuerySQL, _         pubCNNSTRING, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then       ' --------------       ' 配列を再宣言       ' --------------       M = .RecordCount - 1       N = .Fields.Count - 1       ' ------------------------------------       ' 列情報を For-Next で配列に代入する       ' ------------------------------------       .MoveFirst       For R = 0 To M         C = -1         For Each fld In .Fields           C = C + 1           strList = strList & fld.Value & "" & ";"         Next fld         .MoveNext       Next R      Else       strList = ""      End If   End With   ' ---------------   ' End With: rst   ' =============== Exit_DBSelect: On Error Resume Next   rst.Close   Set rst = Nothing   DBSelect = strList   Exit Function Err_DBSelect:   M = 0   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBSelect End Function <連結テスト> [イミディエイトウインドウ] ? CNNTest("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Sales2005\sales2005.mdb") True これで、Sales2005.mdb との連結テストは成功しました。 ? DBSelect("SELECT * FROM 得意先マスター WHERE ID=134") 134;久冨 健敏;ヒサトミ;;OO県警察本部;;;;;9;10;0;0;0;1;0;True;0;0; これで、得意先マスターを参照することが可能であることも判りました。 DisplayRecord(ByVal frm As Form, ByVal strQuerySQL As String) As Boolean UpdateRecord(ByVal frm As Form, ByVal strSQL As String, Optional Echo As Boolean = False) As Boolean こうなれば、フォームとSQL文を渡せば、該当するデータを読み込みファームに表示する関数DisplayRecordの出番です。 入力されたら、フォームと更新するレコードを特定するSQLを渡せば、フォームを解析しレコードを更新するUpdateRecord関数の出番です。 さて、ここら辺りまでで続けるか否かを判断されて下さい。

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

以下のサイトで説明されている方法を使って、起動時のShiftキー同時押しを無効化する、 というのはいかがでしょうか: http://www.accessclub.jp/samplefile/samplefile_01.htm 但し、AllowBypassKeyの設定自体は、ある程度Accessの知識がある人なら、他のAccess ファイルからも変更可能なため(→この場合、コード上で設定したパスワードは関係なし)、 もしもアルバイトの方の中にそういう人がいたら意味なしになってしまいますが(汗) (私自身、Shift起動を有効化するのに再起動させるのが面倒になって、結局、Shift起動の  有効/無効を設定する別のmdbを経由して立ち上げる形に変更したぐらいなので・・・) なお、 > 今現在はシフトを押して開かないとデータが見れないようにしています というのは、『起動時の設定』の「データベースウィンドウの表示」のチェックをオフにされて いるということだと思いますが、同じく「ショートカットキーを有効にする」のチェック(Accessの バージョンによっては『詳細』ボタンを押さないと表示されない項目)もオフにされているか、 念のためご確認下さい。 (これがオンのままだと、Shiftキーを押さずに起動しても、F11キーでデータベースウィンドウ  が表示できてしまいますので・・・)

noname#140971
noname#140971
回答No.1

入力フォームのみを持つアプリケーションを開発。 とはいっても、 既存の入力フォームを新しいmdbにエクスポート。 後は、非連結フォームへと化けさせるのみ。 工数は、アイデアと経験があれば一日。 工数は、アイデアと経験がなければ未定。

Armadillo5
質問者

お礼

ご返答ありがとう御座います。 とても理想に近い形です。 ですがそこまで精通しておりませんので。。。 既存の入力フォームを新しいmdbにエクスポートしても保存する対象がありませんとなりますが、なにか方法があるのでしょうか。 もしお手数でなければ詳細をお願いしてもよろしいでしょうか。 よろしくお願いします。

関連するQ&A

  • ACCESSのセキュリティ

    旅行会社の個人情報をACCESSで管理しています。 アルバイト数名が個人情報を何万と入力しているのですが、バイトでも他の部署の人間でも簡単に今まで入力した個人情報を閲覧できてしまいます。シフト押しながらでないとテーブルを見れないようにはしていますが、気休めでしかありません。バイトを信用してないわけではないのですが、どうしてもサイクルが早いので危惧してしまいます。 テーブルのみにパスワードを入れるのは不可能だと言われましたが、何かいい手はありませんでしょうか。 ACCESS自体にパスワードを付けると、バイトが入力するときにパスワードがいるので本末転倒なのです。 ご教授お願い致します。

  • ACCESSテーブルにパスワード

    ACCESSのテーブルだけにパスワードをかけたいのですが、方法はあるでしょうか? 自分なりに調べた結果、テーブルのみはプログラムで作る方法しかないとのことでした。 データベースにパスワードを入れると、フォームで入力する不特定多数の人間にパスワードを教えないといけないので、本末転倒となってしまいます。 プログラム以外で方法はあるのか? プログラムでするにはどういうプログラムか? お手数ですがご教授お願い致します。

  • アクセスの構築、スマートなやり方教えてください。

    初心者でうまく説明できないかもしれませんが、 添付アクセスでNo1,2,3とテーブルをクエリでフォームを作りました。 1の社員番号を入力すると名前が呼び出され、 2の所属コードを入力すると部署。。。が呼び出されます、 3は資格コードをいれると資格名。。。が呼び出されるようにしました。 1にも所属コードを入力してあり1と2のリレーションを所属コードで結んでます、 これで困ったのが社員番号は変わらないのですが、所属コードは部署名が 変わったり変わったり人も部署の異動で変わります、 このままだと、部署の異動があった場合、入力してあるデータの修正が必要に なります、 次にやったのは1と2を一つのテーブルにしました、しかし、これも部署名が変わった時 社員数分変更をしなければなりません、本当なら変わった部署を修正し1と2をあとで 一緒にできるといいのですが、 1と2のテーブルをクエリで一緒にして3のテーブルと合わせてフォームを作ったところ 入力ができなくなりました、 添付の1と2を別なテーブルで出来て、部署名など変更になったり、部署の異動の時 過去のデータを修正せずにすむ構築教えてください。

  • access2000のサブフォーム同士の連携

    お願いします。教えてください。 テーブル(1)部署(2)社員(部署とリンク)(3)顧客(社員とリンク) で作っていて、メインフォームを部署でつくりそこにサブフォームで社員をデータシートで出しています。更に部署のフォームでサブフォームをつくり顧客をフォームで出したいのです。 社員をクリックすると、その社員が抱えている顧客が出てくるという形にしたいのですが、できるでしょうか? クリックして別のフォームを現在出しているのですが、部署のフォームのサブフォームとして出したいのですが。。。 お願いします。

  • ACCESS2003 セキュリティについて

    こんにちは。 ACCESS2003で、ワークグループを設定してセキュリティをかけました。 違うパソコンにACCESSが入っていないため、2007のランタイムをインストールしてデータベースを見られるようにしているのですが、セキュリティをかけてもパスワードを求められることもなく、データの書き換えができてしまいます。 どのようにすれば、ランタイムで起動したデータベースのアクセスを制限できるのでしょうか?

  • Accessで、ある行を並び替えた後に採番したい。

    初心者です。よろしくお願いいたします。 ACCESSで顧客データがあります。 部署、名前、住所・・・・といったテーブルを元 にして作成した入力フォームがあります。 ところが、最近になってデータごとにIDを振る ことになりました。しかも「まずは部署でソートを かけてから採番する」ということになりました。 通常でしたら、テーブルにオートナンバー型のフィールドを作成すればいいと思うのですが、その前に「部署」フィールドでソートをかけないといけないのです。 (1) データを追加する (2) 部署でソートをかける (3) (2)の状態で採番 ・・・・という流れにしたいのです。なので データを追加するたびに必ず最後に最新の状態 で採番し直す!と言った感じです。 上記のような方法はありますでしょうか。 よろしくお願いたします。

  • 助けてaccess!

    アクセスで顧客データを作っています。 クエリ上のデータとテーブルのデータ(サブフォームで)を引っ張り、「入力フォーム」を作成したのですが、新規情報を入れようとすると、「フィールドを更新できません」とエラーが出ます。しかしEnter Keyを3回たたく(このエラーが3回でる)となぜか入力ができるようになります。そしてその後保存もできます。 この現象はなぜ出るのでしょうか?そして解決方法をどなたか教えてください。よろしくお願いします。

  • ACCESS2000でセキュリティーをかけたいのです。

    ACCESS2000を利用しています。セキュリティーをかけたいのですが、ツール→セキュリティーウィザードを利用してチャレンジしてみたのですが、基本がわからないせいか、うまくいきません。 データにアクセスする時に「名前」と「パスワード」だけはできたのですが、基本的なことが不明な為、サブフォームが見えなくなったり、フルアクセスにすると全部変更や削除ができて、セキュリティーの意味がなくなったりと四苦八苦しています。 ・フォーム毎に利用できるもの許可したりするのは可能でしょうか? (フォームの中でも、サブフォーム1・2共に見ることは可能で、サブフォーム1は変更可。サブフォーム2は変更不可といったこともできますでしょうか?) どなたか、ご教授お願いいたします。 最終的には、このセキュリティーを利用してデータベースに入り、ユーザー名を(表示)して、更新を行うと、そのユーザー名を取得して、テーブルに保存したいのですが、可能でしょうか? よろしくお願いいたします。

  • Access にパスワードをかけたい

    Access にパスワードをかけたい Access で、データ分割ツールを使い、”テーブルデータ”と”フォーム”にファイルを分けました。 その場合のパスワードのかけ方がわかりません。 やりたい事は、テーブルのファイルをパスワードを知っている人しか見れないようにしたいです。 ます、テーブルのファイルに、排他的モードで開き、”セキュリティ”の項目をたどってパスワードをかけました。 そして、フォームのファイルを開こうとすると、”パスワードが違います”と表示されます。 そこで、フォームファイルを、テーブルファイルの手順で、パスワードをかけました。 もちろん、テーブルファイルと同じパスワードです。 その後に、フォームを開いて見ました。 それでも、”パスワードが違います”と表示されます。 質問は、ファイルを分割した場合、どのようにパスワードをかければいいのでしょうか? よろしくお願いします。

  • Access2003でのフォーム作成について(再度です)

    民宿の顧客管理をAccessでしようかと思っています。 氏名、住所、来客日などのフィールドを持つ顧客テーブル。 来客日、その日の献立1~17までを持つ日別献立テーブル。 この2つのテーブルからクエリーを作成し、 それを基にフォームを作ってデータを両方のテーブルに振り分けしようとしたんですが、うまくいきません。 クエリーで来客日同士を結ぶとデータは表示されますが新規の入力が出来ません。 顧客テーブルの顧客ID(オートナンバー)と 日別献立テーブルに顧客ID(数値型)を挿入し、2つを結んでも一方のデータしか表示されません。 おかしいとは思いますが、何がおかしいかわかりません。 何か良い方法があればお教え下さい。

専門家に質問してみよう