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 :

Enchaînement fonctions dans une macro


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de steve o'steen
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Par défaut Enchaînement fonctions dans une macro
    Bonjour tout le monde,

    Déjà pour planter le tableau, je suis un parfait débutant, même si je comprends les programmes et j'aime la programmation, je n'ai jamais réellement chercher à coder.
    Aujourd'hui, j'ai besoin d'une macro qui effectué du tri de données.

    En gros mon besoin, je copie des datas brut dans des feuilles de mon fichier excel, et j'élague pour ensuite copier les données dans la première feuille pour avoir un tableau croisé dynamique.
    A un moment, je n'arrive pas à comprendre mais mon programme ne fonctionne plus, et ce sans générer d'erreur.

    Dans l'ordre du fonctionnement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub main()
     
    UserForm1.Show
     
    End Sub
    lance un Sub avec un bouton qui lance les actions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Private Sub Sort_data_Cmd_Btn_Click()
     
        Dim I As Integer
        I = ActiveWorkbook.Sheets.Count
        UserForm2.Label1.Caption = "Il y a" & " " & I - 1 & " " & "feuilles de nomenclatures machines"
        UserForm2.Show vbModal
        Data_Treatment
     
    End Sub
    Mon bouton lance un userform 2 avec le nombre de feuilles prises en compte par 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Sub Data_Treatment()
        Dim I As Integer
        While I = ActiveWorkbook.Sheets.Count - 1
     
                Prep_Columns I + 1
                Transpose_Copy_Columns I + 1
        Wend
     
    End Sub
     
    Sub Prep_Columns(A)
        Sheets(A).Activate
        'suppression des colonnes B et C
        Columns("B:C").Select
        Selection.Delete Shift:=xlToLeft
     
    End Sub
     
    Sub Transpose_Copy_Columns(B)
            Sheets(B).Activate
            'copie des datas avec transposition
            Range("A1:B100").Select
            Selection.Copy
            Sheets("sheet(1)").Select
            Range("A" & I + 2).Select
            Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=True
    End Sub
    Et là, je ne comprend pas, mais excel ne traite pas mes données.
    Il y a quelque chose que je ne comprend pas, je vois pas l'erreur.

    Merci d'avance, même si je suis sur que mon problème est une erreur ultra conne.

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par steve o'steen Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        While I = ActiveWorkbook.Sheets.Count - 1
                Prep_Columns I + 1
                Transpose_Copy_Columns I + 1
        Wend
    Contrairement à une boucle For, la boucle While n'incrémente pas de variable.
    Donc, ta boucle va tourner éternellement avec I=0 sans jamais pouvoir progresser ni sortir.

    Autre détail : tu n'initialises pas la valeur de I.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        I = 2
        While I = ActiveWorkbook.Sheets.Count
            Prep_Columns I
            Transpose_Copy_Columns I
            I = I + 1
        Wend
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Prep_Columns(A)
        Sheets(A).Activate
        'suppression des colonnes B et C
        Columns("B:C").Select
        Selection.Delete Shift:=xlToLeft
     
    End Sub
    Plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Prep_Columns(A)
        Sheets(A).Columns("B:C").Delete
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Transpose_Copy_Columns(B)
            Sheets(B).Activate
            'copie des datas avec transposition
            Range("A1:B100").Select
            Selection.Copy
            Sheets("sheet(1)").Select
            Range("A" & I + 2).Select
            Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=True
    End Sub
    Plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Transpose_Copy_Columns(B)
        Sheets(B).Range("A1:B100").Copy
        Sheets("sheet(1)").Range("A" & I + 2).PasteSpecial Transpose:=True
    End Sub
    Mais cette dernière macro ne fonctionnera pas correctement parce que I n'a pas été initialisé dans ce Sub.
    Mais comme je ne sais pas où tu comptes placer ta copie, difficile de corriger.

  3. #3
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Je verrais mieux une procédure Data_Treatment qui ressemblerait à cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Data_Treatment()
    Dim I As Integer
        I = 1
        While I <= ActiveWorkbook.Sheets.Count - 1
            Prep_Columns I + 1
            Transpose_Copy_Columns I + 1
            I = I + 1
        Wend
    End Sub
    Cordialement.

    Edit : Salutations Menhir ... Oups ! pas rafraîchi à temps.

  4. #4
    Membre confirmé Avatar de steve o'steen
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Par défaut
    Bonjour tout le monde, déjà merci pour vos retours.

    Donc en gros, la boucle While qui incrémentent pas et des variables non initialisées, ok j'ai compris.
    @gFZT82, en effet c'est comme cela que je l'avais réécrit avant de voir ton message.

    @Menhir, en effet l'initialisation de I en partant de 2 pour éviter la première feuille est largement plus élégant en terme de lecture.

    Du coup mon code devient
    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
     
    Sub Data_Treatment()
        Dim I As Integer
        I = 2
        While I <= ActiveWorkbook.Sheets.Count
            Prep_Columns I
            Transpose_Copy_Columns I
            I = I + 1
        Wend
     
    End Sub
     
    Sub Prep_Columns(A)
        Sheets(A).Columns("B:C").Delete
     
    End Sub
     
    Sub Transpose_Copy_Columns(B)
        Sheets(B).Range("A1:B100").Copy
        Sheets(Synthese).Range("A" & B * 2 + 2).PasteSpecial Transpose = True
    End Sub
    Dans ce bout de code, j'ai modifié le range ("A" & B*2+2) car j'ai deux lignes à copier, histoire de ne pas avoir d'overlap.
    Par contre, si je mets Sheets(1), Sheets(Synthese) (le vrai nom de la feuille) il me met comme erreur La méthode pastespecial de la classe range a échoué.
    Lorsque je mettais Sheets("sheet(1)") il me génère l'erreur "l'indice n’appartient pas à la sélection", toujours sur la ligne du pastespecial

    Je pense que le Sheets("sheet(1)") était une erreur de syntaxe de la déclaration, et que le Sheets(synthese) est certes une méthode statique mais qu'elle est propre.

    Votre avis ?

    merci d'avance

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par steve o'steen Voir le message
    Par contre, si je mets Sheets(1), Sheets(Synthese) (le vrai nom de la feuille) il me met comme erreur La méthode pastespecial de la classe range a échoué.
    Cette formulation signifie : l'onglet dont l'indice est dans la variable Synthese.
    Si tu veux désigner un onglet par son nom, il faut le mettre entre guillemets : Worksheets("Synthese").
    Et, dans la mesure du possible, évite d'utiliser Sheet quand tu peux utiliser Worksheet. Ca évite certaines ambigüités.

    Lorsque je mettais Sheets("sheet(1)") il me génère l'erreur "l'indice n’appartient pas à la sélection", toujours sur la ligne du pastespecial
    Cette formulation signifie qu'un onglet porterait littéralement le nom "sheet(1)".
    Pour désigner la première feuille, écrire simplement Worksheets(1).

    Du coup mon code devient
    Tu te compliques la vie.
    On va simplifier un grand coup (en corrigeant quelques bricoles au passage) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Data_Treatment()
        Dim I As Long
        For I = 2 To ActiveWorkbook.Sheets.Count
            Worksheets(I).Columns("B:C").Delete
            Worksheets(I).Range("A1:B100").Copy
            Worksheets("Synthese").Cells(I * 2 + 2, "A").PasteSpecial Transpose = True
        Next I
    End Sub

  6. #6
    Membre confirmé Avatar de steve o'steen
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Par défaut
    Merci de ton retour Menhir

    Au départ mon idée de suaucissonage était de pouvoir rappeler les fonctions à d'autres endroits mais en effet pour un début, autant ne pas trop se compliquer la vie.


    Question, pourquoi I as Long et non Integer ?

    Du coup j'ai collé le code comme tu as fait, néanmoins j'ai toujours une erreur de type 1004, la méthode pastespecial de la classe range a échoué.
    Je comprend pas trop pourquoi, peut être manque t'il des arguments pour le pastespecial ?

    Merci d'avance

  7. #7
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par steve o'steen Voir le message
    Question, pourquoi I as Long et non Integer ?
    Personnellement, je n'utilise plus le type Integer.
    Ce type pouvait éventuellement se justifier à une époque où les RAM se chiffraient en ko mais aujourd'hui il serait ridicule d'économiser 2 octets (sauf s'il s'agit d'une variable tableau avec plusieurs indices très élevés). Tout comme il est ridicule de voir l'usage du type Byte pour des valeurs dont la nature n'a rien à voir avec ce type.

    De plus, il m'est arrivé de passer de longues minutes à chercher la cause d'un bug qui était dû à la limite de 32000 (et des poussières) de l'Integer.
    Maintenant, j'utilise systématiquement le type Long pour des entiers.

    En plus, ça fait trois caractères en moins à taper. C'est toujours ça de gagné.

    Du coup j'ai collé le code comme tu as fait, néanmoins j'ai toujours une erreur de type 1004, la méthode pastespecial de la classe range a échoué.
    Je comprend pas trop pourquoi, peut être manque t'il des arguments pour le pastespecial ?
    A ma connaissance, il n'y a pas d'arguments obligatoires pour PasteSpecial : https://msdn.microsoft.com/fr-fr/lib...6(v=office.15)
    Par contre, la transmission d'un paramètre doit se faire avec ":" devant le "=".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Worksheets("Synthese").Cells(I * 2 + 2, "A").PasteSpecial Transpose := True
    Tu aurais pu consacrer quelques minutes pour le chercher par toi-même.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 16/02/2016, 17h40
  2. comment utiliser un programme comme une fonction dans une macro exel
    Par ERICKO dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/10/2007, 23h39
  3. Bug lors de l'utilisation d'une fonction dans une macro.
    Par monf29 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/06/2007, 14h35
  4. Réponses: 10
    Dernier message: 18/04/2007, 17h17
  5. Fonction SendKeys dans une macro
    Par freya91 dans le forum Access
    Réponses: 2
    Dernier message: 06/06/2006, 10h27

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