主に参照が壊れているために、一部のクライアントでは機能しないAccess-Applicationがあります。これは、たとえば、Accessランタイム2007でAccessアプリケーションを起動したが、バージョン2003または2000のOfficeがインストールされている場合に発生します。左/右/トリムなどの機能は、その時点で機能を停止します。
この問題を解決する唯一の方法は、インストールされているOfficeのバージョンをプログラムで確認し、プログラムで参照を追加することだと思います。これらの異種環境では、ユーザーがインストールしたものを制御できないためです。具体的には、ExcelとWord用のMicrosoftOfficeオブジェクトライブラリを参照する必要があります。
しかし、私はすべてのOfficeバージョンのガイドを持っておらず、それらを自動的にチェックする方法の手がかりも持っていません。
MDE/ACCDEを出荷する場合、参照を更新することはできません。
しかし、どのような特定の参照があなたの問題を引き起こしていますか? Word、Excel、またはOutlookを参照している可能性があります。その場合は、遅延バインディングを使用して、クライアントシステムにインストールされているバージョンにソリューションが関係しないようにします。
遅延バインディングは、参照を安全に削除でき、アプリが問題のコード行を実行したときにのみエラーが発生することを意味します。アプリの起動中にエラーが発生し、アプリ内のユーザーをまったく許可しないのではなく。または、mid、left、またはtrim関数呼び出しをヒットしたとき。
これは、ターゲットシステムに常駐する外部アプリケーションのバージョンがわからない場合にも非常に役立ちます。または、組織があるバージョンから別のバージョンに移行している最中の場合。
追加のテキストや詳細なリンクなどの詳細については、「 Microsoft Accessの遅延バインディング "」ページを参照してください。
そうですね、この回答は少し遅れていますが、回答を探していたように誰かがこれに遭遇した場合に備えて、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
次に例を示します-特定の参照をチェックします-それらを削除して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
これは、壊れた参照をチェックするコードサンプルです。私はこれがあなたにとって完全な解決策ではないことを知っています、しかしそれはあなたにそれをする方法のいくつかの手がかりを与えるでしょう。
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