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 :

Copier des données selon conditions


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    195
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2008
    Messages : 195
    Points : 82
    Points
    82
    Par défaut Copier des données selon conditions
    Bonjour,

    J'ai un tableau qui contient plusieurs informations. Quatres colonnes m'intéressent particulièrement: Nom, Secteur, Quantité, Trimestre.

    Ce tableau est sur une Feuil x, je veux prendre les informations et les mettres sur une feuille y qui n'est pas faites celon le même modèle.

    Le petit plus, le Nom est un tableau. Cela me permet d'avoir une liste modifiable a souhait sur une feuille z et mon programme s'adaptera.

    Voila la logique que j'ai utilisée pour mon programme:
    Je crée mon tableau avec les données de la feuille z (je suis obligé d'avoir cette liste car elle me sert dans un autre programme).

    Je vais sur la feuille x et je regarde quelle est la dernière ligne occupée (j'ai utilisé un compteur car il n'y a pas de cases vides entre deux).
    Si je suis dans le trimestre1
    et Si mon secteur est ....
    et Si mon nom est (utilisation de la liste)
    alors je copie la quantité dans une variable
    Sinon si mon secteur est ....
    et Si mon nom est .....

    Bref voila un peut la logique(?) lol

    Voila le programme incomplet:
    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
    Dim Cel As Range
    Dim MaListe(100) As String
    Dim Compteur As Integer
    Dim i As Integer
     
    Dim Counter As Integer
    Dim Vue_Cel As Range
    Dim j As Integer
    Dim k As Integer
    Dim CdtValeur As Integer
    Dim EstValeur As Integer
     
    Dim Tonnage1 As Range
     
     
    'Je crée ma liste à partir de la feuille Liste
     
    Set Cel = Worksheets("Liste").Range("G1")
    Compteur = 1
     
    While Cel.Offset(Compteur) <> ""
    Compteur = Compteur + 1
    Wend
     
    For i = 1 To Compteur
        MaListe(i) = Cel.Offset(i - 1)
    Next i
     
    'Ma liste est créée
    'Je vais rechercher les infos dans la feuille Vue_generale
     
    Set Vue_Cel = Worksheets("Vue_generale").Range("K1")
    Counter = 1
     
    While Vue_Cel.Offset(Counter) <> ""
    Counter = Counter + 1
    Wend
     
    ' je prends les quantités et je les mets dans des variables
     
    For j = 1 To 100
    For k = 1 To Counter
     
        If Vue_Cel.Offset(k) = "1" Then
            If Vue_Cel.Offset(k, -8) = "conditionnement" Then
                If Vue_Cel.Offset(k, -10) = MaListe(j) Then
                CdtValeur(j) = CdtValeur + Vue_Cel.Offset(k, -2)
            ElseIf Vue_Cel.Offset(k, -8) = "estérification" Then
            If Vue_Cel.Offset(k, -10) = MaListe(j) Then
            EstValeur(j) = EstValeur + Vue_Cel.Offset(k, -8)
            End If
        End If
        End If
    Next
    Next
    Je me suis arrêté la car a mon second next il me dit qu'il manque un tableau.
    J'imagine que c'est a cause de CdtValeur(j) et EstValeur(j).

    Le problème c'est que si ma liste venait à contenir 100 noms, je vais pas m'amuser à écrire 100 variables moi même... CdtValeur1 => CdtValeur100....


    Le programme n'est pas complet. ensuite je mets ma liste dans ma feuille y et je place les quantités qui seront dans mes différentes variables (CdtValeur1...) à l'endroit approprié. Mais si écrire CdtValeur(j) (avec j de 1 a 100, ne fonctionne pas, je suis un peu dans la M.... )

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut BOU59000 et le forum
    Bref voila un peut la logique(?) lol
    Je ne la comprends pas, mais si tu étais logique, tu déclarerais les 2 tableaux que tu compte utiliser en variables tableaux. J'imagine que c'est a cause de CdtValeur(j) et EstValeur(j). Oui, mais regarde tes déclarations! Où est déclaré le tableau EstValeur() ?
    Ton code, juste regardé
    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
    Dim Cel As Range
    Dim MaListe(100) As String
    Dim Compteur As Integer
    Dim i As Integer
     
    Dim Counter As Integer
    Dim Vue_Cel As Range
    Dim j As Integer
    Dim k As Integer
    Dim CdtValeur As Integer
    Dim EstValeur As Integer
     
    Dim Tonnage1 As Range
     
     
    'Je crée ma liste à partir de la feuille Liste
    With Worksheets("Liste")
        For Each Cel In .Range(.[G1], .[G1].End(xlDown))
            MaListe(Compteur) = Cel
            Compteur = Compteur + 1
        Next Cel
    End With
     
    With Worksheets("Vue_generale")
        For j = 1 To 100
            For k = 1 To .Range("K1").End(xlDown).Row
                If .Range("K" & k) = "1" Then
                    If .Range("C" & k) = "conditionnement" Then
                        If .Range("A" & k) = MaListe(j) Then _
                            CdtValeur(j) = CdtValeur + .Range("I" & k)
                    ElseIf .Range("C" & k) = "estérification" Then
                        If .Range("A" & k) = MaListe(j) Then _
                            EstValeur = EstValeur+ .Range("C" & k) '????
                    End If
                End If
            Next k
        Next j
    End With
    en parlant de logique :
    tu testes la valeur de C et si elle est égale à "estérification" tu l'additionnes à EstValeur ???? M'est avis qu'il y a un p'tit problème
    Mais comme je ne connais pas réellement le but de la macro...

    Les identations sont là pour aider à s'y retrouver, dans les boucles, les tests, pas pour faire beau!!! Te manque des End If dans ton code initial.

    Des questions comme ça :
    - pourquoi tester 100 noms, puisqu'on teste le dernier ? Autant s'arrêter au dernier inscrit.
    - Il y a moins de 100 lignes en K (ou moins que de noms) ? Sinon, il serait plus rapide d'inverser les deux boucles.

    Construire un algo au fur et à mesure est loin d'être la solution la meilleure et/ou la plus rapide. Même si ça semble neuneu de l'écrire, il vaut mieux passer pour un clown en l'écrivant et savoir ce qu'on va coder que perdre du temps à dépanner et tout refaire. Mais c'est l'avis d'un clown.

    A+

  3. #3
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    195
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2008
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    Bonjour,

    Désolé pour le temps de réponse j'ai été un peu occupé.

    Tout d'abord merci pour ta réponse.
    Oui pour les identations je commence à m'en servir car j'avais plusieurs autres programmes qui clochaient à cause du manque de balise de fin ou autre...

    Oui j'imagine que contruire l'algo au fur et à mesure n'est pas la solution la plus efficace et qu'il vaut mieux avoir une vision d'ensemble avant de commencer.

    Mais cette vision d'ensemble ne vient elle pas avec l'expérience, la pratique?

    J'en suis encore au stade ou je réfléchis aux balises, codes.. que je vais utiliser pour telle ou telle action.. et me rendre compte en cours de programme qui finalement je n'aurai pas du utiliser telle ou telle chose.

    Je me laisse du temps et un long fleuve de programmes pour me permettre d'avoir assez d'expérience pour anticiper à l'avance ce dont j'aurais besoin.

    Bref! lol en tout cas encore grand merci pour ta réponse

  4. #4
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Citation Envoyé par BOU59000 Voir le message
    Mais cette vision d'ensemble ne vient elle pas avec l'expérience, la pratique?

    Je dirais que non elle doit venir de la réflexion, la pratique rendra juste la chose plus facile.
    Tu doit commencer par réfléchir a ce que tu veux faire, les cas particulier que tu vas rencontrer, etc.
    Ensuite tu prend un papier et tu écrit les différentes étape les teste que tu va réaliser, etc (en francais ou pseudo francais, on appelle souvent ca le pseudo code)
    Une fois que tu as ton algorithme la seulement tu codes. Du coup tu découple complètement les problèmes, d'un coté tu pense au principe de fonctionnement pas de problème de langage de balise de fonction utilisé c'est juste de la réflexion logique (de l'algorithmique)
    Et ensuite seulement tu as besoin de réfléchir au problème du langage comme écrir tel boucle tel instruction,...

    La moitié des problème sur ce forum vienne du fait que la personne n'a pas pris le temps de réfléchir correctement a son programme et a décidé de codé tout de suite du coup il cumule des problème de codage et des problème dans la méthode de fonctionnement.

    L'expérience permet de sauter la première étape et de directement écrire en VBA puisque tu fini par l'utiliser aussi bien que le francais

    Bon c'était ma petite morale de fin de semaine désolé pour le hors sujet


    J'éspère quand même que ca te sera profitable a toi ou quelqu'un d'autre

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut à tous
    Farpaitement d'accord avec Krovax
    Il ne sert à rien de coder si tu ne sais pas ce que tu veux faire.
    Même en faisant un algorythme aussi complet que possible, il arrive qu'on oublie des détails et que la macro ne fasse pas ce que l'on veut..
    Construire ton algorythme sur le code que tu tapes t'expose à tout refaire parce que ça ne peut pas fonctionner.
    Un algo n'est pas quelque chose de compliqué : c'est comment atteindre ton but en utilisant les données à ta disposition.
    Ça te permet de coder, mais aussi de tester : tu ne testes jamais sur l'ensemble des données. Mais comment trouver les quelques valeurs importantes à tester si tu ne sais pas ce que tu veux faire ?
    A+

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

Discussions similaires

  1. copier des données selon un filtre avec une macro
    Par lagaff93 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/08/2013, 12h47
  2. [XL-2007] Copier des valeurs selon conditions
    Par interloll dans le forum Excel
    Réponses: 3
    Dernier message: 22/02/2013, 19h08
  3. Copier des données sous condition
    Par delphine1987 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/04/2011, 22h17
  4. copier des lignes selon condition
    Par malek1913 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/02/2008, 16h45
  5. copier des données avec conditions
    Par captaine93 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 13/12/2007, 16h47

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