web-dev-qa-db-fra.com

Erreur MS Access VBA: Erreur d'exécution '70' Autorisation refusée

Je crois que ce problème est le résultat d'une récente mise à jour de MS Office/Access ou Windows 10. Lorsque j'exécute ce code:

Dim s As String
With CreateObject("Scriptlet.TypeLib")
    s = Left(.Guid, 9)
   newguidx = Right(s, 8)
End With

Je reçois une erreur: autorisation refusée sur la déclaration With. Ceci est nouveau uniquement apparu après que mes administrateurs ont mis à jour nos systèmes. Je n'ai pas la possibilité d'annuler les mises à jour. Quelqu'un est tombé sur cela et a un travail à faire?

Système d'exploitation: Windows 7 Enterprise Access Version: 2010

Merci

9
jason

De Microsoft :

Ce problème est inhérent à la conception, à compter des mises à jour de sécurité de juillet. Ce contrôle est bloqué par mesure de sécurité pour empêcher l'exécution de code malveillant dans les applications Office. Nous travaillons à la publication d'un article de la base de connaissances avec la méthode recommandée. Jusqu'à ce que cette base de connaissances soit prête, je publierai le contenu ici:

Solution La méthode préférée consiste à modifier le code pour utiliser Windows API CoCreateGuid ( https://msdn.Microsoft.com/en-us /library/windows/desktop/ms688568(v=vs.85).aspx ) au lieu de 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

Solution alternative

Cela vous permettra d'utiliser CreateObject("Scriptlet.TypeLib") mais cela diminuera la protection de sécurité ajoutée par la mise à jour de sécurité d'Office juillet 2017. Vous pouvez définir une clé de registre qui permettra à Scriptlet.TypeLib D'instancier à l'intérieur des applications Office. Lorsque cette clé de Registre est définie, Office ne bloquera aucune utilisation de ce contrôle COM.

  • Ouvrez l'Éditeur du Registre.
  • Accédez à: Ordinateur\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Common\COM Compatibilité {06290BD5-48AA-11D2-8432-006008C3FBFC}
    • Remarque: vous devrez peut-être rechercher dans le Registre pour trouver l'emplacement correct sous HKEY_LOCAL_MACHINE en fonction de votre version Office installée.
  • Ajouter ActivationFilterOverride
  • Définir DWORD: 1

Instructions détaillées:

  1. Cliquez sur Démarrer, sur Exécuter, tapez regedit dans la zone Ouvrir, puis cliquez sur OK. Recherchez et puis cliquez sur la clé suivante dans le Registre: HKEY_LOCAL_MACHINE
  2. Dans le menu Edition, pointez sur Rechercher, puis entrez les informations suivantes dans la zone de texte Rechercher: compatibilité COM
  3. Assurez-vous que les clés sont sélectionnées et que les valeurs et les données sont désélectionnées. Sélectionnez ensuite Correspondre à toute la chaîne uniquement, cliquez sur Rechercher suivant Localiser, puis cliquez sur la clé suivante: {06290BD5-48AA-11D2-8432-006008C3FBFC} Remarque: si la clé n'est pas présente, vous devrez l'ajouter. Dans le menu Edition, pointez sur Nouveau, puis cliquez sur Clé. Tapez {06290BD5-48AA-11D2-8432-006008C3FBFC}
  4. Dans le menu Edition, pointez sur Nouveau, puis cliquez sur Valeur DWORD (32 bits)
  5. Tapez ActivationFilterOverride pour le nom du DWORD, puis appuyez sur Entrée.
  6. Cliquez avec le bouton droit sur ActivationFilterOverride, puis cliquez sur Modifier.
  7. Dans la zone Données de la valeur, tapez 1 pour activer l'entrée de Registre, puis cliquez sur OK.
  8. Remarque pour désactiver le paramètre ActivationFilterOverride, tapez 0 (zéro), puis cliquez sur OK.
  9. Quittez l'Éditeur du Registre, puis redémarrez toute application Open Office.
19
David Zemens

Dans Access, nous pouvons suffire avec cette fonction très courte pour générer un GUID en tirant parti de Application.StringFromGUID Pour convertir des octets en GUID. Il génère cependant des GUID assez verbeux, avec le format {guid {00000000-0000-0000-0000-000000000000}}.

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

Vous pouvez supprimer les caractères indésirables, par exemple en remplaçant la dernière ligne de cette fonction par NewGUID = Mid(Application.StringFromGUID(b), 8, 36). Ensuite, le format sera 00000000-0000-0000-0000-000000000000

2
Erik A

Depuis la mise à jour de Windows supprimée "Scriptlet.TypeLib", essayez ce qui suit: -

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

Sinon, si vous vous connectez à SQL Server 2008 ou supérieur, essayez d'utiliser la fonction SQL NEWID () à la place.

1
rchacko