Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2013 Vba Indenter Interface v4.0a

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Statut
La discussion n'est pas ouverte à d'autres réponses

Jean BUSSER

XLDnaute Nouveau
Supporter XLD
Bonjour.
La démo étant séduisante, j'ai installé cette ressource. Mais dès le lancement d'Excel, le code VBA s'ffiche avec une erreur 1004 :
"Set bar = Application.VBE.CommandBars("Code Window")" "L'accès par programme au projet Visual Basic n'est pas fiable"
Je suis sous Windows 10, Excel 2013.
Que faire ?
Merci.
Jean
 
Non, c'est bon, on sait que c'est foutu par le registre.

Tu sais faire marcher les SendKeys sur une boite de dialogue ?
Je n'y arrive pas !
Sur la boite de dialogue il suffirait d'envoyer 3 fois Shift Tab et un "v".
 
Bon ça y est, ça passe ! Le "crack" sans registre !😇
VB:
Option Explicit

#If VBA7 Then
    Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
    Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
    Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
#Else
    Private Declare Function GetActiveWindow Lib "user32" () As Long
    Private Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    Private Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
#End If

Private TimerID As Variant
Private hWnd As Variant

Sub aa()
    Dim Trusted As Boolean
   
    Trusted = GetVBATrusted
    MsgBox "Avant Trusted = " & Trusted
   
    Call SetVBATrusted(Not Trusted)
   
    Trusted = GetVBATrusted
    MsgBox "Après Trusted = " & Trusted
End Sub

'-------------------------------------------------------------------------------------
'Return True if the "Trust Access to the VBA Project Object Model" checkbox is checked
'-------------------------------------------------------------------------------------
Private Function SetVBATrustedDialog() As Boolean
    Dim Trusted As Boolean
    Dim BN As Integer
   
    'Check access to VBA Project
    Trusted = GetVBATrusted
   
    'Access denied
    If Not Trusted = 0 Then
        'Prompt the User to change the Macros Security
        'BN = MsgBox("The current Macros Security does not allow access to VBA code." & vbCrLf & _
                        "You will be prompted to change this option if you agree to do so." & vbCrLf & vbCrLf & _
                        "To allow access to VBA code, check the checkbox ""Trust Access to the VBA Project Object Model""", _
                        vbOKCancel + vbInformation)
                       
        BN = MsgBox("La sécurité actuelle des macros n'autorise pas l'accès au code VBA." & vbCrLf & _
            "Vous serez invité à modifier cette option si vous acceptez." & vbCrLf & vbCrLf & _
            "Pour autoriser l'accès au code VBA, cochez la case ""Autoriser l'accès au modèle objet du projet VBA""", _
                    vbOKCancel + vbInformation)
                   
        If BN = vbCancel Then Exit Function
       
        Application.CommandBars.ExecuteMso "MacroSecurity"
       
        'Check access to VBA Project
        Trusted = GetVBATrusted
    End If
   
    'Return value
    SetVBATrustedDialog = Trusted
End Function

'------------------------------------------------
'Get Trust Access to the VBA Project Object Model
'------------------------------------------------
Private Function GetVBATrusted() As Boolean
    Dim Version As String
    Dim ErrNumber As Long
   
    On Error Resume Next
    Version = ThisWorkbook.VBProject.VBE.Version
    ErrNumber = Err.Number
    On Error GoTo 0
   
    GetVBATrusted = (ErrNumber = 0)
End Function

'------------------------------------------------
'Set Trust Access to the VBA Project Object Model
'------------------------------------------------
Private Sub SetVBATrusted(Enable As Boolean)
    Dim Trusted As Boolean
    Dim i As Integer
   
    'Check access to VBA Project
    Trusted = GetVBATrusted
   
    If (Trusted And Enable) _
    Or (Not Trusted And Not Enable) Then
        'No change needed
    Else
        hWnd = GetActiveWindow
        TimerID = SetTimer(0, 0, 10, AddressOf TimerProc)
        Application.CommandBars.ExecuteMso "MacroSecurity"
    End If
End Sub

'-----------------------------------------------
'Async SendKeys on the Macro Security Dialog Box
'-----------------------------------------------
Private Sub TimerProc()
    Call KillTimer(0, TimerID)
    Do While GetActiveWindow = hWnd
        DoEvents
    Loop
    CreateObject("wscript.shell").SendKeys "+{TAB}+{TAB}+{TAB}v{ENTER}"
End Sub
 
Dernière édition:
non je te l'ai dit le sendkeys ne peut fonctionner apres une fenêtre MDi modale
il faut passer par l'astuce que l'on utilisait avec nos msgbox avec timer
voici la version complète
VB:
'activer l'[accès approuvé au modele d'object du projet vba] par VBA
'patricktoulon
'ici l'exemple est simple
'nous allons lancer en différer une procedure qui va se chager de taper les touche en addressOf avec l'api settimer 
#If VBA7 Then
    Private Declare PtrSafe Function SetTimer Lib "user32" ( _
                              ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr, _
                              ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
    
    Private Declare PtrSafe Function KillTimer Lib "user32" ( _
                              ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
    
    Private Declare PtrSafe Sub keybd_event Lib "user32" ( _
                              ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As LongPtr)
    Dim TimerID As LongPtr
    
#Else
    Private Declare Function SetTimer Lib "user32" ( _
                              ByVal hWnd As Long, ByVal nIDEvent As Long, _
                              ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    
    Private Declare Function KillTimer Lib "user32" ( _
                              ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
    
    Private Declare Sub keybd_event Lib "user32" ( _
                              ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    Dim TimerID As Long
#End If


' Cette procédure va être appelée automatiquement par le timer
Public Sub TimerProc(ByVal hWnd As LongPtr, ByVal uMsg As Long, _
                     ByVal idEvent As LongPtr, ByVal dwTime As Long)
    Dim Touchest As Byte, i As Byte
    KillTimer 0, TimerID
    touches = Array(&H9, &H9, &H20, &HD)
    For i = 0 To UBound(touches)
        keybd_event touches(i), 0, 0, 0 'apuie
        keybd_event touches(i), 0, &H2, 0 'relache
    Next
    
    'ne pas tester le resultat ici ça declenche l'erreur out of memory  bien connue du settimer
End Sub

Sub AccesVBOM_Timer()
    Dim Test_AccesVBOM, delayx As Long, essais As Long, dem As VbMsgBoxResult
    delayx = 1000
re:
    On Error Resume Next
    Test_AccesVBOM = ThisWorkbook.VBProject.VBComponents(1).Name 'on test l'accès
    
    ' si erreur on lance la procedure d'activation avec le cochage différé
    If Err Then
        Err.Clear
        
        ' Lancer le timer (retard de 300ms ici)
        TimerID = SetTimer(0, 0, delayx, AddressOf TimerProc)
        
        ' Ouvrir la boîte sécurité
        Application.CommandBars.ExecuteMso "MacroSecurity"
        
    Else
        
        MsgBox " ""L'accès approuvé a l'object du modèle de projet vba"" est dèjà activé!!": Exit Sub
        
    End If
    
    'créer un test ici en ajoutant un delay  non bloquant
    Application.Wait Now + 0.00001 'on peut faire un wait bloquant ici on s'en fou puisque de toute facon on a 1 seconde d'attente  avant que la proc active l'accès approuvé
    Test_AccesVBOM = ThisWorkbook.VBProject.VBComponents(1).Name 'on test l'accès
    
    'si err alors
    If Err Then
        ' si essais =0 on peut relancer une fois sur demande
        If essais = 0 Then
            dem = MsgBox("Vba n'a pas pu activé l'accès approuvé a l'object du modèle de projet vba" & vbCrLf & _
                          "Voulez vous faire une autre tentative avec un delay d'une seconde et demiet?", vbYesNo)
            If dem = vbYes Then
                delayx = delayx + 500
                essais = 1
                GoTo re
            End If
        Else
            MsgBox "c'est peine perdue"
        End If
    End If
    
    On Error GoTo 0
End Sub

Patrick
 
re
ton truc marche 3 fois sur 4
en même temps c'est un peu jouer la roulette russe

Code:
 CreateObject("wscript.shell").SendKeys "+{TAB}+{TAB}+{TAB}v{ENTER}"
        Application.CommandBars.ExecuteMso "MacroSecurity"
pour peu que le graphique soit gourmand
les touches peuvent taper trop tôt (et ou) pas toutes
car une fois la fenêtre dans la liste des window c'est terminé elle est modale tout le monde dehors

j'y ai cru au premier lancement au 2d au 3eme ,j'ai dit punaise c'est bon le 4 eme au revoir tout le monde descend

la procedure avec le timer est en addressOf elle n'est pas tributaire de la fenêtre modale
 
re
2d problème qui est moins important mais comme tu a tendance a distribuer tes petits trus sur des forum anglosaxon
sache que le "v" n'est pas forcement juste pour les versions US
quelque fois c'est le "T" pour trusted
comment on le voit ?:
et bien c'est simple les touches de raccourci sont désignées par le fait qu'elles sont SOULIGNEE
Comme ici en français dans la capture ci dessous ,c'est bien le "v" qui est souligné

comment on le voit
 
Bonjour,
Personnellement je sélectionne mon texte puis je fais au choix tabulation pour le décaler vers la droite ou majuscule tabulation pour tout ramener vers la gauche.

Ça fonctionne très bien et ça permet l'indentation.

Tu prends ton texte copie colle dans vs code et tu le laisser faire le boulot. Notes que c'est trop facile de taboulé ton code au fur et à mesure que tu l'écris.

Vs code est un IDE externe.

Notepad++ le fait très bien.
 
Dernière édition:
Re,
Là je pense que vous retombez dans vos travers, si ce n'était que de moi, je testerais si c'est OK, Si pas Ok, alors exit le VBA Indenter un point c'est tout. Et comme cela vous laissez libre choix à l'utilisateur de cocher ou non.
Y a sûrement un moyen d'éviter le redémarrage, non ? C'est lourd.
@Dudu2, Beaucoup de programme qui font des modifications sur le registre demandent à redémarrer, y compris Excel. Je ne pense pas que cela soit un problème.
 
comme ça ça marche a tout les coups en tout cas après 10 essai
si on supprime le if err=1004 on a une sub (allumer/eteint) LOL 🤪 🤪 🤣 🤣 🤪
VB:
Sub AccessVBOM()
    Dim x As Long
    On Error Resume Next
    x = ThisWorkbook.VBProject.VBE.Version
    If Err.Number = 1004 Then
        CreateObject("wscript.shell").SendKeys "---{TAB}+{TAB}+{TAB}v{ENTER}"
        Application.CommandBars.ExecuteMso "MacroSecurity"
    End If
    On Error GoTo 0
End Sub
les "---" font durer plus longtemps avant le premier tab

@Robert ce n'est pas une indentation de bloc de code vba que tu fait
chaque bloc a son indentation
ce que tu fait n'a pas de sens pour moi laisser tout a gauche ou decaler le code d'une tabulation vers la droite c'est pareil
 
J'ai modifié le code du Post #34 pour utiliser le Timer comme dans nos bons vieux MsgBox temporisés.

Pour éviter l'inconvénient de voir le dialogue s'afficher j'ai réduit au strict minimum le Timer et attendu l'arrivée de la fenêtre de dialogue.
 
non @valtraze cette question n'est plus à l'ordre du jour
car une autre securité (je ne sais ou elle est caché) fait que si ce n'ai pas fait à la main (ou simulé) tu peut mettre ce que tu veux dans le registre ca ne fonctionnera pas
y a pas de travers qui tienne @Dudu2 a trouvé son astuce, moi j'avais la mienne depuis longtemps déjà on échange c'est tout
moi je garde les deux puisque maintenant j'ai trouvé le moyen avec le send keys de @Dudu2

moi je trouve qu'on avance
si avec ça le @Jean BUSSER n'arrive pas a le mettre en place ben mon ami

je vais mettre le vba indenter à jour avec l'astuce qui ouvre simplement la fenêtre si ce n'est pas activé
ça me parait être un bon compromis entre ca fait tout et mon point de vue qui est que l'utilisateur doit prendre ses responsabilités
mais j'avoue que la @Dudu2 ma séduit avec le sendkeys avant la fenêtre (pourquoi je n'ai jamais essayé va savoir toi )
 
les "---" font durer plus longtemps avant le premier tab
Donc il y a 2 solutions, avec Timer et directement avec des caractères pour retarder l'envoi des commandes utiles.
Quel luxe on a sur ce forum ! 😂

En complément du Post #34 qui utilise le Timer, je place ici la solution directe avec les caractères retards de @patricktoulon.
VB:
Option Explicit

Sub aaa()
    Dim Trusted As Boolean
    
    Trusted = GetVBATrusted
    MsgBox "Avant Trusted = " & Trusted
    
    Call SetVBATrusted(Not Trusted)
    
    Trusted = GetVBATrusted
    MsgBox "Après Trusted = " & Trusted
End Sub


'-------------------------------------------------------------------------------------
'Return True if the "Trust Access to the VBA Project Object Model" checkbox is checked
'-------------------------------------------------------------------------------------
Private Function SetVBATrustedDialog() As Boolean
    Dim Trusted As Boolean
    Dim BN As Integer
    
    'Check access to VBA Project
    Trusted = GetVBATrusted
    
    'Access denied
    If Not Trusted = 0 Then
        'Prompt the User to change the Macros Security
        'BN = MsgBox("The current Macros Security does not allow access to VBA code." & vbCrLf & _
                        "You will be prompted to change this option if you agree to do so." & vbCrLf & vbCrLf & _
                        "To allow access to VBA code, check the checkbox ""Trust Access to the VBA Project Object Model""", _
                        vbOKCancel + vbInformation)
                        
        BN = MsgBox("La sécurité actuelle des macros n'autorise pas l'accès au code VBA." & vbCrLf & _
            "Vous serez invité à modifier cette option si vous acceptez." & vbCrLf & vbCrLf & _
            "Pour autoriser l'accès au code VBA, cochez la case ""Autoriser l'accès au modèle objet du projet VBA""", _
                    vbOKCancel + vbInformation)
                    
        If BN = vbCancel Then Exit Function
        
        Application.CommandBars.ExecuteMso "MacroSecurity"
        
        'Check access to VBA Project
        Trusted = GetVBATrusted
    End If
    
    'Return value
    SetVBATrustedDialog = Trusted
End Function

'------------------------------------------------
'Get Trust Access to the VBA Project Object Model
'------------------------------------------------
Private Function GetVBATrusted() As Boolean
    Dim Version As String
    Dim ErrNumber As Long
    
    On Error Resume Next
    Version = ThisWorkbook.VBProject.VBE.Version
    ErrNumber = Err.Number
    On Error GoTo 0
    
    GetVBATrusted = (ErrNumber = 0)
End Function

'------------------------------------------------
'Set Trust Access to the VBA Project Object Model
'------------------------------------------------
Private Sub SetVBATrusted(Enable As Boolean)
    Dim Trusted As Boolean
    Dim i As Integer
    
    'Check access to VBA Project
    Trusted = GetVBATrusted
    
    If (Trusted And Enable) _
    Or (Not Trusted And Not Enable) Then
        'No change needed
    Else
        CreateObject("wscript.shell").SendKeys String(10, "-") & "+{TAB}+{TAB}+{TAB}v{ENTER}"
        Application.CommandBars.ExecuteMso "MacroSecurity"
    End If
End Sub
 
Statut
La discussion n'est pas ouverte à d'autres réponses
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
914
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…