- ベストアンサー
Accessのセキュリティについての質問
- Accessのセキュリティについて質問します。現在、アルバイトさんによる顧客データの入力を行っており、社員がデータをチェックしています。しかし、現在のセキュリティ対策は不十分であり、アルバイトさんにも社員以外からもデータが閲覧される可能性があります。そこで、アルバイトさんによるデータ入力を制限しつつ、他部署の社員もデータを閲覧できないようにする方法を探しています。
- Accessのセキュリティに関する問題があります。アルバイトさんによる顧客データの入力が行われており、社員がデータをチェックしています。しかし、現在のセキュリティ対策ではアルバイトさんによるデータの閲覧制限ができず、他部署の社員もデータを閲覧することができてしまいます。アルバイトさんがデータを入力できる状態を維持しつつ、他部署の社員からのデータ閲覧を制限する方法をご教示ください。
- Accessのセキュリティに関する質問です。現在、アルバイトさんが顧客データの入力を行っており、社員がデータをチェックしています。しかし、現在のセキュリティ対策ではアルバイトさん以外の社員もデータを閲覧することができてしまいます。アルバイトさんがデータ入力を行える状態を維持しつつ、他部署の社員からのデータ閲覧を制限する方法を教えてください。
- みんなの回答 (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 限界近くの運用と言うのを念頭に、こまめにバックアップを取る等、対策はして置いて下さいね。
その他の回答 (10)
- venzou
- ベストアンサー率71% (311/435)
>キャンセルや閉じた場合、テーブルも一緒に削除する方法はあるのでしょうか? 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
補足
もう、完璧です。。 venzou様のご好意と文章力に感謝致します。 実際に作業を想定してやってみたのですが、冒頭でお話させていただいたアルバイト10名程度の入力を開始すると、一人がフォームを開けると、テーブルが開きっぱなしになってしまって他の人がフォームを開けないのです。 正直mdeというファイルが詳しく分かっていないので、venzou様に言われたときから少し後回しにしてるんです。それとなにか関係があるのでしょうか?mdeなら複数入力が可能とか。 御蔭様で今のところ他のことは全てクリアしてます!
- venzou
- ベストアンサー率71% (311/435)
同じく、デスクトップにデータベースを置き確認しましたが、エラーが再現出来ませんでした。私は、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 -----------------------------------------------------------
補足
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)
>なぜか入力用から管理者が見つからないと出てしまいます。 リンクしようとした、データベースが存在しないと下記のエラーになると思います。この場合は、ファイル名をよく確認して下さい。 ------------------------------------------------------------ 実行時エラー'3024' ファイル 'C:\Document and Settings\****\デスクトップ\access\管理者用.mdb'が見付かりませんでした。 ------------------------------------------------------------ リンクしようとした、テーブルが存在しない場合は下記です。この場合は、テーブル名を確認して下さい。 ------------------------------------------------------------ 実行時エラー'3011' オブジェクト'Table999'が見つかりませんでした。オブジェクトが存在していること、名前やパス名が正しいことを確認して下さい。 ------------------------------------------------------------ フォームに必要なテーブルが足りない場合は下記です。この場合は、CreateLink の行を追加し、エラーメッセージに出てくるテーブルへのリンクを作って下さい。 ------------------------------------------------------------ 入力テーブルまたはクエリ'Table1'が見つかりませんでした。そのテーブルやクエリが存在していること、または名前が正しいことを確認して下さい。 ------------------------------------------------------------ これ以外の場合は、エラーが出る行と、エラーメッセージの詳細を補足して下さい。 また、SHIFT押しで入力用のMDBを開き、「ファイル」→「外部データの取り込み」→「テールのリンク」で、手作業でリンクテーブルを作り、入力用のフォームが正常に開くかも確認してみて下さい。 ついでに、確認したい事があるので、OSの種類を教えて下さい(管理者用のMDBを保存する予定のパソコンと、ユーザが使用するパソコン)。あと、Accessのバージョンも教えて下さい。
お礼
補足が途中でした。 こちらをごらんください。 貴重なお時間感謝致します。 エラー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です。 今現在は作成段階なので同じデスクトップ上で動かしています。
補足
貴重なお時間感謝致します。 パス”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です。 今現在は作成段階なので同じデスクトップ上で動かしています。
金曜日は就業時間ギリギリで示唆に終っていましたので、もう、少し、丁寧に。 [イミディエイト] ? 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 を参照させる必要があります。
そういう手がありましたね。 [イミディエイト] ? 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)
出来るだけ簡単な方法を提案します。 大まかに方法を説明すると ・データとフォームを分離します。 ・データはデータベースパスワードを設定し守ります。 ・リンクテーブルを動的に作成します。 ・パスワードは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のリンクテーブルになりますので、フォームの内容によっては、この点で修正が必要になるかもしれません。(単純な連結フォームなら問題ないと思います。)
お礼
途中までなんとかできましたが、なぜか入力用から管理者が見つからないと出てしまいます。場所の指定が間違っているのでしょうか? 今現在は作成中なので、デスクトップのaccessというフォルダに、管理者システムという名前で入っています。 とりあえず入力用でポップアップだけ開けるとこまではなんとかできたんですが。管理者と繋がらなくて。。
今、実際に全てを作成しつつ進めていますので多少不完全なところが・・・。 DBSelect関数から次の2行を消して下さい。 Dim N AS Integer N = .FieldCount - 1 これは、For Each に変更しましたので今回は不要。 まあ、あっても動きますが・・・。
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)
以下のサイトで説明されている方法を使って、起動時のShiftキー同時押しを無効化する、 というのはいかがでしょうか: http://www.accessclub.jp/samplefile/samplefile_01.htm 但し、AllowBypassKeyの設定自体は、ある程度Accessの知識がある人なら、他のAccess ファイルからも変更可能なため(→この場合、コード上で設定したパスワードは関係なし)、 もしもアルバイトの方の中にそういう人がいたら意味なしになってしまいますが(汗) (私自身、Shift起動を有効化するのに再起動させるのが面倒になって、結局、Shift起動の 有効/無効を設定する別のmdbを経由して立ち上げる形に変更したぐらいなので・・・) なお、 > 今現在はシフトを押して開かないとデータが見れないようにしています というのは、『起動時の設定』の「データベースウィンドウの表示」のチェックをオフにされて いるということだと思いますが、同じく「ショートカットキーを有効にする」のチェック(Accessの バージョンによっては『詳細』ボタンを押さないと表示されない項目)もオフにされているか、 念のためご確認下さい。 (これがオンのままだと、Shiftキーを押さずに起動しても、F11キーでデータベースウィンドウ が表示できてしまいますので・・・)
入力フォームのみを持つアプリケーションを開発。 とはいっても、 既存の入力フォームを新しいmdbにエクスポート。 後は、非連結フォームへと化けさせるのみ。 工数は、アイデアと経験があれば一日。 工数は、アイデアと経験がなければ未定。
お礼
ご返答ありがとう御座います。 とても理想に近い形です。 ですがそこまで精通しておりませんので。。。 既存の入力フォームを新しいmdbにエクスポートしても保存する対象がありませんとなりますが、なにか方法があるのでしょうか。 もしお手数でなければ詳細をお願いしてもよろしいでしょうか。 よろしくお願いします。
補足
仰る様にしたらできました! 今現在は、一つのaccessがあるPCに、6台くらいがネットワークで見に行ってます。ショートカットをデスクトップに作ってアルバイト専用としています。 今回のMDEファイルはショートカットではなくコピーなんですよね? MDEに変換するにあたって2003ファイル形式にしました。管理者用もユーザー用も2003ファイル形式にしたほうがいいのでしょうか? なぜ前任者は2000ファイル形式にしたんだろう。。 >XPには同時接続数の制限があり、Homeでは、最大 5台。Professionalでも、最大10台です。 仰るとおり10台までで限界ですね。ほんとに今ギリギリなんだなぁと実感しました。かといってもっと高度なデータベースとなると。。。恐ろしいので月に一回はバックアップを取っています。 おすすめのデータベースになるものってありますか?近いうち限界がくると思います。わたしの知識では外注が一番安全なのはわかっているんですけどね(笑)初歩的なことしてても、性格が合っているのか楽しくてしょうがないんです。 >ファイルその物をコピーして持って帰られると、解析される恐れがあります。これを防ぐには、USBメモリーの持込や使用を防ぐなど、ソフト以外のセキュリティ管理も必要になってきます。 セキュリティを万全にするのは難しいですね。細かい事を心配すると切りがありません。ある程度の線引き(妥協)は必要だと思います。 たしかに仰る通りです。 まだ設立して数年の会社です。個人情報の管理を徹底的に固めようと思っていますが、まだまだです。 もしご面倒でなければvenzou様のお時間のあるときにまたお力をお貸し頂ければ幸いです。