IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Atteindre une ligne de code vba en vba [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Almeyric
    Inscrit en
    Octobre 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Almeyric
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2014
    Messages : 53
    Par défaut Atteindre une ligne de code vba en vba
    Bonjour,

    Je dois modifier le code vba de pas moins de 160 fichiers .xlsm.

    Pour pas tout me coltiner à la main, je désire le faire à l'aide d'une macro.

    Hors je bloque sur le comment atteindre la ligne de code 2244 du module pour y insérer la nouvel ligne de code.

    .CountofLines me donne bien le nombre de lignes mais je ne vois pas si on peut le faire avec cette fonction ou non.

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    avec un visu sur ta procédure déjà réalisée on y verrait plus clair

    en attendant, voici deux sujets pas tout à fait identiques au tient, mais traitant de la manipulation du VBE :

    - chercher une ligne de code dans un projet : http://www.developpez.net/forums/d15...claree-module/


    - supprimer une ligne de macro (remplacer ou inserer n'est pas bien compliqué en termes de modification) : http://www.developpez.net/forums/d15...er-code-macro/

  3. #3
    Membre averti
    Homme Profil pro
    Almeyric
    Inscrit en
    Octobre 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Almeyric
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2014
    Messages : 53
    Par défaut
    En effet, j'ai déjà mon code adapter à mes besoins venant de http://silkyroad.developpez.com/VBA/...cEditor/#LIV-C

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    Sub Modifier_Fichier_xlsm()
     
    Dim Rep_Racine As String, Rep_Annee As String, File_ext As String, LeRep As String
    Dim Debut As Integer, Lignes As Integer, X As Integer
    Dim Fichier As String, Direction As String
    Dim Doc As Document
     
    Application.ScreenUpdating = False
     
    'boucle sur tous les fichiers .xlsm du repertoire
    Rep_Racine = "Z:\Bulletins de salaires\"
    Rep_Annee = Year(DateValue(Now))
    File_ext = ".xlsm"
    Fichier = Dir(Rep_Racine & Rep_Annee & "\" & File_ext)
    Do While Fichier <> ""
     
    Set ThisWorkbook = Documents.Open(Rep_Racine & Rep_Annee & "\" & Fichier)
     
        'suppression de la ligne 2244 de "BULLETIN_ACCUEIL" dans Module1
        With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
        Debut = .ProcStartLine("BULLETIN_ACCUEIL", 0)
        Lignes = .ProcCountLines("BULLETIN_ACCUEIL", 0)
        '.DeleteLines Debut, Lignes
        .DeleteLines 2244
        End With
     
        'ajoute le nouveau code à la ligne 2244 et 2245 dans Module1
        With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
        X = .CountOfLines
        .InsertLines X + 1, "Call ENVELOPPE_ACCUEILLI"
        .InsertLines X + 2, "'Call IMPRESSION_BULLETIN"""
        End With
     
        'suppression de la ligne 4745 de "BULLETIN_ACCUEIL" dans Module1
        With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
        Debut = .ProcStartLine("BULLETIN_ACCUEIL", 0)
        Lignes = .ProcCountLines("BULLETIN_ACCUEIL", 0)
        '.DeleteLines Debut, Lignes
        .DeleteLines 4745
        End With
     
        'ajoute le nouveau code à la ligne 4745 dans Module1
        With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
        X = .CountOfLines
        Dim PrintArea As String
        PrintArea = "$A$1:$L$65"
        .InsertLines X + 1, "ActiveSheet.PageSetup.PrintArea = " & PrintArea
        End With
     
        'suppression de la ligne 4757 de "BULLETIN_ACCUEIL" dans Module1
        With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
        Debut = .ProcStartLine("BULLETIN_ACCUEIL", 0)
        Lignes = .ProcCountLines("BULLETIN_ACCUEIL", 0)
        '.DeleteLines Debut, Lignes
        .DeleteLines 4757
        End With
     
        'ajoute le nouveau code à la ligne 4757 dans Module1
        With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
        X = .CountOfLines
        Dim PrintArea As String
        PrintArea = "$A$1:$L$65"
        .InsertLines X + 1, "ActiveSheet.PageSetup.PrintArea = " & PrintArea
        End With
     
    DoEvents
    Doc.Close True
    Set Doc = Nothing
     
    Fichier = Dir
    Loop
    Application.ScreenUpdating = True
     
    End Sub
    Le problème, c'est d'être certain de ne travailler que sur les lignes concernées.

  4. #4
    Membre averti
    Homme Profil pro
    Almeyric
    Inscrit en
    Octobre 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Almeyric
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2014
    Messages : 53
    Par défaut
    Plusieurs erreurs dans le code du poste précédent, que j'ai corrigé ci-dessous. Mais il ne rentre pas dans la boucle car pour lui aucun fichier xlsm dans le dossier....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    Dim Rep_Racine As String, Rep_Annee As String, File_ext As String, LeRep As String
    Dim Debut As Integer, Lignes As Integer, X As Integer
    Dim Fichier As String, Direction As String
    Dim ThisWorkbook As Workbook
     
    Application.ScreenUpdating = False
     
    'boucle sur tous les fichiers .xlsm du repertoire
    Rep_Racine = "C:\"
    Rep_Annee = Year(DateValue(Now))
    Direction = Rep_Racine & Rep_Annee
    File_ext = ".xlsm"
    Fichier = Dir(Direction & "\" & File_ext)
     
    Do While Fichier <> ""
     
    Set ThisWorkbook = Workbooks.Open(Rep_Racine & Rep_Annee & "\" & Fichier)
     
        'suppression de la ligne 2244 de "BULLETIN_ACCUEIL" dans Module1
        With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
        Debut = .ProcStartLine("BULLETIN_ACCUEIL", 0)
        Lignes = .ProcCountLines("BULLETIN_ACCUEIL", 0)
        '.DeleteLines Debut, Lignes
        .DeleteLines 2244
        End With
     
        'ajoute le nouveau code à la ligne 2244 et 2245 dans Module1
        With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
        X = .CountOfLines
        .InsertLines X + 1, "Call ENVELOPPE_ACCUEILLI"
        .InsertLines X + 2, "'Call IMPRESSION_BULLETIN"""
        End With
     
        'suppression de la ligne 4745 de "BULLETIN_ACCUEIL" dans Module1
        With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
        Debut = .ProcStartLine("BULLETIN_ACCUEIL", 0)
        Lignes = .ProcCountLines("BULLETIN_ACCUEIL", 0)
        '.DeleteLines Debut, Lignes
        .DeleteLines 4745
        End With
     
        'ajoute le nouveau code à la ligne 4745 dans Module1
        With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
        X = .CountOfLines
        Dim PrintArea As String
        PrintArea = "$A$1:$L$65"
        .InsertLines X + 1, "ActiveSheet.PageSetup.PrintArea = " & PrintArea
        End With
     
        'suppression de la ligne 4757 de "BULLETIN_ACCUEIL" dans Module1
        With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
        Debut = .ProcStartLine("BULLETIN_ACCUEIL", 0)
        Lignes = .ProcCountLines("BULLETIN_ACCUEIL", 0)
        '.DeleteLines Debut, Lignes
        .DeleteLines 4757
        End With
     
        'ajoute le nouveau code à la ligne 4757 dans Module1
        With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
        X = .CountOfLines
        .InsertLines X + 1, "ActiveSheet.PageSetup.PrintArea = " & PrintArea
        End With
     
    DoEvents
    ThisWorkbook.Close True
    Set ThisWorkbook = Nothing
     
    Fichier = Dir
    Loop
    Application.ScreenUpdating = True

  5. #5
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    J'ai l'impression que tu mets la charrue devant les bœufs.

    1) Les macros en question sont elles toutes regroupées dans un module unique ?

    2) Si oui
    2.1) tu prends un des classeurs et tu corriges le module. Tu peux le faire à la main. Rien ne remplace l'œil humain pour le faire à la bonne place
    2.2) Tu exportes ton module.
    2.3) Tu peux ensuite supprimer tous les vieux modules de tous les autres classeurs (Tu devrais pouvoir le faire avec une macro si tu en as envie). Tu peux même les exporter avant de les supprimer, au cas où ils seraient différents
    2.4) Tu reprends tes classeurs rendus infirmes et tu leur fait importer le nouveau module.

    Mais, es-tu bien sûr de devoir passer par là. Parce que, moi, je le ferais différemment, surtout si tes fichiers sont au format Excel 2007 et suivants.

    À moins d'être bien "malchanceux", tes 160 classeurs sont "enfants" d'un nombre restreint de classeurs de base.

    Tu refais tes classeurs de base en classeurs modèles, ou en macros complémentaires.

    Et là, si ta boîte a déjà la license, tu utilises VB.net et le SDK Open XML pour transformer tes classeurs existants en classeurs ordinaires sans macro. Il y a même un exemple gratuit VB.net sur le site de Microsoft.

    Si ta boîte n'a pas VB.net, tu peux télécharger une version de VS Community (2013 ou 2015) gratuite sur le site de MS. Une Express devrait être suffisante, mais Community c'est beaucoup mieux.

    Ensuite, tous le nouveaux classeurs vont devoir être basés sur le modèle ou utiliser les macros à partir de la macro complémentaire et être enregistrés sans macros. Bien plus simple pour la maintenance.

  6. #6
    Membre averti
    Homme Profil pro
    Almeyric
    Inscrit en
    Octobre 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Almeyric
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2014
    Messages : 53
    Par défaut
    Citation Envoyé par clementmarcotte Voir le message
    Bonjour,

    J'ai l'impression que tu mets la charrue devant les bœufs.
    Bonjour, non je ne pense pas, mais c'est un point de vue...

    1) Les macros en question sont elles toutes regroupées dans un module unique ?
    Oui, c'est le cas.

    2) Si oui
    2.1) tu prends un des classeurs et tu corriges le module. Tu peux le faire à la main. Rien ne remplace l'œil humain pour le faire à la bonne place
    C'est fait dans le fichier "maitre" xlsm.

    2.2) Tu exportes ton module.
    2.3) Tu peux ensuite supprimer tous les vieux modules de tous les autres classeurs (Tu devrais pouvoir le faire avec une macro si tu en as envie). Tu peux même les exporter avant de les supprimer, au cas où ils seraient différents
    2.4) Tu reprends tes classeurs rendus infirmes et tu leur fait importer le nouveau module.
    Ce qui correspond au code ci-dessus.

    Mais, es-tu bien sûr de devoir passer par là. Parce que, moi, je le ferais différemment, surtout si tes fichiers sont au format Excel 2007 et suivants.

    À moins d'être bien "malchanceux", tes 160 classeurs sont "enfants" d'un nombre restreint de classeurs de base.

    Tu refais tes classeurs de base en classeurs modèles, ou en macros complémentaires.
    En effet, j'ai bien un classeur maître-modèle qui sert de base pour mes fichiers "enfants".

    Et là, si ta boîte a déjà la license, tu utilises VB.net et le SDK Open XML pour transformer tes classeurs existants en classeurs ordinaires sans macro. Il y a même un exemple gratuit VB.net sur le site de Microsoft.

    Si ta boîte n'a pas VB.net, tu peux télécharger une version de VS Community (2013 ou 2015) gratuite sur le site de MS. Une Express devrait être suffisante, mais Community c'est beaucoup mieux.

    Ensuite, tous le nouveaux classeurs vont devoir être basés sur le modèle ou utiliser les macros à partir de la macro complémentaire et être enregistrés sans macros. Bien plus simple pour la maintenance.
    Alors là, tu m'intéresses !! Malheureusement pas de licence étant donné que ce n'est qu'une Fédération. Mais je vais me pencher sur VS Community. Si des tutos existent pour m’éviter de chercher, je suis preneur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur dans une ligne de code VBA
    Par chpierro62 dans le forum Général VBA
    Réponses: 1
    Dernier message: 13/01/2012, 22h41
  2. analyse d'une ligne de code vba
    Par Nourson dans le forum VBA Access
    Réponses: 3
    Dernier message: 11/09/2011, 12h05
  3. une action dans excel peut elle créer une ligne de code dans VBA?
    Par beebe dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 25/09/2008, 07h23
  4. Bug dans une ligne de code VBA
    Par orlacit dans le forum VBA Access
    Réponses: 5
    Dernier message: 08/11/2007, 15h25
  5. Réponses: 7
    Dernier message: 19/12/2006, 12h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo