boucle selection condition excel

boucle selection condition excel - VB/VBA/VBS - Programmation

Marsh Posté le 09-08-2005 à 15:04:34    

Salut,
 
Je debarque en vba et macro excel, donc j'expose mon probleme en français :
 
En feuille 1 j'ai un tableau avec 3 colonnes, la premiere s'apelle "station" et comporte des numeros de station.
 
J'ai une macro (3 sub) qui marche tres bien et effectue les operations suivantes :
 
Pour station=1 ou 2 ou 3 ou ...
selectionne la ou les lignes du tableau,
copie les lignes sur la feuille,
"A ce moment mon unique graphique de la feuille 2 se met à jour"
selectionne le graphique,
exporte le graphique en .gif dans un dossier,
 
Genial, mais à chaque fois je suis obligé de taper le numero de la station dans ma macro.
j'aimerais donc que ma macro face cette manip en boucle pour toute les valeurs de station, je galere depuis une semaine sur ce truc.
 
Si vous avez des trucs et astuces des bouts de codes, j'accepte tout.
D'avance merci et bonne journée,
 
Fred
Je peut envoyer le code de la macro si besoin !

Reply

Marsh Posté le 09-08-2005 à 15:04:34   

Reply

Marsh Posté le 09-08-2005 à 15:07:13    

vatounet a écrit :

Salut,
 
Je debarque en vba et macro excel, donc j'expose mon probleme en français :
 
En feuille 1 j'ai un tableau avec 3 colonnes, la premiere s'apelle "station" et comporte des numeros de station.
 
J'ai une macro (3 sub) qui marche tres bien et effectue les operations suivantes :
 
Pour station=1 ou 2 ou 3 ou ...
selectionne la ou les lignes du tableau,
copie les lignes sur la feuille,
"A ce moment mon unique graphique de la feuille 2 se met à jour"
selectionne le graphique,
exporte le graphique en .gif dans un dossier,
 
Genial, mais à chaque fois je suis obligé de taper le numero de la station dans ma macro.
j'aimerais donc que ma macro face cette manip en boucle pour toute les valeurs de station, je galere depuis une semaine sur ce truc.
 
Si vous avez des trucs et astuces des bouts de codes, j'accepte tout.
D'avance merci et bonne journée,
 
Fred
Je peut envoyer le code de la macro si besoin !


 
Bonjour, pourquoi ne fais-tu pas simplement une boucle for?

Reply

Marsh Posté le 09-08-2005 à 15:15:07    

Salut jpcheck,
 
oui je suis en train d'écrire un truc comme ça, mais j'ai l'impression d'écrire n'importe quoi dans une langue que je ne connais pas,
 
sub selection()
dim station as long
 
for each station in range ("a2":"a? la fin de mon tableau" )
  if station <>null then
  les lignes du tableau correspondant à valeur station.select
  end if
next station
 
end sub
 
je crois que c'est tres mauvais
 
Fred

Reply

Marsh Posté le 09-08-2005 à 16:19:37    

ton nombre de stations va-t-il bouger au cours du temps? si oui, en espérant que tu n'as pas de lignes sous tes stations, selectionne la premiere, donne lui le nom stations, vas dans insérer/ nom /définir et tape pour stations la fonction suivante

Code :
  1. =DECALER("$A$1";;;NBVAL("$A:$A)-1);


 
cette fonction te permet d'ajouter automatiquement la derniere station dans ta liste de stations, et tu fais

Code :
  1. for each in stations
  2. manip avec ton .gif
  3. next


 
j'ai été clair? :whistle:

Reply

Marsh Posté le 09-08-2005 à 16:48:00    

Oui, tres clair pour la manip decaler nbval :ok c'est effectué
 
mais pour le code par contre je ne vois pas ou je vais,
quand j'écrit :
 
for each station
il m'envoi le message d'erreur disant que station doit etre un variant ou un object
 
quand j'écrit :
 
for each in station
le message d'erreur envoi "variable attendu"
 
Enfin, je ne trouve pas la bonne formule pour selectionner uniquement les lignes qui correspondent à station=x
 
j'ai recuperer un bout de code qui peut me servir, mais comment l'adapter à mon cas ?
 
Le moncritere doit correspondre dans mon cas à mes station ?
 
Sub Selection()
i = 1
While i < 200
If Cells(i, 1) = moncritere Then
MesLignes = MesLignes & i & ":" & i & ","
End If
i = i + 1
Wend
 
MesLignes = Left(MesLignes, Len(MesLignes) - 1)
 
With ActiveSheet
            Application.Intersect(.Range(MesLignes), .UsedRange).Select
      End With
 
End Sub
 
En tous cas merci d'avoir repondu
je continu ma macro "usine à graphique"
 
Fred
 

Reply

Marsh Posté le 10-08-2005 à 10:59:10    

help
 
j'y arrive pas

Reply

Marsh Posté le 10-08-2005 à 11:05:40    

tu peux utiliser un compteur à incrémenter pour ton nombre de station sinon.
Pour ta méthode de graph, tu peut essayer de faire une fonction qui recoit le numero de la ligne et fait le traitement en fonction de ca
avec ton compteur en case q1
ton code ressemblerait à ca :

Code :
  1. dim i as integer
  2. for i=1 to range("q1" ).value
  3. if range("a"&i).value = MonCritere then
  4. manip(i)
  5. end if
  6. next i

Reply

Marsh Posté le 10-08-2005 à 11:31:41    

Salut jpcheck,
 
c'est sympa de repondre, tres sincerement merci
 
mais c'est du chinois, (experience vba=1 semaine) je bidouille des codes pour cette boucle dans tous les sens et forcement sa galere dur.
 
je comprend pas ta solution, et j'ai certainement mal expliqué mon probleme, voici un ex de tableau :
 
station date mesure
250311  1999 0,2
250311  2000 0,5
250311  2001 0,9
321000  1998 0,2
321000  1999 0,8
286412  1999 0,1
286412  2000 0,7
286412  2001 0,5
etc...
 
et ce que j'essai de faire
pour chaque station :
selectionne les lignes du tableau correspondantes
copie les lignes sur feuil2
"la mon graph se met à jour"
selectionne le graph
exporte le dans mon dossier
nettoie les cellules de la feuil2
et recommence depuis le debut avec la valeur de station suivante
 
bonne journée
Fred

Reply

Marsh Posté le 10-08-2005 à 11:49:04    

vatounet a écrit :

Salut jpcheck,
 
station date mesure
250311  1999 0,2
250311  2000 0,5
250311  2001 0,9
321000  1998 0,2
321000  1999 0,8
286412  1999 0,1
286412  2000 0,7
286412  2001 0,5
etc...
 
selectionne les lignes du tableau correspondantes
copie les lignes sur feuil2
"la mon graph se met à jour"
selectionne le graph
exporte le dans mon dossier
nettoie les cellules de la feuil2
et recommence depuis le debut avec la valeur de station suivante


tu cherches à traiter toutes tes stations ou seulement une que tu choisis dans une liste?
si tu cherches à toutes les traiter, la solution pourrait etre la suivante, avec  toujours q1 en compteur:

Code :
  1. dim i as integer 'ton compteur
  2. for i=1 to range("q1" ).value 'de 1 à fin de la liste
  3. 'tu récupères les valeur de ta lignes, tu les copies dans la feuille 2, ici en cases A1 à A3
  4. range("feuille2!a1" ).value = range("feuille1!a" & i).value 'la fonction ""& i concatène la valeur du compteur la feuille1!a
  5. range("feuille2!a2" ).value = range("feuille1!b" & i).value
  6. range("feuille2!a3" ).value = range("feuille1!c" & i).value
  7. 'comme je ne connais pas ta fonction de graphik, je l'appelle graphe()
  8. graphe()
  9. next i'incrémentation de ta boucle


la meilleure facon d'apprendre, c'est par soi meme, et eventuellement avec les autres ;-) J'ai un mois et demi de prog en vba derriere moi...


Message édité par jpcheck le 10-08-2005 à 11:50:14
Reply

Marsh Posté le 10-08-2005 à 14:36:06    

Salut vatounet,
 
J'ai dû traiter ce genre de "probleme" une fois j'ai un modifié et commenté mon code pour qu'il corresponde mieux à ton problème.

Code :
  1. Option Explicit
  2. Public station
  3. Sub Liste()
  4. 'tes valeurs sont en feuille n°1
  5. Dim Val As Worksheet
  6. Set Val = Worksheets(1)
  7. 'initialiser ta liste de stations
  8.      Val.Activate
  9.      Range("F:F" ).Select
  10.      Selection.ClearContents
  11.      Range("F1" ).Select
  12.      ActiveCell.FormulaR1C1 = "Liste des stations"
  13.      Range("F2" ).Select
  14. 'définir le nombrede ligne de ta table de valeur
  15. Dim l
  16. l = 0
  17.      Range("A1" ).Select
  18.      Selection.End(xlDown).Select
  19.      l = ActiveCell.Row
  20. 'remplir ta liste sans doublon
  21. Dim r, a, b
  22. 'pour les celules pleines de la colone A
  23. station = ""
  24. a = 2
  25. r = 2
  26.      For r = 2 To l
  27.           station = Cells(r, 1).Value
  28.           b = 2
  29.           For b = 2 To a
  30.                If Cells(b, 6).Value = station Then GoTo 1
  31.           Next b
  32.           Cells(a, 6).Select
  33.           ActiveCell.Formula = station
  34.           a = a + 1
  35. 1    Next r
  36. 'la ta liste des station est prête
  37. 'pour chaque valeur de ta liste tu vas lancer la macro de graphique que tu as déjà
  38. 'je nomme cette macro graph()
  39. 'le nombre de lignes de ta liste de stations
  40.      a = a - 1
  41.      b = 2
  42.      For b = 2 To a
  43.           Val.Activate
  44.           station = Cells(b, 6).Value
  45. 'XXX.xls est le nom de ton classeur excel
  46.           Application.Run "XXX.xls!graph"
  47.      Next b
  48. End Sub


 
Le fait de passer par une liste permet d'éviter de traiter 2 fois ta station. La liste reste affichée en fin déxecution comme ça tu peux voir les graphiques que tu as créé.
la variable station est déclarée en public pour que tu puisses l'utiliser dans ta macro qui traite vraiement tes données.
 
Bon courage

Reply

Marsh Posté le 10-08-2005 à 14:36:06   

Reply

Marsh Posté le 10-08-2005 à 18:05:54    

Salut WATASHI,
je viens de lire ton message, merci beaucoup pour cette reponse,
J'étudie ta prose ce soir ou demain (j'ai du boulot)
 
Bonne soirée
 
A+
 
Fred

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed