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 :

Convertir une macro en vba créée sur une machine 64 bit, en une version 32 bit, pour pouvoir exécuter sur 64 b


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 19
    Par défaut Convertir une macro en vba créée sur une machine 64 bit, en une version 32 bit, pour pouvoir exécuter sur 64 b
    Bonjour

    Oui, la question est tordue :

    Comment convertir une macro vba créée sur une machine 64bit, en macro qui aurait été créée sur une machine 32 bit (du moins avec un office 32 bits) pour pouvoir l’exécuter sur une machine 64 bits

    j'explique mon problème :

    J'ai récupéré une macro, et j'ai voulu "l'améliorer" pour m'être plus utile que l'originale

    Quand je dis améliorer, je voudrais préciser que je suis conscient d'être sur un site ou les intervenants sont des personnes qui vont prendre le terme améliorer pour 'optimiser' dans le sens de créer un code simple, propre et efficace

    Sauf que moi, je n'ai absolument aucune connaissance du vba, et je ne comprends pas les 90% du contenu de la macro, je voulais juste l'améliorer dans mon sens à moi, c'est à dire, la rendre plus utile pour me faciliter la tâche

    le principe de la macro :

    j'ai un fichier excel avec 2 onglets : le premier avec un bouton qui sert à lancer la macro, le 2ème où je copie un tableau excel - La macro fait "simplement" une certaine mise en forme du tableau

    ce que j'ai ajouté : 17 autres onglets, où je copie autant de tableaux à remettre en forme de la même manière que le premier

    donc, vous devinez ce que j'ai fait : j'ai recopié à la suite, la macro initiale en changeant à chaque fois le nom de l'onglet à traiter (+ le nom de l'en-tête de chaque tableau )

    j'ai fait le test avec les 2-3 premiers : super ça marche, puis j'ai foncé tête baissée pour enchaîner tous les autre sans re-tester à chaque fois

    arrivé à la fin, je fais le teste, et là, bim : erreur de compilation : procédure trop grande

    la macro fait 3655 lignes, je pensais nos machines capables de traiter 100 0000 000x plus de données ( houuuuuu )

    donc, recherche et là je lis ceci :
    ----------------------------------------------------------
    « Erreur de compilation : procédure trop grande »

    Cause
    Ce problème peut se produire car la macro VBA a été créée à l’aide d’une version 64 bits d’un programme Office 2010.

    Solution de contournement
    Pour résoudre ce problème, créez la macro VBA à l’aide d’une version 32 bits d’un programme Office 2010.
    ---------------------------------------------------------

    la macro a été créée sur office 2016 ( manifestement 64 bits ? )
    et là, je l'ai modifiée sous office 365 ( 64 bits, du moins l'ordi )

    donc, je me doute que vous, codeurs fous que vous êtes, vous allez me dire, popopop, il faut refaire la macro, optimiser le code, raccourcir, et tout et tout

    Certes, mais j'en reviens à ma question initiale, puisque la solution donnée par "microsoft docs" est de "créez la macro VBA à l’aide d’une version 32 bits d’un programme Office 2010", je me dis que je pourrais peut-être m'épargner de cramer dans la plus grande douleur de très nombreux neurones, je pourrais simplement essayer d'envoyer le fichier sur un ordi 32 bits, le convertir, ou "enregistrer sous" un format 32 bits, et ensuite l’exécuter sur ma machine 64 bits qui accepterait alors, peut-être, d’exécuter le code, parce que, si j'ai bien compris, le code ne s’exécute pas, parce qu'il sait qu'il a été créée sur 64 bits et que si on essayait de le lancer sur 32 bits, il serait trop grand ? ( j'espère ne pas vous avoir perdus ? )

    je voudrais aussi éviter de poster la macro, car je l'utilise au travail et c'est relativement confidentiel

    Merci donc de vos avis concernant la question initiale

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    Question:
    Une macro unique de plus de 3000 lignes dans un même module, c'est énorme, n'y a t-il pas moyen d'en sortir une ou plusieurs parties, d'en faire des sous-programmes et les copier dans un autre module., Et depuis la à macro principale appeler ces sous-programmes?

    Cdlt

  3. #3
    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,

    Une macro ne devrait jamais faire plus de 200 lignes !

    Un code, ça s'architecture en plusieurs macros qui traitent chacune des grandes tâches à effectuer
    Et chacune de ces macros est à nouveau découpée en plusieurs macros qui traitent chacune d'une tâche plus ciblée
    Et ainsi de suite jusqu'aux macros qui traitent de tâches élémentaires.

    Ainsi architecturé un code est plus lisible et facile à maintenir.
    Chaque tâche élémentaire peut être testée séparément et réemployée ailleurs sans qu'il soit à nouveau nécessaire de la tester.

    Tu peux ainsi avoir des dizaines de millier de lignes sans problème.

    Edit :
    donc, vous devinez ce que j'ai fait : j'ai recopié à la suite, la macro initiale en changeant à chaque fois le nom de l'onglet à traiter (+ le nom de l'en-tête de chaque tableau )
    C'est l'exemple même de ce qu'il ne faut jamais faire !
    Il faut se remettre à la tâche pour écrire une sous-procédure unique qui s'applique dans chaque cas, en lui fournissant les éléments qui varient.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 19
    Par défaut
    Merci pour vos réponses ( auxquelles je m'attendais )

    Je les ai compris ( avant même que vous les écriviez, puisque, ayant fait des recherches avant de demander, j'en avais déjà déduis ces réponses

    Pouvons revenir à la question initiale SVP ?

    Merci

  5. #5
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    B onjour,

    Voici ce que l'on trouve sur le site de microsoft, ceci pourrait apporter des éclaircissements sur les problèmes que vous rencontrez.
    https://docs.microsoft.com/fr-fr/off...ions-of-office.

    Cdlt

  6. #6
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    La méthode est simple. Il y en a d'autres, mais celle-ci devrait t'être accessible.
    2 procédures, une d'appel et une appelée.
    La procédure appelée est celle que tu as copié/collé (sans comprendre) 17 fois.
    Tu n'as qu'à y ajouter l'argument NomOnglet et l'appeler 17 fois :

    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
    Sub Appel()
        Call MacroQueTuAsCopie("Feuil2")
        Call MacroQueTuAsCopie("Feuil3")
        Call MacroQueTuAsCopie("Feuil4")
        Call MacroQueTuAsCopie("Feuil5")
        Call MacroQueTuAsCopie("Feuil6")
        Call MacroQueTuAsCopie("Feuil7")
        Call MacroQueTuAsCopie("Feuil8")
        Call MacroQueTuAsCopie("Feuil9")
        Call MacroQueTuAsCopie("Feuil10")
        Call MacroQueTuAsCopie("Feuil11")
        Call MacroQueTuAsCopie("Feuil12")
        Call MacroQueTuAsCopie("Feuil13")
        Call MacroQueTuAsCopie("Feuil14")
        Call MacroQueTuAsCopie("Feuil15")
        Call MacroQueTuAsCopie("Feuil16")
        Call MacroQueTuAsCopie("Feuil17")
    End Sub
     
    Sub MacroQueTuAsCopie(NomOnglet As String)
        With Worksheets(NomOnglet)
            'le traitement de mise en forme ici
            'Ne pas oublier d'ajouter le . devant les objets qui se rapportent à l'onglet.
            'exemple : .Range("A1").Value = "TEST"
        End With
    End Sub
    Ne te restes qu'à tester en appelant la Sub Appel (F8)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 19
    Par défaut
    je vais étudier vos réponses, je ne manquerais pas de revenir vers vous pour vous tenir informé de l'évolution

    Merci beaucoup

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 19
    Par défaut
    Citation Envoyé par pijaku Voir le message
    Bonjour,

    La méthode est simple. Il y en a d'autres, mais celle-ci devrait t'être accessible.
    2 procédures, une d'appel et une appelée.
    La procédure appelée est celle que tu as copié/collé (sans comprendre) 17 fois.
    Tu n'as qu'à y ajouter l'argument NomOnglet et l'appeler 17 fois :

    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
    Sub Appel()
        Call MacroQueTuAsCopie("Feuil2")
        Call MacroQueTuAsCopie("Feuil3")
        Call MacroQueTuAsCopie("Feuil4")
        Call MacroQueTuAsCopie("Feuil5")
        Call MacroQueTuAsCopie("Feuil6")
        Call MacroQueTuAsCopie("Feuil7")
        Call MacroQueTuAsCopie("Feuil8")
        Call MacroQueTuAsCopie("Feuil9")
        Call MacroQueTuAsCopie("Feuil10")
        Call MacroQueTuAsCopie("Feuil11")
        Call MacroQueTuAsCopie("Feuil12")
        Call MacroQueTuAsCopie("Feuil13")
        Call MacroQueTuAsCopie("Feuil14")
        Call MacroQueTuAsCopie("Feuil15")
        Call MacroQueTuAsCopie("Feuil16")
        Call MacroQueTuAsCopie("Feuil17")
    End Sub
     
    Sub MacroQueTuAsCopie(NomOnglet As String)
        With Worksheets(NomOnglet)
            'le traitement de mise en forme ici
            'Ne pas oublier d'ajouter le . devant les objets qui se rapportent à l'onglet.
            'exemple : .Range("A1").Value = "TEST"
        End With
    End Sub
    Ne te restes qu'à tester en appelant la Sub Appel (F8)
    Bonjour

    bon, j'ai testé, sachant que dans la macro que j'ai copié, il y a plusieurs fois des renvois vers le nom du 2ème onglet ( où je copie les données qui vont être mises en forme )

    sauf que comme j'ai rajouté d'autres onglets avec d'autres noms, j'ai, à chaque fois que j'ai recopié la macro, modifié le nom de l'onglet apparaissant dans la macro, par l'onglet que j'ai rajouté, ce qui fait que j'avais autant de copie de la macro que j'avais d'onglets à traiter, avec à chaque fois, le nom de l'onglet à traiter qui revenais plusieurs fois dans la macro

    DOnc, si j'ai bien compris, je dois faire ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Appel()
        Call MacroQueTuAsCopie("Feuil2")
        Call MacroQueTuAsCopie("Feuil3")
        ...
    End Sub
    
    Sub MacroQueTuAsCopie(NomOnglet As String)
        With Worksheets(NomOnglet)
            'le traitement de mise en forme ici
            ??? EN REMPLACANT ICI LE NOM DE L'ONGLET PAR (NomOnglet) à chaque fois qu'il est appelé dans la macro ???
            'Ne pas oublier d'ajouter le . devant les objets qui se rapportent à l'onglet.
            'exemple : .Range("A1").Value = "TEST"
        End With
    End Sub
    j'ai essayé et quand je lance la macro j'ai un message d'erreur qui dit : Erreur d'exécution '9' : L'indice n'appartient pas à la sélection ?

    et si je lance le débogage ça me pointe cette ligne :

    With Worksheets(NomOnglet) ( soit la 8ème ligne de la Macro )

    si je mets le pointeur dessus, ça me donne le nom de l'onglet ( Feuil2 )

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/06/2012, 20h21
  2. Réponses: 2
    Dernier message: 30/11/2010, 08h38
  3. [AC-2007] Code pour convertir mes macros en VBA.
    Par solaar dans le forum VBA Access
    Réponses: 2
    Dernier message: 05/08/2009, 19h09
  4. [Toutes versions] [VBA] Convertir une chaine en Range pour une sélection de colonnes
    Par Aurelangelo dans le forum Macros et VBA Excel
    Réponses: 34
    Dernier message: 14/04/2009, 15h37
  5. Réponses: 2
    Dernier message: 04/09/2006, 08h36

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