web-dev-qa-db-ja.com

プログラムで参照を追加する

主に参照が壊れているために、一部のクライアントでは機能しないAccess-Applicationがあります。これは、たとえば、Accessランタイム2007でAccessアプリケーションを起動したが、バージョン2003または2000のOfficeがインストールされている場合に発生します。左/右/トリムなどの機能は、その時点で機能を停止します。

この問題を解決する唯一の方法は、インストールされているOfficeのバージョンをプログラムで確認し、プログラムで参照を追加することだと思います。これらの異種環境では、ユーザーがインストールしたものを制御できないためです。具体的には、ExcelとWord用のMicrosoftOfficeオブジェクトライブラリを参照する必要があります。

しかし、私はすべてのOfficeバージョンのガイドを持っておらず、それらを自動的にチェックする方法の手がかりも持っていません。

11
Falcon

MDE/ACCDEを出荷する場合、参照を更新することはできません。

しかし、どのような特定の参照があなたの問題を引き起こしていますか? Word、Excel、またはOutlookを参照している可能性があります。その場合は、遅延バインディングを使用して、クライアントシステムにインストールされているバージョンにソリューションが関係しないようにします。

遅延バインディングは、参照を安全に削除でき、アプリが問題のコード行を実行したときにのみエラーが発生することを意味します。アプリの起動中にエラーが発生し、アプリ内のユーザーをまったく許可しないのではなく。または、mid、left、またはtrim関数呼び出しをヒットしたとき。

これは、ターゲットシステムに常駐する外部アプリケーションのバージョンがわからない場合にも非常に役立ちます。または、組織があるバージョンから別のバージョンに移行している最中の場合。

追加のテキストや詳細なリンクなどの詳細については、「 Microsoft Accessの遅延バインディング "」ページを参照してください。

3
Tony Toews

そうですね、この回答は少し遅れていますが、回答を探していたように誰かがこれに遭遇した場合に備えて、Excel参照を追加するための次のコードを見つけました。これは、MDE /でも正常に機能するようです。 ACCDE!

If Dir("C:\Program Files (x86)\Microsoft Office\Office12\Excel.exe") <> "" And Not refExists("Excel") Then
    Access.References.AddFromFile ("C:\Program Files (x86)\Microsoft Office\Office12\Excel.exe")
End If
If Dir("C:\Program Files (x86)\Microsoft Office\Office14\Excel.exe") <> "" And Not refExists("Excel") Then
    Access.References.AddFromFile ("C:\Program Files (x86)\Microsoft Office\Office14\Excel.exe")
End If
If Dir("C:\Program Files (x86)\Microsoft Office\Office12\Excel.exe") = "" And Dir("C:\Program Files (x86)\Microsoft Office\Office14\Excel.exe") = "" Then
    MsgBox ("ERROR: Excel not found")
End If

また、refExistsは次の関数を参照します。

Private Function refExists(naam As String)
Dim ref As Reference
refExists = False
For Each ref In References
    If ref.Name = naam Then
        refExists = True
    End If
Next
End Function
10
TheLaurens

次に例を示します-特定の参照をチェックします-それらを削除してAccess2000バリアントをインポートします。すべてのクライアントが同じ(最低の)バージョンの依存関係を使用していることを確認するためだけに

Sub CheckReference()
' This refers to your VBA project.
    Dim chkRef As Reference ' A reference.

    Dim foundWord, foundExcel As Boolean

    foundWord = False
    foundExcel = False

    ' Check through the selected references in the References dialog box.
    For Each chkRef In References


        ' If the reference is broken, send the name to the Immediate Window.
        If chkRef.IsBroken Then
           Debug.Print chkRef.Name
        End If

        If InStr(UCase(chkRef.FullPath), UCase("MSWORD9.olb")) <> 0 Then
            foundWord = True
        End If

        If InStr(UCase(chkRef.FullPath), UCase("Excel9.OLB")) <> 0 Then
            foundExcel = True
        End If

        If InStr(UCase(chkRef.FullPath), UCase("MSWORD.olb")) <> 0 Then
            References.Remove chkRef
        ElseIf InStr(UCase(chkRef.FullPath), UCase("Excel.EXE")) <> 0 Then
            References.Remove chkRef
        End If


    Next

    If (foundWord = False) Then
        References.AddFromFile ("\\pathto\database\MSWORD9.OLB")
    End If

    If (foundExcel = False) Then
        References.AddFromFile ("\\pathto\database\Excel9.OLB")
    End If

End Sub
2
Mark Mooibroek

これは、壊れた参照をチェックするコードサンプルです。私はこれがあなたにとって完全な解決策ではないことを知っています、しかしそれはあなたにそれをする方法のいくつかの手がかりを与えるでしょう。

Public Function CheckRefs()
    On Error GoTo Handler

    Dim rs As Recordset
    Dim ref As Reference
    Dim msg As String

    For Each ref In Application.References
        ' Check IsBroken property.
        If ref.IsBroken = True Then
            msg = msg & "Name: " & ref.Name & vbTab
            msg = msg & "FullPath: " & ref.FullPath & vbTab
            msg = msg & "Version: " & ref.Major & "." & ref.Minor & vbCrLf
        End If
    Next ref

    If Len(msg) > 0 Then MsgBox msg
    Exit Function

Handler:
    ' error codes 3075 and 3085 need special handling

    If Err.Number = 3075 Or Err.Number = 3085 Then
        Err.Clear
        FixUpRefs
    Else
        rs.Close
        Set rs = Nothing
    End If
End Function

Private Sub FixUpRefs()
    Dim r As Reference, r1 As Reference
    Dim s As String

    ' search the first ref which isn't Access or VBA
    For Each r In Application.References
        If r.Name <> "Access" And r.Name <> "VBA" Then
            Set r1 = r
            Exit For
        End If
    Next
    s = r1.FullPath

    ' remove the reference and add it again from file
    References.Remove r1
    References.AddFromFile s

    ' hidden syscmd to compile the db
    Call SysCmd(504, 16483)
End Sub
1
dwo