この問題は、MS Office/AccessまたはWindows 10の最近のアップデートの結果だと思います。このコードを実行すると、次のようになります。
Dim s As String
With CreateObject("Scriptlet.TypeLib")
s = Left(.Guid, 9)
newguidx = Right(s, 8)
End With
エラーが表示されます:Withステートメントでアクセスが拒否されました。これは新しいもので、管理者がシステムを更新した後にのみ作成されます。更新をロールバックするオプションはありません。誰かがこれに遭遇して回避策を持っていますか?
OS:Windows 7 Enterprise Accessバージョン:2010
ありがとう
この問題は、7月のセキュリティ更新以降の仕様によるものです。この制御は、Officeアプリケーションで悪意のあるコードが実行されるのを防ぐためのセキュリティ対策としてブロックされます。推奨される方法でナレッジベースの記事を取得するよう取り組んでいます。そのKBの準備ができるまで、ここにコンテンツを投稿します。
回避策推奨される方法は、Windows API CoCreateGuid( https://msdn.Microsoft.com/en-us /library/windows/desktop/ms688568(v=vs.85).aspx )の代わりに
CreateObject("Scriptlet.TypeLib").Guid
_' No VT_GUID available so must declare type GUID
Private Type GUID_TYPE
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
Private Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" (Guid As GUID_TYPE) As LongPtr
Private Declare PtrSafe Function StringFromGUID2 Lib "ole32.dll" (Guid As GUID_TYPE, ByVal lpStrGuid As LongPtr, ByVal cbMax As Long) As LongPtr
Function CreateGuidString()
Dim guid As GUID_TYPE
Dim strGuid As String
Dim retValue As LongPtr
Const guidLength As Long = 39 'registry GUID format with null terminator {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
retValue = CoCreateGuid(guid)
If retValue = 0 Then
strGuid = String$(guidLength, vbNullChar)
retValue = StringFromGUID2(guid, StrPtr(strGuid), guidLength)
If retValue = guidLength Then
' valid GUID as a string
CreateGuidString = strGuid
End If
End if
End Function
_
代替の回避策
これにより、
CreateObject("Scriptlet.TypeLib")
を使用できるようになりますが、Office 2017年7月のセキュリティ更新プログラムによって追加されるセキュリティ保護機能が低下します。 _Scriptlet.TypeLib
_がOfficeアプリケーション内でインスタンスを作成できるようにするレジストリキーを設定できます。このレジストリキーが設定されている場合、OfficeはこのCOMコントロールの使用をブロックしません。
- レジストリエディターを開きます。
- 移動先:Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Common\COM Compatibility {06290BD5-48AA-11D2-8432-006008C3FBFC}
- 注:インストールされているOfficeのバージョンに基づいて、HKEY_LOCAL_MACHINEの下の正しい場所を見つけるためにレジストリを検索する必要がある場合があります。
- ActivationFilterOverrideを追加
- DWORDを設定:1
詳細な手順:
- [スタート]ボタンをクリックし、[ファイル名を指定して実行]をクリックします。[名前]ボックスにregeditと入力し、[OK]をクリックします。レジストリで次のキーを見つけてクリックします:HKEY_LOCAL_MACHINE
- [編集]メニューの[検索]をポイントし、[検索する文字列]ボックスに次のように入力します。COM互換性
- キーが選択され、値とデータが選択されていないことを確認します。次に、[文字列全体にのみ一致する]を選択し、[次を検索]をクリックして、次のキーをクリックします:{06290BD5-48AA-11D2-8432-006008C3FBFC}注:キーが存在しない場合は、追加する必要があります。 [編集]メニューの[新規]をポイントし、[キー]をクリックします。 {06290BD5-48AA-11D2-8432-006008C3FBFC}と入力します
- [編集]メニューの[新規]をポイントし、[DWORD(32ビット)値]をクリックします。
- DWORDの名前としてActivationFilterOverrideと入力し、Enterキーを押します。
- ActivationFilterOverrideを右クリックし、[変更]をクリックします。
- [値のデータ]ボックスに1と入力してレジストリエントリを有効にし、[OK]をクリックします。
- ActivationFilterOverride設定を無効にすることに注意して、0(ゼロ)を入力し、[OK]をクリックします。
- レジストリエディターを終了し、Open Officeアプリケーションを再起動します。
Accessでは、この非常に短い関数でApplication.StringFromGUID
を利用してバイトをGUIDにキャストすることでGUID=を生成できます。ただし、形式は{guid {00000000-0000-0000-0000-000000000000}}
ですが、かなり詳細なGUIDが生成されます。
Declare PtrSafe Sub CoCreateGuid Lib "ole32" (ByVal GUID As LongPtr)
Public Function NewGUID() As String
Dim b(15) As Byte
CoCreateGUID VarPtr(b(0))
NewGUID = Application.StringFromGUID(b)
End Function
たとえば、この関数の最後の行をNewGUID = Mid(Application.StringFromGUID(b), 8, 36)
で置き換えることにより、不要な文字を取り除くことができます。次に、形式は00000000-0000-0000-0000-000000000000
になります。
Windows Updateは "Scriptlet.TypeLib"を取り出したので、以下を試してください:-
Declare Function CoCreateGuid Lib "ole32" (ByRef GUID As Byte) As Long
Public Function GenerateGUID() As String
Dim ID(0 To 15) As Byte
Dim N As Long
Dim GUID As String
Dim Res As Long
Res = CoCreateGuid(ID(0))
For N = 0 To 15
GUID = GUID & IIf(ID(N) < 16, "0", "") & Hex$(ID(N))
If Len(GUID) = 8 Or Len(GUID) = 13 Or Len(GUID) = 18 Or Len(GUID) = 23 Then
GUID = GUID & "-"
End If
Next N
GenerateGUID = GUID
End Function
または、SQL Server 2008以降に接続している場合は、代わりにSQL NEWID()関数を使用してみてください。