RESOLU "couper" de lignes sur autre feuille selon critères

RESOLU "couper" de lignes sur autre feuille selon critères - VB/VBA/VBS - Programmation

Marsh Posté le 16-11-2005 à 12:41:43    

bonjour
 
je voudrais créer une Macro qui puisse effectuer les choses suivantes :
 
avec un filtre auto, où figurent les colonnes nb1 et nb2, sélectionner les critères : nb1>=1,5 et nb2>=10
sélectionner toutes les lignes correspondant à ces critères dans la base de données
les copier sur une autre feuille
supprimer les lignes sélectionnées sur la feuille initiale
 
puis
 
insérer une colonne intitulée "var" où je pourrais écrire une formule du genre =(B2-C2)/B2
et l'étendre pour toutes les lignes non vides dans ma base de données
 
est-ce possible ?
 
merci pour votre aide, je suis vraiment débutante dans les macros. tout ce que j'ai réussi à faire c'est insérier une ligne d'entête, mettre en page et définir les formats de cellule !
 
 :pt1cable:  
 
"le savoir est la seule matière qui s'accroit quand on la partage" (Socrate)


Message édité par peanutz le 18-11-2005 à 16:49:07
Reply

Marsh Posté le 16-11-2005 à 12:41:43   

Reply

Marsh Posté le 16-11-2005 à 17:32:47    

Salut peanutz,
 
Pour que l'on puisse t'aider il va falloir que tu sois un peu plus pécise...
Tu utilises quelle version d'excel ?
Ensuite dans le titre du sujet il vaudrait mieux que tu pose la question, car tous les posts sont pour un besoin d'aide.
Si tu nous donnais le code que tu as dejà écrit, ce serait mieux.  
Ensuite essaye de préciser un peu ton problème :
les feuilles sur les quelles tu veux écrire existent deja ? faut se placer à la fin pour copier ? tout effacer ? ta colone à insérer elle doit se placer ou ?
 
un truc pour bien poster est de lire les régles du forum programation ici
 
bon courage


Message édité par watashi le 16-11-2005 à 17:34:13

---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
Reply

Marsh Posté le 17-11-2005 à 08:47:01    

Merci pour ta réponse Watashi
Voilà ce que j'ai fait :
 
Sub    
    Rows("1:1" ).Select
    Selection.AutoFilter Field:=15, Criteria1:="<1,5", Operator:=xlAnd
    Selection.AutoFilter Field:=18, Criteria1:="<10", Operator:=xlAnd
    Cells.Select
    Selection.Copy
    Sheets.Add
    ActiveSheet.Paste
    Sheets("Feuil1" ).Select
    Sheets("Feuil1" ).Name = "ca<1,5eteff.<10"
    Columns("B:B" ).Select
    Application.CutCopyMode = False
    Selection.NumberFormat = "00000000000000"
    Range("A1" ).Select
    Sheets("export" ).Select
    Selection.ClearContents
    Sheets("ca<1,5eteff.<10" ).Select
    Rows("1:1" ).Select
    Selection.Copy
    Sheets("export" ).Select
    Rows("1:1" ).Select
    Range("H1" ).Activate
    ActiveSheet.Paste
    ActiveWindow.ScrollColumn = 1
    Range("A2" ).Select
    Sheets("ca<1,5eteff.<10" ).Select
    Range("A2" ).Select
    Sheets("export" ).Select
End Sub
 
Evidemment ça ne fonctionne pas...
C'est sous Excel 2000.
 
Et je ne sais pas comment intituler mon post !
 
Merci pour ton lien pour les règles du forum aussi.
 
Bon, je vais essayer de trouver mieux pour ce script... peut être en utilisant le filtre élaboré ???

Reply

Marsh Posté le 17-11-2005 à 09:50:14    

bonjour peanutz, :)
Maintenant je comprends mieux ce que tu veux faire et donc t'aider.  
Ton message pourrait s'intituler copie de ligne sur une autre feuille et suppression par exemple. ;)
 
Pour ta macro tu avais déjà bien avancé, voilà celle que je te propose :

Code :
  1. Sub CaEff()
  2. 'Tes variable pour les valeur de CA et Effectif
  3. Dim Ca, Eff, NomFeuil
  4. Ca = 1.5
  5. Eff = 10
  6. NomFeuil = "ca<" & Ca & "eteff.<" & Eff
  7. 'Mise en place de la nouvelle feuille
  8.      Sheets.Add after:=Sheets(Worksheets.Count)
  9.      ActiveSheet.Name = NomFeuil
  10. 'mise en place de la ligne d'intitulé de colone
  11.      Sheets("export" ).Activate
  12.      Rows(1).Select
  13.      Selection.Copy
  14.      Sheets(NomFeuil).Select
  15.      Range("A1" ).Select
  16.      ActiveSheet.Paste
  17.      Application.CutCopyMode = False
  18. 'Ta variable de ligne pour le test de valeur
  19. Dim l
  20. l = 2 'car ta première ligne ce sont tes intitulés
  21. 'ta variable de linge pour la recopie
  22. Dim lig
  23. lig = 2
  24. 'on met en place une boucle pour passer tes valeur
  25. 'colone 15 CA et colone 18 Eff en revue
  26. Do While Sheets("export" ).Cells(l, 1) <> "" 'fait tant que n'est pas vide
  27.      'Si le CA est < à 1.5 et si eff <10
  28.      If Sheets("export" ).Cells(l, 15) < Ca And _
  29.           Sheets("export" ).Cells(l, 18) < Eff Then
  30.      'tu copie la ligne dans la nouvelle feuille
  31.           Sheets("export" ).Activate
  32.           Rows(l).Select
  33.           Selection.Copy
  34.           Sheets(NomFeuil).Activate
  35.           Cells(lig, 1).Select
  36.           ActiveSheet.Paste
  37.           Application.CutCopyMode = False
  38.      'tu ajoute 1 à ligne pour la prochaine copie
  39.           lig = lig + 1
  40.      'tu supprime la ligne
  41.           Sheets("export" ).Rows(l).Delete
  42.      Else
  43.           'tu passes à la ligne suivante
  44.           l = l + 1
  45.      End If
  46. Loop
  47. End Sub


Une chose que je n'ai pas repris c'est ton numberformat sur la colone B. Tu pourras l'ajouter en fin de macro au besoin.
 
bon courage
 


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
Reply

Marsh Posté le 17-11-2005 à 12:21:08    

ouah impressionnant !  
 
(j'étais loin du compte)
 
génial mais j'ai oublié de préciser un truc ! les cellules vides de la colonne CA 2004 ne doivent pas être considérées comme < 1,5 !
 
j'imagine qu'il faut changer qqch par là  
Do While Sheets("export" ).Cells(l, 1) <> "" 'fait tant que n'est pas vide
     'Si le CA est < à 1.5 et si eff <10
 
genre ajouter une formule ou ???  
 
oh dieu du vba, as tu une idée ???

Message cité 1 fois
Message édité par peanutz le 17-11-2005 à 12:27:16
Reply

Marsh Posté le 17-11-2005 à 14:01:02    

peanutz a écrit :

(j'étais loin du compte)

non pas tant que ça tu as essayé et tu es tombée sur les bonnes fonctions...

Code :
  1. Do While Sheets("export" ).Cells(l, 1) <> "" 'fait tant que n'est pas vide

Ca c'est pour faire toutes les lignes de ton tableau. Tant que la cellule colone A n'est pas vide ça recommnce.
Pour ce qui est de ne pas prendre en compte les CA=0 ou CA="", il faut ça :

Code :
  1. 'Si le CA est < à 1.5 et CA<>"" et CA<>0 et si eff <10
  2.      If Sheets("export" ).Cells(l, 15) < Ca And _
  3.           Sheets("export" ).Cells(l, 15)<>"" And _
  4.           Sheets("export" ).Cells(l, 15)<>0 And _
  5.           Sheets("export" ).Cells(l, 18) < Eff Then


peanutz a écrit :

oh dieu du vba, as tu une idée ???


Ta Déesse te salue:jap:  ;) lollllllllll  ;)  


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
Reply

Marsh Posté le 17-11-2005 à 15:46:44    

ok merci pour tout !  
 
de cette expérience magique, je décidai de me mettre sérieusement à la tâche en reprenant ton exemple, car j'ai une quantité phénoménale de tris à faire selon une quantité phénoménale d'autres critères.  
 
donc, pour moi ça donne :
 
Sub Groupe()
'Tes variable pour les valeur de CA et Effectif
Dim Caconso, infogpe, Siegesocial, NomFeuil
Caconso = oui
infogpe = oui
Siegesocial = oui
NomFeuil = "caconso=" & Caconso & "infogpe=" & infogpe & "siegesocial=" & Siegesocial
'Mise en place de la nouvelle feuille
     Sheets.Add after:=Sheets(Worksheets.Count)
     ActiveSheet.Name = NomFeuil
'mise en place de la ligne d'intitulé de colone
     Sheets("export" ).Activate
     Rows(1).Select
     Selection.Copy
     Sheets(NomFeuil).Select
     Range("A1" ).Select
     ActiveSheet.Paste
     Application.CutCopyMode = False
'Ta variable de ligne pour le test de valeur
Dim l
l = 2 'car ta première ligne ce sont tes intitulés
'ta variable de linge pour la recopie
Dim lig
lig = 2
'on met en place une boucle pour passer tes valeur
'colone 15 CA et colone 21 Eff en revue
Do While Sheets("export" ).Cells(l, 1) <> "" 'fait tant que n'est pas vide
    'Si le CAconso est = à oui et si infogpe =oui et si siegesocial=oui
     If Sheets("export" ).Cells(l, 25) = Caconso And _
          Sheets("export" ).Cells(l, 26) = infogpe And _
          Sheets("export" ).Cells(l, 27) = Siegesocial Then
     'tu copie la ligne dans la nouvelle feuille
          Sheets("export" ).Activate
          Rows(l).Select
          Selection.Copy
          Sheets(NomFeuil).Activate
          Cells(lig, 1).Select
          ActiveSheet.Paste
          Application.CutCopyMode = False
     'tu ajoute 1 à ligne pour la prochaine copie
          lig = lig + 1
     'tu supprime la ligne
          Sheets("export" ).Rows(l).Delete
     Else
          'tu passes à la ligne suivante
          l = l + 1
     End If
Loop
End Sub
 
ce code ne fonctionnne que si les cellules contiennent des nombres, ou bien c moi qui comprend vraiment rien ?
 
pardonne une pauvre pécheresse, déesse ! ;)
 

Reply

Marsh Posté le 17-11-2005 à 15:51:16    

Je ne suis pas une déesse (désolé...), mais si G tout bien compris ça marche avec toutes sortes de contenus... C juste à base de copier/coller (je sais pas si couper/coller serais pas plus rapide, au lieu de copier/coller/effacer...je dis ça je me suis pas penché sur la question...)

Reply

Marsh Posté le 17-11-2005 à 15:56:51    

toutes sortes de contenus ?  
alors je ne sais pas pourquoi ça va pas.
format de cellule ?

Reply

Marsh Posté le 17-11-2005 à 16:15:56    

ziold a écrit :

C juste à base de copier/coller (je sais pas si couper/coller serais pas plus rapide, au lieu de copier/coller/effacer...je dis ça je me suis pas penché sur la question...)

C 'est une idée aussi mais couper coller ne supprime pas la ligne il faudrait de nouveau la supprimer la ligne vide ou retrier les données pour enlever les lignes blanches du tableau :) Pour la rapidité je sais pas ...

peanutz a écrit :

toutes sortes de contenus ?  
alors je ne sais pas pourquoi ça va pas.
format de cellule ?

oui quelque soit ton contenu numérique ou lettré ça marche. Mais

peanutz a écrit :

Caconso = oui
infogpe = oui
Siegesocial = oui

pour définir des variables lettrées il faut des guillemets :)

Code :
  1. Caconso = "oui"
  2. infogpe = "oui"
  3. Siegesocial = "oui"


bon courage


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
Reply

Marsh Posté le 17-11-2005 à 16:15:56   

Reply

Marsh Posté le 17-11-2005 à 16:19:25    

et ben oui j'y avais pensé.
le pb c qu'il me dit : erreur d'éxecution1004, le nom de la feuille que vs avez tapé n'est pas valide.
 
au moment de créer la feuille il aime pas les ""
comment la renommer ?

Reply

Marsh Posté le 17-11-2005 à 16:24:42    

trouvé !  
 
NomFeuil = "groupe1"

Reply

Marsh Posté le 17-11-2005 à 16:39:00    

et oui le nombre de lettres pour le nom des onglets est limité à 31 il me semble :)
 
;)


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
Reply

Marsh Posté le 17-11-2005 à 16:49:05    

AAAHHH !!!! merci du tuyau
 
et MERCI pour TOUT d'ailleurs...

Reply

Marsh Posté le 17-11-2005 à 17:15:47    

de rien :)
marque juste résolu dans le titre de ton post ça pourras en aider d'autres.


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
Reply

Marsh Posté le 18-11-2005 à 09:15:27    

watashi a écrit :

C 'est une idée aussi mais couper coller ne supprime pas la ligne il faudrait de nouveau la supprimer la ligne vide ou retrier les données pour enlever les lignes blanches du tableau :) Pour la rapidité je sais pas ...
bon courage


 
Oui bien vu... donc pas mieux

Reply

Marsh Posté le 18-11-2005 à 14:12:22    

bien bien j'ai pu faire pas mal de tris et je vais gagner un temps fou avec cette macro.
 
et je vais bientôt pouvoir écrire "résolu" ds le titre...
 
car je ne sais pas si ça rentre dans ce sujet mais je voudrais savoir encore si...
au lieu de coller mes lignes sélectionnées selon mes critères sur une nouvelle feuille,..
je pouvais les coller suite à une série de données déjà présentes sur une autre feuille....  
pour ce faire il me faudrait quelque chose qui lui dise... tant que ce n'est pas vide, ne colle pas, mais dès que c vide, vas-y !
 
j'abuse ? mais non mais non....

Reply

Marsh Posté le 18-11-2005 à 14:20:15    

peanutz a écrit :

bien bien j'ai pu faire pas mal de tris et je vais gagner un temps fou avec cette macro.
 
et je vais bientôt pouvoir écrire "résolu" ds le titre...
 
car je ne sais pas si ça rentre dans ce sujet mais je voudrais savoir encore si...
au lieu de coller mes lignes sélectionnées selon mes critères sur une nouvelle feuille,..
je pouvais les coller suite à une série de données déjà présentes sur une autre feuille....  
pour ce faire il me faudrait quelque chose qui lui dise... tant que ce n'est pas vide, ne colle pas, mais dès que c vide, vas-y !
 
j'abuse ? mais non mais non....


Pas de problème et ça entre dans le cadre ;)

Code :
  1. 'ta variable de linge pour la recopie
  2. Dim lig
  3. lig = 2

Le lig =2 est à remplacer par le numéro de première ligne vide soit :

Code :
  1. sheets(X).cells(1,1).end(xldown).row + 1


attention à ne pas garder la création de feuille :)
bon courage


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
Reply

Marsh Posté le 18-11-2005 à 15:10:17    

j'arrive pas ! voilà ce que j'ai fait
 
Sub Groupe2()
'Tes variable pour les valeur de CA Infogpe et Siège social
Dim Caconso, infogpe, Siegesocial
Caconso = "oui"
infogpe = "non"
Siegesocial = "non"
'Position sur la feuille groupe1
     Sheets("Groupe1" ).Select
'mise en place de la ligne d'intitulé de colone
     Sheets("CAs_OK" ).Activate
     Rows(1).Select
     Selection.Copy
     Sheets("Groupe1" ).Select
     Range("A1" ).Select
     ActiveSheet.Paste
     Application.CutCopyMode = False
'Ta variable de ligne pour le test de valeur
Dim l
l = 2 'car ta première ligne ce sont tes intitulés
'ta variable de linge pour la recopie
Dim lig
lig = Sheets(X).Cells(1, 1).End(xlDown).Row + 1
'on met en place une boucle pour passer tes valeur
Do While Sheets("CAs_OK" ).Cells(l, 1) <> "" 'fait tant que n'est pas vide
    'Si le CAconso est = oui et si infogpe = oui et si siegesocial = oui
     If Sheets("CAs_OK" ).Cells(l, 25) = Caconso And _
          Sheets("CAs_OK" ).Cells(l, 26) = infogpe And _
          Sheets("CAs_OK" ).Cells(l, 27) = Siegesocial Then
     'tu copie la ligne dans la nouvelle feuille
          Sheets("CAs_OK" ).Activate
          Rows(l).Select
          Selection.Copy
          Sheets("Groupe1" ).Activate
          Cells(lig, 1).Select
          ActiveSheet.Paste
          Application.CutCopyMode = False
     'tu ajoute 1 à ligne pour la prochaine copie
          lig = lig + 1
     'tu supprime la ligne
          Sheets("CAs_OK" ).Rows(l).Delete
     Else
          'tu passes à la ligne suivante
          l = l + 1
     End If
Loop
End Sub
 
il me dit que l'indice n'appartient pas à la sélection !


Message édité par peanutz le 18-11-2005 à 15:13:38
Reply

Marsh Posté le 18-11-2005 à 15:18:44    

ah laisse tomber j'ai trouvé ! ma feuille ne s'appelle pas X ! (lol)

Reply

Marsh Posté le 18-11-2005 à 15:25:55    

J'avais même pas eu le temps d'ouvrir internet explorer que tu avais trouvé ;) lol


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
Reply

Marsh Posté le 18-11-2005 à 15:30:36    

pour que tout soit parfait, il faudrait que tout s'enchaîne.
à la fin de la macro, comment lui dire d'en commencer une autre ?
watashi tu te débrouilles tellement bien ... c tellement génial quand ça marche... j'ai envie de tout automatiser !
c contagieux la prog !

Reply

Marsh Posté le 18-11-2005 à 15:30:56    

Reply

Marsh Posté le 18-11-2005 à 15:40:29    

merci beberf pour le lien, il est sympa et donne de quoi bosser !

Reply

Marsh Posté le 18-11-2005 à 15:42:59    

Je connaissais pas ce site :) Je la fafouillerai la semaine prochaine.
 

peanutz a écrit :

pour que tout soit parfait, il faudrait que tout s'enchaîne.
à la fin de la macro, comment lui dire d'en commencer une autre ?
watashi tu te débrouilles tellement bien ... c tellement génial quand ça marche... j'ai envie de tout automatiser !
c contagieux la prog !

Oui c'est clair que pas mal de boulot peut être fait en automatisant. Je me debrouilles, mais j'en passe du temps à chercher, à torturer l'aide dans tous les sens...  
Sur mon fichier qui me permet de traiter les données j'ai fait un bouton traitement qui me lance 8 macros les unes après les autres ;)

Code :
  1. Call LeNomDeTaMacro


Bon courage


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
Reply

Marsh Posté le 18-11-2005 à 16:48:31    

ok merci pour tout ! je vais essayer de compiler tout ça
 
 ;)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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