2009-08-03 72 views
0

以下のAccess 2003のルーチンでエラー7961が発生します - データベースでモジュールが見つかりません。 しかし、それは一部のモジュールでのみ行います。どのモジュールが失敗するかは一貫しています。
どういうところが間違っていますか?モジュールでVBAエラーが発生しました: 'モジュールが見つかりません'

Private Sub DoReplace() 
    Dim obj As AccessObject 
    For Each obj In CurrentProject.AllModules 
     Debug.Print ModuleType(obj.Name) & " " & obj.Name 
    Next obj 
End Sub 

Public Function ModuleType(ByVal ModuleName As String) As Variant 
On Error GoTo errHandler 
    Dim mdl As Module 
    Set mdl = Modules(ModuleName) 
    ModuleType = mdl.Type 
    ModuleType = Switch(ModuleType = 0, "std  ", ModuleType = 1, "class ") 
    Set mdl = Nothing 
errExit: Exit Function 
errHandler: 
     ModuleType = "Err " & Err.Number '7961 
     Resume errExit 
End Function

デバッグ出力:

 
Err 7961 vba_28_Part_Asterisk 
class  cls_22_mas90_Item2 
Err 7961 vba_44_Part_WhereUsed2 
Err 7961 cls_22_JobOps_BOM_WhereUsed_method2 
Err 7961 vba_26_Part_misc 
std  vba_44_Part_MRP 
std  vba_99_TurnOffSubDataSheets 
Err 7961 vba_99_MasteringArraysByScott 
Err 7961 vba_44_Part_WhereUsed 
Err 7961 cls_22_JobOps_BOM_WhereUsed 
Err 7961 cls_22_mas90_Item 
class  cls_22_mas90_Order 
class  cls_23_HOMER_Item 
class  cls_44_mrp_record 

答えて

0

解決策は、文字列の代わりにAccessObjectを渡すことです。だから、これから:これまで

ModuleType(ByVal ModuleName As String) As Variant 

...:

ModuleType(ByVal obj As AccessObject) As Variant 

Davidのポストは再検討のコードに私を助け、また、良好な一般的な知識を提供し、彼の答えを投票アップアイムそれに応じて。しかし、私のエラーはAllコレクションの使い方ではなく、オブジェクトや関数に関するものでした。

0
Set mdl = Modules(obj.Name)

上記を行うために、モジュールオブジェクトがロードされなければなりません。

私の問題は、いくつかのモジュールがロードされたことだった - これは、(上記参照してください。objがAccessObjectで、MDLはモジュールである)

obj.IsLoaded

を使用してチェックされます。モジュールをロードするには、VBA IDEでモジュールを開きます。エラー7961はありません。

私はこの答えにいかに難しいか非常に驚いています。私はGoogle上でハンマーを叩き、私自身のいくつかの砂を適用しなければならなかった。それが他の人を助けてくれることを願っています。

+0

これは、あなたのタグにもmsアクセスを持つのに役立ちました。更新しました。 –

+0

大丈夫、ありがとう。私はそれがms-accessから独立したVBAだと考えました。 – Smandoli

5

私はあなたが問題を理解したことは知っていますが、なぜこのように動作するのか把握していないようで、あなたの問題を解決する最善の方法を考え出すことはできません。アクセスのすべてのバージョンで

は、あなたがすべての時間を使用する複数のコレクションがあります

  • テーブル定義
  • クエリ定義
  • が上がらない

などをレポートし

  • フォーム頻繁に使用される:

    • マクロ
    • モジュール

    あなただけのこのような何かを経由してテーブル定義またはクエリ定義コレクションを使用できるように、最初の2つのコレクションは、データベースのみのメンバーとしてアクセスできます。

    CurrentDB.TableDefs.Count 
    

    このTableDefsとQueryDefsはAccessオブジェクトではなく、純粋なJetオブジェクトであるためです。

    ?Forms.Count 
    

    ...イミディエイトウィンドウであった場合、あなたは0を取得する:あなたがこれを行う場合は、あなたが見ることができるよう、

    他のコレクションは、Accessオブジェクトのコレクションである、と彼らは唯一のOPENオブジェクトを含みます実際にデータベースに存在するフォームの数にかかわらず、開いているフォームはありません。

    Access 2000の前に、ドキュメントコンテナを使用して、読み込まれていない格納済みAccessオブジェクトの一覧にアクセスする必要がありました。これはむしろ複雑なものであり、オブジェクトの種類ごとに異なるアプローチが必要でした。モジュールについては、こちらのコードです:

    Dim db As DAO.Database 
        Dim cnt As Container 
        Dim doc As Document 
    
        Set db = CurrentDb 
        Set cnt = db.Containers!Modules 
        For Each doc In cnt.Documents 
        Debug.Print doc.Name 
        Next doc 
        Set doc = Nothing 
        Set cnt = Nothing 
        Set db = Nothing 
    

    そして、あなたはまた、マクロと呼ばれるコンテナに格納されていたことを知っていた「スクリプト。」かなり醜い。

    AccessプロジェクトでAccessプロジェクトが変更されたため(システムテーブル内の単一のBLOBフィールドとして複数のレコードに格納されるのではなく、オブジェクトごとに1つのBLOBフィールドとして)、CurrentProject 。すべての****コレクションが導入されました。これらは以下の通りであった:

    • CurrentProject.AllDataAccessPages
    • CurrentProject.AllForms
    • CurrentProject.AllMacros
    • CurrentProject.AllModules
    • CurrentProject.AllReports
    • あなたの目的のために

    、最良の選択でありますModulesコレクションの代わりにAllModulesコレクションを明示的に使用するようにしてください彼はモジュールが開いているかどうか。もちろん、コンテナ/ドキュメントのアプローチは機能しますが、AllModulesではコードが大幅に少なくて済みます。

    EDIT:

    AllModulesを使用するためのコードは次のとおりです。

    Dim i As Integer 
    
        For i = 0 To CurrentProject.AllModules.Count - 1 
        Debug.Print CurrentProject.AllModules(i).name 
        Next i 
    

    OR:

    Dim obj As Object 
    
        For Each obj In CurrentProject.AllModules 
        Debug.Print obj.name 
        Next obj 
        Set obj = Nothing 
    
    私はいつも私のFORループが、唯一の一般的なオブジェクトのために厳密に型指定されたオブジェクトを使用して好む

    変数はここで働くので、最後に暗黙のオブジェクトポインタを最後までクリーンアップしなくて済むので、おそらくカウンタを使用します。

    また、モジュールコレクション(つまりオープンモジュール)にはフォームモジュールとスタンドアロンおよびクラスモジュールが含まれていますが、AllModuleはスタンドアロンおよびクラスモジュールに限定されています。

  • +0

    ありがとうDavid!私はAllModulesコレクションを使用しようとしていましたが、関数を使用する方法を混乱させました。あなたの助けに感謝。 – Smandoli

    関連する問題