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 :

Macro trop grande


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mars 2021
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 35
    Par défaut Macro trop grande
    Bonjour à tous,

    Je suis plus que débutante sur VBA, partez du principe que je n'y connais rien…
    Cela fait presque une journée que je cherche une solution à mon problème sur tous types de forums alors que je suis presque sûre que la solution est toute bête (quand on connait).

    L'idée de base : j'ai un document Word modèle rempli de signets et je veux une macro dans Excel qui me génère directement ce modèle Word rempli avec les bonnes infos.
    Tout marchait très bien jusqu'à ce qu'Excel me dise que la macro était trop grande et là je n'arrive pas à la couper… j'ai essayé plein de choses trouvées sur des forum mais comme j'y connais rien je l'ai probablement mal exécuté…

    Voici la macro :
    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
    Sub Generer_PI_ESP()
    Dim NDF As String, NDF2 As String
    Dim WordApp As Word.Application
    Dim WordDoc As Word.Document
     
        NDF = ActiveWorkbook.Path & "\plan d'inspection récipient.docx"
        NDF2 = Sheets("Générer un PI ESP").Range("M3").Text & "\" & "D5370PIE" & Sheets("Générer un PI ESP").Range("D2").Text & ".doc"
        On Error Resume Next
        Set WordApp = CreateObject("Word.Application")
        Set WordDoc = WordApp.Documents.Open(NDF, ReadOnly:=False)
     
        With WordApp
            .Visible = True
            .Activate
            WordApp.ActiveDocument.Bookmarks("REC").Range.Text = UCase(Sheets("Générer un PI ESP").Range("D2").Value)
            WordApp.ActiveDocument.Bookmarks("Fonc").Range.Text = UCase(Sheets("Générer un PI ESP").Range("D6").Value)
            WordApp.ActiveDocument.Bookmarks("RF_PI").Range.Text = UCase(Sheets("Générer un PI ESP").Range("D3").Value)
            WordApp.ActiveDocument.Bookmarks("Ind_PI").Range.Text = UCase(Sheets("Générer un PI ESP").Range("D4").Value)
            WordApp.ActiveDocument.Bookmarks("Red").Range.Text = Sheets("Générer un PI ESP").Range("F3").Value
    [à peu près 478 lignes de ce type…]


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        End With
        WordDoc.Application.ActiveDocument.SaveAs NDF2
     
     
     
        Set WordDoc = Nothing
        Set WordApp = Nothing
     
        ActiveWorkbook.Close SaveChanges:=Nothing
    End Sub

    Si quelqu'un peut m'aider, tout mon service en sera reconnaissant !

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Dès qu'une procédure (ou fonction) dépasse une centaine de lignes, il faut se poser la question de l'architecture du code :
    - essayer de le découper en petites procédures qui réalisent des fonctions élémentaires.
    - essayer de réaliser une boucle plutôt qu'une longue série d'instructions similaires.

    Dans ton cas, il serait plus simple de passer par un tableau de correspondance entre les bookmarks et les cellules qui permettrait de simplifier la macro en effectuant une boucle.

    EDIT : Supprimes le On Error Resume Next Ça cache la poussière sous le tapis !!!

  3. #3
    Membre averti
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mars 2021
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 35
    Par défaut
    Merci pour la rapidité de réponse!!!

    J'ai essayé de la couper en deux avec une fonction Call mais je n'ai pas réussi… Je m'y suis probablement mal prise je sais pas…
    Pour la boucle, je n'ai pa réussi vu qu'il y a 2 variables dans ma ligne, le signet et la case excel quand j'essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = 1 to 30
        For J = 102 to 131
            WordApp.ActiveDocument.Bookmarks("DES_NOM" & i).Range.Text = Sheets("Générer un PI ESP").Range("C" & j).Value
        Next  i
    Next j
    Ca ne marche pas…

    L'idéal serait surement de pouvoir la découper comme ça par la suite je pourrai faire des fichiers encore plus grands (ce qui sera très utile dans mon service) mais si je n'y arrive pas déjà là je vais avoir du mal à m'aventurer plus loin

    EDIT : pour le on error resume next pour ma défense, il vient du copier coller que j'ai fait d'une macro déjà existante et j'avoue qu'il m'arrangeait bien

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2021
    Messages
    334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 334
    Par défaut
    Salut, rentres tous tes noms de signets dans une colonne Excel et après tu n'auras plus qu'a faire une boucle pour les parcourir. Car au moins sur excel tu as 1 millions de lignes alors que ton code VBA pourra pas en avoir autant.

    Du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    dim signet as string
    dim i as integer
    for i=1 to feuil1.Cells(Rows.Count, 1).End(xlUp).Row
     signet = Feuil1.range("a" & i).value
    WordApp.ActiveDocument.Bookmarks(signet).Range.Text = Sheets("Générer un PI ESP").Range("C" & i).Value
    next
    Tu peux même rajouter autant de signets que tu veux ça fonctionnera.

    Après effectivement le "on error resume next" peut cacher des ratés mais c'est sur que si tu as une plage variable de signets il vaut mieux le mettre pour éviter de planter sur 1/10 eme des lignes. Mais il faut avant s'assurer que ça fonctionne bien.

    A+

    CB

  5. #5
    Membre averti
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mars 2021
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 35
    Par défaut
    Etant donné que les valeurs à récupérer Range("C" & i).Value sont dans différentes colonnes ou lignes, cela marche quand même ? Ou bien je dois renouveler pour chaque colonne ?

    En tout cas merci beaucoup pour la réponse!

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2021
    Messages
    334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 334
    Par défaut
    Citation Envoyé par Gwelawen Voir le message
    Etant donné que les valeurs à récupérer Range("C" & i).Value sont dans différentes colonnes ou lignes, cela marche quand même ? Ou bien je dois renouveler pour chaque colonne ?

    En tout cas merci beaucoup pour la réponse!
    Ca depend comment est organisé ton tableau en sortie mais rien ne t'empeche de faire une opération mathématique pour décaler tes valeurs. Tu peux faire une changement de variable ou bien directement le faire dans ton range

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    dim signet as string
    dim i as integer
    for i=1 to feuil1.Cells(Rows.Count, 1).End(xlUp).Row
     signet = Feuil1.range("a" & i).value
    WordApp.ActiveDocument.Bookmarks(signet).Range.Text = Sheets("Générer un PI ESP").Range("C" & i+100).Value
    next
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    dim signet as string
    dim i as integer
    dim j as integer
    for i=1 to feuil1.Cells(Rows.Count, 1).End(xlUp).Row
    j=i+100
     signet = Feuil1.range("a" & i).value
    WordApp.ActiveDocument.Bookmarks(signet).Range.Text = Sheets("Générer un PI ESP").Range("C" & j).Value
    next
    Apres a toi d'adapter en fonction de tes besoins.

    NB: fais attention le feuil1 est un CodeName c'est pas le nom de la feuille cf : https://silkyroad.developpez.com/VBA/FeuilleDeCalcul/

    CB

  7. #7
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Re,

    Tu peux si besoin utiliser 3 colonnes :
    - le signet
    - l'adresse de la donnée
    - un code pour l’opération à faire sur cette donnée (ex. Ucase)

Discussions similaires

  1. [XL-2010] macro trop grande
    Par gigalia dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/04/2011, 12h45
  2. Taille d'archive trop grande
    Par mick84m dans le forum Shell et commandes GNU
    Réponses: 14
    Dernier message: 12/05/2005, 16h39
  3. tableau trop grand ?
    Par Praxe dans le forum C++
    Réponses: 17
    Dernier message: 17/03/2005, 14h14
  4. modélisation d'une base : table trop grande
    Par Shabata dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 22/11/2004, 11h44
  5. Surface trop grande
    Par Black_Daimond dans le forum DirectX
    Réponses: 1
    Dernier message: 18/01/2003, 03h02

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