Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 03/07/2009, 10h36   #1
Nouveau membre du Club
 
Date d'inscription: mai 2008
Âge: 24
Messages: 68
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 :
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.... )
BOU59000 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 04/07/2009, 23h20   #2
Expert Confirmé
 
Date d'inscription: juillet 2007
Localisation: Loire Atlantique (44)
Âge: 54
Messages: 1 861
Par défaut

Salut BOU59000 et le forum
Citation:
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 :
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+
__________________
La qualité et la précision de la réponse sont proportionnelles à celles de la question.
Gorfael est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/07/2009, 10h20   #3
Nouveau membre du Club
 
Date d'inscription: mai 2008
Âge: 24
Messages: 68
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
BOU59000 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/07/2009, 10h28   #4
Expert Confirmé
 
Avatar de Krovax
 
Date d'inscription: juillet 2008
Localisation: Elsass
Âge: 24
Messages: 1 887
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
__________________
« Il n'y a pas de recette miracle qui permet aux gens d’écrire des programmes corrects sans avoir à réfléchir. Il faut apprendre aux gens comment réfléchir »
Krovax est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/07/2009, 17h15   #5
Expert Confirmé
 
Date d'inscription: juillet 2007
Localisation: Loire Atlantique (44)
Âge: 54
Messages: 1 861
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+
__________________
La qualité et la précision de la réponse sont proportionnelles à celles de la question.
Gorfael est déconnecté   Envoyer un message privé Réponse avec citation
NEWS EXCELF.A.Q EXCELTUTORIELS EXCELSOURCES EXCELOUTILS EXCELLIVRES EXCELOFFICE 2010

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 23h21.


Vos questions techniques : forum d'entraide Excel - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.