紳士開発キットへのアクセス

Accessの開発者として働いていたとき、たくさんの有用性を得ました。それをHabrに置くことは私の義務だと思います。 これらのスニペットの多くはオンラインであり、一部は困難であるか、絶望的に失われています。









1. Accessを使用すると、クエリの実行中に警告メッセージが表示されます。 これらはアプリケーションのデバッグ時に非常に便利ですが、ユーザーにとっては原則として必要ありません。 あなたは小さなVBAコードでそれらを無効/有効にすることができます:



Application.SetOption "Confirm Action Queries", 0 Application.SetOption "Confirm Document Deletions", 0 Application.SetOption "Confirm Record Changes", 0
      
      





パラメーター0を指定して無効にし、1を指定して有効にします。



2.データベースをpr索好きな目から保護し、アクセス権を区別するために、ワークグループファイル(.MDW形式)が使用されます。 ワークグループファイルへのパスを手動で指定できますが、ネットワーク上に多くのユーザーがいる場合は、クリックするとMDWへのパスを設定する1行のコードを処理するボタンを持つAccessファイルを使用する方がはるかに便利です。



 Application.SetDefaultWorkgroupFile Path:="D:\  \file.MDW"
      
      







3.リクエストまたはフォームのコンテンツでテキスト検索を行うフォームを自分で作成していなかった場合、どのように動作するかわかりません(おそらく同じように動作しますが、もっと時間がかかります)。 多くの場合、何らかのリファクタリングを実行するか、テーブルまたはフィールドのスコープを決定する必要があります。



クエリを検索するには、クエリテキストで検索するコードを含むフォームが役立ちます。



 For i = 0 To CurrentDb.QueryDefs.Count - 1 If InStr(CurrentDb.QueryDefs(i).sql, strSearchWord) > 0 Then '          CurrentDb.QueryDefs(i).Name End If Next        : For i = 0 To CurrentDb.QueryDefs.Count - 1 For j = 0 To CurrentDb.QueryDefs(I).Fields.Count '           CurrentDb.QueryDefs(i).Name Next Next
      
      





フォームで検索するには、コードがもう少し大きくなります。



 Dim strSearchWord As String ' ,       strSearchWord=”” Dim oAO As object Dim frm As Form Dim ctrl As object For Each oAO In CurrentProject.AllForms DoCmd.OpenForm oAO.Name, acDesign Set frm = Forms(oAO.Name) For Each ctrl In frm.Controls Select Case ctrl.ControlType Case acTextBox, acComboBox, acListBox, acCheckBox '      If InStr(1, ctrl.ControlSource & "", strSearchWord) Then '        frm.Name  ctrl.Name End If End Select Next DoCmd.Close acForm, oAO.Name, acSaveNo Next Set oAO = Nothing Set frm = Nothing Set ctrl = Nothing
      
      







4.プログラミングの観点から作業をもう少し強固にし、作業中のデータベースで本番モードで作業しているときにエラーを検索できるようにするには、テキストログファイルにイベントを記録するためのVBAモジュール(トレースモジュール)を追加することが非常に望ましいです。 テキストファイルに書き込む簡単な関数は、デバッグ時に非常に役立ちます。



 Sub Trace(ByVal txtinfo As String) On Error Resume Next MyFile = "D:\" & "logfile.txt" fnum = FreeFile() Open MyFile For Append As fnum txtinfo = CStr(Now()) + " " + txtinfo Print #fnum, txtinfo Close #fnum End Sub
      
      







5.このコード(ポイント4から)は、別のAccessデータベースファイルに簡単に転送でき、VBAエディターの参照/リンクを介してすべての既存のデータベースに追加できます。



複数のAccessデータベースファイルがある場合は、重複するコードを別のファイルに移動できます。 必要な唯一の変更は、コードでCurrentDbオブジェクトを使用し、それをCodeDbに置き換えて、共通コードの管理者として使用されるベースのオブジェクトにアクセスする場合です。



画像



6.多くの場合、リクエストでは、開いているフォームフィールドの値をパラメータとして示します。 たとえば、次のようにします。



 WHERE demotable.infonumber>Forms!Form1!Field25
      
      





ただし、リクエスト自体にパラメータを直接指定する必要がある場合があります。 次の方法で実行できます。



 PARAMETERS val Text ( 255 ), fldID Long; UPDATE demotable SET demofield = val WHERE [fieldID]=fldID;
      
      





次に、Accessコードからこれらのパラメーターを設定し、リクエストを実行します。



 With CurrentDb.QueryDefs("demoquery") .Parameters("fldID") = 2 .Parameters("val") = "newvalue" .Execute End With
      
      





別の方法として、VBAモジュールを作成してグローバル変数を追加し、この変数を返す関数を追加します。



 Global start_ID As Long Public Function get_global() As Long get_global = start_ID End Function
      
      





要求を開始する前に、グローバル変数の値を設定する必要があります(メインフォームを開くときに設定できます)。



 start_ID=3 '        
      
      





そして、リクエスト自体で、値を返す関数の名前をパラメーターで指定します。



 SELECT * FROM demotable WHERE (demotable.infonumber>get_global());
      
      







6.1。このクエリパラメータの取得方法は、テーブル情報へのアクセスを部分的に制限するために使用できます(ワークグループの場合)。 フォームをロードするとき、現在のユーザーに応じて、グローバル変数の値を設定します。



 Private Sub Form_Load() If (CurrentUser = "Buh") Then start_ID = 1 Else start_ID = 1000 End If End Sub
      
      





次に、デモテーブルの表示と変更の禁止を設定し、リクエストの許可を設定します。 ただし、リクエストには権限のないテーブルが使用されているため、データは返されません。 データを返すために、最後にリクエストのSQLに追加します
 WITH OWNERACCESS OPTION
      
      





結果として、Buhユーザーはテーブルのすべての行にアクセスでき、他のすべてのユーザーは最初の1000を除くすべての行にアクセスできます。



7.コードからフォームを開くために、コードが使用されます:



 DoCmd.OpenForm "FormName", View, "FilterName", "WhereCondition", DataMode, WindowMode, "OpenArgs"
      
      





「WhereCondition」として、フォームレコードを開く必要がある条件を指定できます(フォームがデータバインドの場合)。 たとえば、「ZakazID = 56325」を指定すると、56325に等しいZakazIDデータ値でフォームを開くことができます。



「OpenArgs」の値として、開いているフォームで読み取ることができるパラメーターを指定できます。

Me.OpenArgsを使用したPrivate Sub Form_Load() 複数のパラメーターを渡す必要がある場合は、記号で区切ったテキスト文字列として渡すことができます。 さらに、Private Sub Form_Load()でパーツに分割します。



  If Len(Me.OpenArgs) > 0 Then x = Split(Me.OpenArgs, "|") '     ,   | param1 = x(0) param2 = x(1) param3 = x(2) End If
      
      







8.多くの人は、Accessがmdb / accdbファイルのテーブルだけでなく、他のデータベースのテーブルでも機能することを忘れています。 既存のテーブルをエクスポートするには、 SQL Server Migration Assistantという無料のユーティリティがありますが、組み込みの機能を使用するか、サードパーティのソリューションを見つけることができます。



最後に、「すべての子供がこれを知っているが、私はそれを知りませんでした...」というカテゴリからの小さなヒント:



Accessファイルを開いてデフォルトのフォームを開かないときにマクロが機能しないようにするには、Shiftキーを押したままにする必要があることをご存知ですか?



All Articles