[vba]Erreur sur ajout de code dynamique

ludo27

XLDnaute Junior
[Resolu][vba]Erreur sur ajout de code dynamique

Bonjour,
après l'insertion automatique d'un onglet, j'essaie de lui ajouter du code avec la procédure suivante :

Code:
Public Sub AjouteCodeAOnglet(MyOnglet As String)
  'Ajoute la procédure dans la feuille
    
    Dim NomVb As String
    'Application.Wait Now + TimeValue("0:00:10")
        
    Dim X As Integer
    With ActiveWorkbook.VBProject.VBComponents(Sheets(MyOnglet).CodeName).CodeModule
        X = .CountOfLines
        If X = 0 Then X = 1
        .InsertLines X + 1, "Private Sub WorkSheet_Change(ByVal Target As Range) " & vbCrLf
        .InsertLines X + 2, " Call InterceptTouche " & vbCrLf
        .InsertLines X + 3, "End Sub"
    End With
 
 End Sub

Quand j'éxécute le code la première fois après avoir ouver le classeur j'obtiens l'erreur :
Subscript out of range
sur la ligne
Code:
With ActiveWorkbook.VBProject.VBComponents(Sheets(MyOnglet).CodeName).CodeModule

Si je force la poursuite de l'éxécution, Excel plante.

En revanche si j'arrête l'éxécution, les fois suivantes, la procédure s'éxécute sans erreur.

Je n'arrive pas à comprendre ce qui se passe.

Si quelqu'un a une idée ....

Merci :)
 
Dernière édition:
C

Compte Supprimé 979

Guest
Re : [vba]Erreur sur ajout de code dynamique

Bonjour Ludo27,

Le plus simple serait de mettre ta procédure dans ThisWorkbook
Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  Call InterceptTouche
End Sub

Nota : Tu as appelé ta procédure "InterceptTouche" ce qui est une erreur, puisque l'évènement "Change" ne s'éxécute qu'après modification et validation d'une cellule et non sur saisi au clavier ;)

A+
 

ludo27

XLDnaute Junior
Re : [vba]Erreur sur ajout de code dynamique

Bonjour Ludo27,

Le plus simple serait de mettre ta procédure dans ThisWorkbook
Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  Call InterceptTouche
End Sub

Nota : Tu as appelé ta procédure "InterceptTouche" ce qui est une erreur, puisque l'évènement "Change" ne s'éxécute qu'après modification et validation d'une cellule et non sur saisi au clavier ;)

A+
Merci beaucoup BrunoM45, en effet ça marche très bien en mettant le code dans Workbook_SheetChange de ThisWorkbook :)

Ma recherche m'aura au moins appris à générer du code dynamique ;)

La procédure que j'ai appelée InterceptTouche parcourt toutes les touches du clavier en utilisant l'API windows GetAsyncKeyState pour vérifier si une touche a été enfoncée. Ca marche :D

Code:
Sub InterceptTouche()
Application.ScreenUpdating = False
'utilisation de l'API GetAsyncKeyState pour détecter touche enfoncée
'parcourt toutes les touches pour vérifier si elles sont enfoncées
    For i = 1 To 255
        If GetAsyncKeyState(i) <> 0 Then
            MetAJourStatusDansUnOnglet (ActiveSheet.Name)
        End If
    Next i
End Sub

Il faut mettre en en-tête de module

Code:
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

En tout cas merci pour ton idée, je n'y avais pas pensé :)
 
Dernière édition:

Discussions similaires

Réponses
2
Affichages
129

Statistiques des forums

Discussions
311 709
Messages
2 081 779
Membres
101 816
dernier inscrit
Jfrcs