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 :

Simplification de macro


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Hydrobiologiste
    Inscrit en
    Octobre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Hydrobiologiste

    Informations forums :
    Inscription : Octobre 2020
    Messages : 5
    Par défaut Simplification de macro
    Bonjour,
    J'ai fait une petite macro pour mettre sous forme de "base de données" mes données. Sauf que je la trouve très lourde (le mot est faible).
    Je vous mets en lien un fichier excel exemple pour illustrer mes types de données :

    https://fil.email/CVWBQLxo

    Actuellement comme je ne sais pas bien manipuler la variable de dernière ligne (en gros je ne sais pas comment utilisé un truc du type range("b2":derlig)). Je copie des range assez large puis colle aux différentes adresses bout à bout et ensuite je supprime toute les ligne vides.

    La macro que j'ai fait est la suivante :

    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
    Sub macro()
    Sheets.Add(after:=Worksheets(1)).Name = "export"
    Sheets(1).Select
    Range("A2:A12").Copy Worksheets("export").Range("A1")
    Range("B2:B12").Copy Worksheets("export").Range("C1")
    Sheets("export").Range("B1:B10").Value = Range("B1")
    Range("A2:A12").Copy Worksheets("export").Range("A11")
    Range("C2:C12").Copy Worksheets("export").Range("C11")
    Sheets("export").Range("B11:B21").Value = Range("C1")
     
    '....ect jusqu'a la fin de mes colonnes
    Sheets("export").Activate
    [A:A].SpecialCells(xlCellTypeBlanks).EntireRow.Delete
     
    End Sub
    Elle fonctionne mais le problème c'est que mes fichiers n'ont pas tous le même nombre de colonnes ça veut dire aussi ajout manuel de bout de code en plus.

    Voila si quelqu'un a une idée pour améliorer tout ça.
    Merci d'avance

    Cordialement,
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Hello,

    Il nous serait plus facile de t'aider en expliquant ,captures d'écran en prime, ce que tu souhaites faire, ce que tu as et ce que tu souhaites avoir.

    Pour ce qui est pièces jointes dès le premier post du sujet, il vaut mieux éviter, très peux de contributeurs ouvrent celles-ci pour des raisons de sécurité.

    Bat,

  3. #3
    Membre averti
    Femme Profil pro
    Autre
    Inscrit en
    Août 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Août 2018
    Messages : 17
    Par défaut
    Hello,

    D'après ton message tu cherches à copier coller toute ta plage A:C de la ligne 1 à la dernière ligne de ton tableau.

    Voici ce que je te propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Derligne=sheets("LE NOM DE TA FEUILLE SOURCE").Range(a1).End(xlDown).Row
     
    Sheets("NOM FEUILLE SOURCE").Range(Cells(1,1),Cells(Derligne,3)).Copy
    Sheets("NOM FEUILLE DESTINATION").Range("A1").Paste 'A voir quel paste tu veux
     
    Application.CutCopyMode = False 'histoire de vider le presse papier
    NB: Cela suppose que dans ta colonne A de ta feuille source, il n'y a pas de cellule vide entre ta première et ta dernière ligne du tableau.
    S'il y en a, la plage copiée s'arrêtera à la première cellule vide

    NB2 : Dans ton code, je vois que tu supprimes les lignes vides à l'origine. Ne s'agirait-il donc pas d'un couper/coller au lieu d'un copier coller?
    Dans l'affirmative, il faut remplacer l'instruction par En espérant d'avoir donné une piste

  4. #4
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour à vous, Bonjour au Forum,

    Salut ami foxy

    Elle fonctionne mais le problème c'est que mes fichiers n'ont pas tous le même nombre de colonnes ça veut dire aussi ajout manuel de bout de code en plus.
    L'avantage des tableaux structurés est qu'il n'est pas nécessaire de connaître l'adresse de la cellule de destination

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Option Explicit
     
    Public Sub copy_tablostruc()
     
    Worksheets("Feuil1").ListObjects("Tableau1").ListColumns("parent").DataBodyRange.Copy _
            Destination:=Worksheets("Feuil2").ListObjects("Tableau2").ListColumns("Parent").DataBodyRange
    Application.CutCopyMode = False
     
    End Sub
    Ici, le champ "parent" peut être placé dans n'importe quelle colonne au sein des 2 feuilles.

    Bien entendu, comme toujours, ce processus nécessite une rigueur dans l'organisation des données.

    Autre avantage: aucune nécessité de gérer la dernière ligne. La propriété suffit

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Hydrobiologiste
    Inscrit en
    Octobre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Hydrobiologiste

    Informations forums :
    Inscription : Octobre 2020
    Messages : 5
    Par défaut
    Bonjour à touts et toutes et merci d'avoir pris le temps de me répondre.
    @niniylle :
    Sur le fond je cherche à (dans un nouvel onglet)
    copier ma première colonne (qui est ma colonne "date") -> coller le tout en colonne A de l'onglet "export"
    ensuite je récupère le contenu de la première ligne de la deuxième colonne (qui est le nom du premier paramètre) je le duplique autant de fois que j'ai de date ( en pratique je copie "large")
    je replace les résultats
    je recommence le processus autant de fois que j'ai de paramètres
    cela donne sur les conseil de mfoxy :
    Nom : explication.png
Affichages : 191
Taille : 63,6 Ko

    @Marcel intéressant cette histoire de tableaux mais est-ce aussi plastique pour remodeler les colonnes a notre guise ? Et par exemple remettre tout bout à bout ?

    bonne journée

  6. #6
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Re,

    Maintenant que l'on voit mieux ton besoin, et si ta version excel est supérieure à 2010.
    Je dirais utilisation de PowerQuery, dépivoter les colonnes paramètre et tu a ton tableau...

    Soit 4 clics, en cas d'ajout de donnée dans la table source, un simple refresh de la querytable et résultat mis à jour.
    Je ne suis pass ur mon pc, ou je t'aurais filer un fichier exemple.

    Bat,

  7. #7
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut,

    intéressant cette histoire de tableaux mais est-ce aussi plastique pour remodeler les colonnes a notre guise ? Et par exemple remettre tout bout à bout ?
    Tout à fait.

    Comme je te l'ai reporté, tu peux effectuer la copie d'un champ de tableau structuré vers 1, 2, 3... autres.

    Puis compiler 2, 3, 4.... tableaux.
    Pour ce faire, tu peux consulter cette discussion et surtout celle-ci.

    Je me répète. Un tel processus, comme tous les autres, nécessite une grande rigueur au niveau des données (Tableau structurés bien définis).

    C'est ce processus que j'adopte pour tous mes reporting de synthèse.

    Sans vouloir paraître présomptueux, je dirais qu'il est plus rigoureux que celui qui consiste à voir large pour ensuite supprimer des lignes en trop.

  8. #8
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    Bonjour,

    Voici une solution en VBA.

    C'est du code simple comme je pense que tu pourras le comprendre en voyant le code que tu as déjà dans ton fichier d'origine.
    On pourrait améliorer le temps de traitement en utilisant des tableaux mais avec ce code tu pourras déjà te former.

    Tu peux ajouter autant de lignes et de colonnes que tu le souhaites.

    Teste et dis-nous.
    Fichiers attachés Fichiers attachés

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Hydrobiologiste
    Inscrit en
    Octobre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Hydrobiologiste

    Informations forums :
    Inscription : Octobre 2020
    Messages : 5
    Par défaut
    Bonjour à tous et merci. Votre aide m'a été d'un (très) grand secours.
    @Alex020181 c'est exactement ce qu'il me fallait. Y a tout et même des explications pour adapter à ma sauce. Merci beaucoup

  10. #10
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut,

    Pour ma part, le code proposé est plus que discuttable.

    Pourquoi écrire une boucle alors que la copie peut s'effectuer d'un bloc
    Quant à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'défiltrer éventuellement "nom variable"
    On Error Resume Next
    Sheets("nom variable").ShowAllData
    On Error GoTo 0
    C'est l'exemple même de la mauvaise gestion d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With WorkSheets("nom variable")
         If .FilterMode = True Then .ShowAllData
    End With
    Je reste persuadé que la gestion d'une table de données (Tableau Structuré) répond mieux à ce type de besoin.
    Certes, elle nécessite une certaine remise en cause de nos habitudes, mais, une fois acquise, elle offre des possibilités telles que cet investissement est très vite amorti.

    Pour reprendre l'exemple précédent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Worksheets(1)
            If .FilterMode = True Then .ListObjects("Tableau1").AutoFilter.ShowAllData
    End With

  11. #11
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    C'est exact Marcel. J'utilise on error trop facilement parce-que j'ai la flemme de faire mieux (retenir certains mots clés comme filtermode par exemple) et je ne me prend pas la tête.

    Même chose pour la suppression de la feuille de résultat précédente. Je la supprime "à la barbare" plutôt que de boucler sur les feuilles du classeur pour tester son existance avec if feuille.name mais là encore c'est de la fainéantise.

    Je ne dis pas que c'est ze solution mais ça fonctionne sans me prendre la tête.

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

Discussions similaires

  1. Simplification fonction macro
    Par imo69 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/12/2013, 19h50
  2. [XL-2003] Simplification de macro
    Par FCL31 dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 30/10/2013, 16h20
  3. Simplification de macro en passant par une boucle.
    Par chpierro62 dans le forum Général VBA
    Réponses: 0
    Dernier message: 06/01/2012, 12h17
  4. Simplification de macro
    Par zeralium dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/07/2007, 15h57
  5. [VBA-Excel] Simplification de macros ...
    Par Nyang_kamen dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/01/2007, 11h04

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