Copier des cellules sous conditions

Copier des cellules sous conditions - VB/VBA/VBS - Programmation

Marsh Posté le 21-11-2009 à 19:09:52    

Bonjour,
 
je suis à la recherche d'une solution pour pouvoir recopier certaines cellules (qui se suivent) d'une ligne si je n'ai pas de "X", dans une colonne.
 
Voici une copie de mon tableau: http://img80.imageshack.us/img80/4416/essaiexcel1.jpg
 
Donc si je mets "X" dans une ligne de la colonne C je voudrais que cette ligne ce recopie en dessous. Quand mon travail est fait je mettrais "1" dans la colonne C.
 
Je ne sais pas du tout comment procéder ?!
 
Merci d'avance

Reply

Marsh Posté le 21-11-2009 à 19:09:52   

Reply

Marsh Posté le 22-11-2009 à 13:38:19    

Bonjour,
 
je reformule mon souhait:
 
Si j'ai "1" dans la colonne "C", je voudrais une recopie des cellules des colonnes "A et B" de cette même ligne sur la première ligne libre de cette même feuille.
 
Me reste plus qu'à trouver les bons termes  :pt1cable:  
 
 :hello:

Reply

Marsh Posté le 23-11-2009 à 11:40:16    

Bonjour
 
Meme si je ne comprends pas l'interet de dupliquer la ligne, un truc comme ca devrait rouler :
 
A mettre dans le module de ta feuille (Dans ton exemple, c'est Feuil1) :

Code :
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. 'Si on modifie une cellule autre que dans la colonne C ca ne fait rien
  3.     If Target.Column <> 3 Then Exit Sub
  4. 'Si on saisi autre chose que 1 en colonne C ca ne fait rien (comme suppr par ex)
  5.     If Target.Value <> 1 Then Exit Sub
  6. 'Recuperation de la ligne ou on saisi 1
  7.     RowSel = Target.Row
  8. 'On copie A et B
  9.     Range(Cells(RowSel, 1), Cells(RowSel, 2)).Copy
  10. 'Récuperation de la derniere ligne, ou 1ere ligne vide
  11.     Range("A65536" ).Select
  12.     Selection.End(xlUp).Select
  13.     RowFin = Selection.Row + 1
  14. 'On colle sur la premiere ligne vide
  15.     Cells(RowFin, 1).Select
  16.     ActiveSheet.Paste
  17. End Sub


 
Cordialement


Message édité par SuppotDeSaTante le 23-11-2009 à 11:40:49

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 23-11-2009 à 14:43:22    

Bonjour
 
Effectivement, mais ceci n'est valable donc que pour une feuille, et à condition d'avoir inscrit la macro avant de remplir le tableau, donc ne peut pas être lancé pour faire une vérif d'un tableau. Je me suis permis de faire une autre macro à mettre dans le classeur perso, qu'on peut lancer n'importe quand, sur n'importe quel tableau (semblable, évidemment), en considérant que comme dans ton tableau la ligne 2 est vide, et par souci de clarté, j'ai mis une ligne entre le tableau 1 et le 2.
 
Sub COPIE_AB()
 
Range("a3" ).CurrentRegion.Select
Lignes = Range("a3" ).CurrentRegion.Rows.Count
Macol = Range("a3" ).CurrentRegion.Columns(3)
For Each celo In Macol
compte = compte + 1
If celo = 1 Then
Ligne_vide = Range("a" & (3 + Lignes + 1)).Row
MaLigne1 = Range("a3" ).Offset(compte - 1, 0).Row
Report = Report + 1
MaLigne2 = Range("a3" ).Offset(Lignes + Report, 0).Row
Range(Range("a" & MaLigne2), Range("b" & MaLigne2)).Value = Range(Range("a" & MaLigne1), Range("b" & MaLigne1)).Value
End If
Next
 
End Sub
 
(éventuellement, j'en ai fait une autre en faisant un filtre classique)
 
Bien le bonjour


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 23-11-2009 à 14:45:39    

J'ai oublié de préciser qu'il ne doit pas y avoir de ligne vide dans le tableau à vérifier!

Reply

Marsh Posté le 23-11-2009 à 14:53:04    

Laoo a écrit :

Bonjour
 
Effectivement, mais ceci n'est valable donc que pour une feuille,


Oui, réponse a sa question.
 

Laoo a écrit :

et à condition d'avoir inscrit la macro avant de remplir le tableau, donc ne peut pas être lancé pour faire une vérif d'un tableau.


Hum, ta macro dans le classeur perso, faut bien aussi l'inscrire avant... Pas compris le sens du truc la...
Après de savoir si c'est du post traitement, une fois que tous ces 1 sont mis, ou du fur et a mesure... C'etait pas tres claire, j'ai pris le 2nd postula.
 
Après aucun souci pour te permettre de donner d'autres pistes, bien au contraire :d
 
Je ne ferais qu'une remarque, donner la solution c'est bien, donner les explications a quelqu'un qui dit clairement ne rien n'y connaitre, c'est mieux ;) (Et mon dieu, la balise cpp est un bonheur... La c'est illisible)
 
Cordialement


Message édité par SuppotDeSaTante le 23-11-2009 à 14:54:24

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 23-11-2009 à 17:03:03    

Bonjour et merci à vous deux,
 
Le but de recopier la ligne c'est pour remplir un planning journalier, tant que le travail n'est pas fini (donc 1 dans la cellule ou X au choix), le travail apparait toujours.
Ainsi avec les filtres je peux retrouver sur certains travaux combien j'ai passé de temps...
Je n'ai qu'une feuille sur ce classeur. Mais je vais certainement avoir plusieurs colonnes à recopier dont des colonnes groupées ?! Est ce que cela peut fonctionner en adaptant bien sur.
En ce qui concerne la ligne vide, elle n'est pas indispensable, c'est que j'ai supprimé le contenu en essayant de faire quelque chose...
Merci encore à vous deux, je vais essayer ça...
 
Edit:
ça me recopie bien mes cellules, mais il faut que j'exécute la macro à chaque fois...Je pensais que le fait de mettre "1" dans la cellule aller me recopier la ligne...
De plus j'ai un saut d'une ligne, ce qui fait que ma ligne rajouter ce retrouve en dehors de mon tableau.
J'essaie de comprendre en même temps ce que vous avez écrit afin de pouvoir l'adapter à mon futur tableau :jap:  
 
Je suis chiant n'est ce pas  :lol:  
 
Cordialement,
Michel

Message cité 2 fois
Message édité par lamiche37 le 23-11-2009 à 17:13:51
Reply

Marsh Posté le 23-11-2009 à 17:07:28    

Citation :

 
Hum, ta macro dans le classeur perso, faut bien aussi l'inscrire avant... Pas compris le sens du truc la...
Après de savoir si c'est du post traitement, une fois que tous ces 1 sont mis, ou du fur et a mesure... C'etait pas tres claire, j'ai pris le 2nd postula.


 
Il est vrai que ce n'est pas très clair , c'est pourquoi j'ai pris, moi, le premier (postulaT...)
 

Citation :


 
Après aucun souci pour te permettre de donner d'autres pistes, bien au contraire :d


Merci mon prince :jap:  
 

Citation :


Je ne ferais qu'une remarque, donner la solution c'est bien, donner les explications a quelqu'un qui dit clairement ne rien n'y connaitre,  c'est mieux ;)  


c'est tellement vrai! ( Encore que je n'ai pas lu qu'il disait ne rien Y connaître. (pas :...ne...n'y... :ange: ), juste qu'il ne savait pas comment procéder :whistle: ),  mais parfois on n'a pas le temps de faire les deux...  
 

Citation :

(Et mon dieu,


Nan, je t'en prie, appelle-moi Laoo...
 
 

Citation :


 la balise cpp est un bonheur... La c'est illisible


 
Trop aimable!  Du moins, l'avantage c'est que c'est recopiable directement...  :p  
 
 :hello:  
 

Citation :

Cordialement


Pareillement
 


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 23-11-2009 à 17:14:59    

Désolé j'ai édité mon message entre temps...
 
Mais effectivement en macro je n'y connait rien...du tout


Message édité par lamiche37 le 23-11-2009 à 17:15:40
Reply

Marsh Posté le 23-11-2009 à 17:33:30    

lamiche37 a écrit :

ça me recopie bien mes cellules, mais il faut que j'exécute la macro à chaque fois...Je pensais que le fait de mettre "1" dans la cellule aller me recopier la ligne...

Pour cela, regarde du coté du code que j'ai proposé. Le Private Sub Worksheet_Change(ByVal Target As Range) permet justement de detecter quand on saisi qqchose dans une cellule.
 

Laoo a écrit :

Je me suis permis de faire une autre macro à mettre dans le classeur perso

Laoo a écrit :

Merci mon prince :jap:

Il n'y avait aucune remarque désobligeante. Je précisais juste que je n'allais pas être 'vexé' que tu y mettes ton grain de sel, bien au contraire.
 

Laoo a écrit :

c'est tellement vrai! ( Encore que je n'ai pas lu qu'il disait ne rien Y connaître. (pas :...ne...n'y... :ange: ), juste qu'il ne savait pas comment procéder :whistle: ),  mais parfois on n'a pas le temps de faire les deux...

lamiche37 a écrit :

Je ne sais pas du tout comment procéder ?!

Pour moi, s'il ne sait pas comment débuter sur un pb simple c'est qu'il n'y connait rien. Mais ca n'avait, encore une fois, rien de pejoratif.
 

Laoo a écrit :

Trop aimable!  Du moins, l'avantage c'est que c'est recopiable directement...  :p

Tout comme la balise cpp... Qui elle a l'avantage d'etre lisible et de ne pas etre 'hors charte'.
 
 
Mais apparamment tu es du genre à avoir la science infuse, te permettant de corriger les fautes d'orthographe de tes interlocuteurs.
 
Je te laisse le bon soin d'apporter tes impressionantes lumieres à lamiche37, malgré le fait que finalement il s'agit, apparemment, du second postulat
 
Cordialement.
 
Edit : Sujet clos pour ma part etant donné que mon 1er post repond a la demande.


Message édité par SuppotDeSaTante le 23-11-2009 à 17:39:20

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 23-11-2009 à 17:33:30   

Reply

Marsh Posté le 23-11-2009 à 17:51:45    

Merci dje69r,
 
mais je ne sais même pas comment me servir de ce que tu m'as écrit  :cry: tellement je n'y connait rien  
 
 :hello:

Reply

Marsh Posté le 23-11-2009 à 17:51:50    

lamiche37 a écrit :

Bonjour et merci à vous deux,
 
Edit:
ça me recopie bien mes cellules, mais il faut que j'exécute la macro à chaque fois...Je pensais que le fait de mettre "1" dans la cellule aller me recopier la ligne...
De plus j'ai un saut d'une ligne, ce qui fait que ma ligne rajouter ce retrouve en dehors de mon tableau.
J'essaie de comprendre en même temps ce que vous avez écrit afin de pouvoir l'adapter à mon futur tableau :jap:  
 
Je suis chiant n'est ce pas  :lol:  
 
Cordialement,
Michel


 
Apparemment, c'est donc bien la macro de notre ami  dje69r que tu dois utiliser, elle fonctionnera à chaque fois que tu mettras 1 dans ta colonne, mais attention à ne pas recopier la cellule C (contenant le 1), sinon la machine s'emballera!!!  
 
@+


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 23-11-2009 à 17:57:27    

Non j'avais essayé d'abord la tienne, et là je viens d'essayer celle de dje69r mais il m'affiche des erreurs...

Reply

Marsh Posté le 23-11-2009 à 18:13:28    

Citation :

Il n'y avait aucune remarque désobligeante. Je précisais juste que je n'allais pas être 'vexé' que tu y mettes ton grain de sel, bien au contraire.


 
Hmmmm? A voir ce que tu me balances depuis tout à l'heure, et la suite de ton post, on peut s'interroger!
 

Citation :


Mais apparamment tu es du genre à avoir la science infuse, te permettant de corriger les fautes d'orthographe de tes interlocuteurs.


 
Et vlan!
 

Citation :


Je te laisse le bon soin d'apporter tes impressionantes lumieres à lamiche37, malgré le fait que finalement il s'agit, apparemment, du second postulat


 
Et re-vlan!

Citation :


 
Cordialement.
 
Edit : Sujet clos pour ma part etant donné que mon 1er post repond a la demande.


 
C'était justement la conclusion que je lui postais pendant que tu envoyais ce gentil message :whistle:  
 


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 23-11-2009 à 18:15:55    

Merci mais tout ça ne m'aide pas  :sweat:

Reply

Marsh Posté le 23-11-2009 à 18:27:24    

lamiche37 a écrit :

Non j'avais essayé d'abord la tienne, et là je viens d'essayer celle de dje69r mais il m'affiche des erreurs...


Aïe! Il va pas être content!!! Il était déjà fâché, là on risque le malaise! Et pis je crois qu'il a claqué la porte et qu'il veut plus t'aider.  :pt1cable:  
Je vais voir ce que je peux faire pour toi, mais je suis beaucoup moins savant en informatique que lui, tu sais!  :whistle:  


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 23-11-2009 à 18:53:12    

lamiche37 a écrit :

Merci mais tout ça ne m'aide pas  :sweat:


 
Pleure po, bébé, on va t'aider ;)  
 
 Bon, j'ai testé la macro du monsieur, elle marche très bien, je comprends pas ton problo?
 
Tu peux juste rajouter ces 2 lignes pour plus de confort:
 
 
  Application.CutCopyMode = False        'pour annuler le mode "copy" '(les pointillés scintillants)
   
  Target.Offset(1, 0).Select                ' revient une case sous celle où tu as rentré le dernier "1"  (appelée "Target", cible)
 
Si tu as encore un pb, essaie de bien m'expliquer quoi, ou bien ce que tu veux faire.
 
A+
 
 
 
 
 


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 23-11-2009 à 19:02:04    

Merci,
 
pour ta macro: j'ai fais un copier/coller alors que pour celle de dje69r ça ne marche pas  :sweat:  
 
Bon je réessaie  :jap:  
 
Edit:
 
J'ai une erreur 424
et si je fait deboggage j'ai: If Target.Column <> 3 Then en jaune  
 
Je ne comprends pas  :??:  
 
 :hello:


Message édité par lamiche37 le 23-11-2009 à 19:07:48
Reply

Marsh Posté le 23-11-2009 à 19:48:06    

Hello
Bon, j'étais sorti, me revoilà.
Je ne comprends pas non plus? J'ai fait aussi un copier/coller, ça marche bien.  
A quel moment as-tu l'erreur?

Reply

Marsh Posté le 23-11-2009 à 20:00:38    

j'ai mis ça dans 1 tableau, qui je pense correspond au tien:
 
aaa dd        ee
21 torchon 0
23 serviette 0
42 poire         1
44 pomme 0
46 raisin         0
56 citron         1
67 TOMATE 1
78 patates 0
42 poire  
56 citron  
67 TOMATE  
 
(aaa, dd, ee, sont les titres de colonnes, etc)
 
à chaque fois que je tape 1 en colonne C, il recopie les cells A et B à la suite; c'est bien ce que tu voulais?
 
Quant à la macro, je l'ai copiée dans le module correspondant à la feuille1 du classeur en question (pas dans le classeur de macros Perso.xls) OK?
 


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 23-11-2009 à 20:17:15    

Citation :

Quant à la macro, je l'ai copiée dans le module correspondant à la feuille1 du classeur en question


 
ça doit être là que je me plante  :heink:  
 
Qu'entendez vous par "module" ?
 
Mais quel imbécile je suis  :D , ça y est j'ai fini par comprendre:
je fais un clic droit sur l'onglet et là je visualise le code et fais un copier coller  :jap:  
 
Pour rajouter tes 2 lignes:  

Citation :

Application.CutCopyMode = False        'pour annuler le mode "copy" '(les pointillés scintillants)
   
  Target.Offset(1, 0).Select                ' revient une case sous celle où tu as rentré le dernier "1"  (appelée "Target", cible)


Est ce qu'il y a un ordre ?
Et puis je adapter cette macro avec plus de colonne ( de A à Q) et dont des colonnes groupées  :??:  
 
Déjà j'essaie de comprendre le code et après j'essaie de le réécrire et si tu peux m'aider à le corriger  :jap:  
 
Merci à vous 2


Message édité par lamiche37 le 23-11-2009 à 20:36:21
Reply

Marsh Posté le 23-11-2009 à 21:46:08    

Citation :

 
Qu'entendez vous par "module" ?


 
En réalité, c'est pas tout à fait un module, comme tu peux le voir, car un module, c'est une page soit de Perso.xls, pour toutes les macros générales, soit d'un classeur actif, pour toutes les feuilles de CE classeur, mais seulement de ce classeur; tandis que là, on le copie sur, disons, le "verso" de la feuille 1, et ça ne concernera QUE cette feuille 1, ou 2, ou 3,...
 
Pour rajouter les 2 lignes, il n'y a pas d'ordre, mais évidemment elles viennent à la fin de la macro, après la copie, pr revenir continuer le travail.

Citation :

Et puis je adapter cette macro avec plus de colonne et des colonnes groupées  :??:

 
 
ATTENTION!!!! si jamais tu recopies la cellule de la col C, la macro ne s'arrête plus!!!
 
Bon, j'ai un peu raccourci et remanié la macro de notre ami, pour qu'elle fasse la même chose sans déplacements, et qu'elle copie aussi les cellules D à H, par exemple. Je crois que ça devrait marcher aussi avec des colonnes groupées, je te laisserai vérifier.
 
Private Sub Worksheet_Change(ByVal Target As Range)
 
'Si on modifie une cellule autre que dans la colonne C ca ne fait rien
    If Target.Column <> 3 Then Exit Sub
 
'Si on saisi autre chose que 1 en colonne C ca ne fait rien (comme suppr par ex)
    If Target.Value <> 1 Then Exit Sub
 
'Recuperation de la ligne ou on saisi 1
    RowSel = Target.Row
 
        '''''''''''''''''''c'est là que ça change:
 
'Rang de la dernière ligne NON-vide   (A CONDITION QUE LA CELLULE  "B" de cette ligne ne soit   PAS VIDE  !)
         '(+1 pour avoir le n° de la 1ere ligne VIDE):
    RowFin = Range("B65536" ).End(xlUp).Row + 1
 
'Copie sans déplacement des 2 premières cellules de la ligne, puis des cellulesD à H, par exemple:
             Range(Cells(RowFin, 1), Cells(RowFin, 2)).Value = Range(Cells(RowSel, 1), Cells(RowSel, 2)).Value
             Range(Cells(RowFin, 4), Cells(RowFin, 8)).Value = Range(Cells(RowSel, 4), Cells(RowSel, 8)).Value
 
End Sub
 
     c'est tout!
Et plus la peine de rajouter les 2 lignes puisque on ne se déplace plus!
 
C'est dommage si il est faché, parce qu'il aurait pu m'expliquer comment utiliser son cpp...  (Je sais pas faire ça!!!!!!!!!!!!!! :cry: )
 
 
 
Déjà j'essaie de comprendre le code et après j'essaie de le réécrire et si tu peux m'aider à le corriger  :jap:  
 
Merci à vous 2
 [/quotemsg]


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 23-11-2009 à 22:27:08    

J'ai refait entièrement mon tableau  :D ,
 
la colonne ou je mettrais 1 ce retrouve sur la colonne R donc 18  :pt1cable:  
 
j'ai donc fait ceci:
 

Citation :

Private Sub Worksheet_Change(ByVal Target As Range)
   
   'Si on modifie une cellule autre que dans la colonne R ca ne fait rien
        If Target.Column <> 18 Then Exit Sub
   'Si on saisi autre chose que 1 en colonne R ca ne fait rien (comme suppr par ex)
        If Target.Value <> 1 Then Exit Sub
   
   'Recuperation de la ligne ou on saisi 1
        RowSel = Target.Row
   'On copie A et B
       Range(Cells(RowSel, 1), Cells(RowSel, 2), Cells(RowSel, 3), Cells(RowSel, 4),,Cells(RowSel, 5), Cells(RowSel, 6), Cells(RowSel, 7), _
       Cells(RowSel, 8), Cells(RowSel, 9), Cells(RowSel, 10), Cells(RowSel, 11), Cells(RowSel, 12),,Cells(RowSel, 13), Cells(RowSel, 14), _
       Cells(RowSel, 15), Cells(RowSel, 16)).Copy
       
   
   'Récuperation de la derniere ligne, ou 1ere ligne vide
       Range("A65536" ).Select
       Selection.End(xlUp).Select
       RowFin = Selection.Row + 1
   'On colle sur la premiere ligne vide
       Cells(RowFin, 1).Select
       ActiveSheet.Paste
   'pour annuler le mode "copy" '(les pointillés scintillants)
       Application.CutCopyMode = False
   ' revient une case sous celle où tu as rentré le dernier "1"  (appelée "Target", cible)
         Target.Offset(1, 0).Select
   
   End Sub


 
mais ça ne fonctionne pas  :cry:  a priori j'ai vu un message de taille de cellule  :(  
 
Je te joins une copie de mon fichier sous format 2007 http://www.cijoint.fr/cjlink.php?f [...] heh0C.xlsx
 
Merci pour tout,
 
je vais continuer de lire un bouquin sur excel et vba  :D  
 
Bonne nuit  
 
 :hello:

Reply

Marsh Posté le 23-11-2009 à 23:30:35    

lamiche37 a écrit :

J'ai refait entièrement mon tableau  :D ,


 
Mais ti es fou, toi!!!!
C'est là que ça merdoie, c'est sûr:
 'On copie A et B
       Range(Cells(RowSel, 1), Cells(RowSel, 2), Cells(RowSel, 3), Cells(RowSel, 4),,Cells(RowSel, 5), Cells(RowSel, 6), Cells(RowSel, 7), _
       Cells(RowSel, 8), Cells(RowSel, 9), Cells(RowSel, 10), Cells(RowSel, 11), Cells(RowSel, 12),,Cells(RowSel, 13), Cells(RowSel, 14), _
       Cells(RowSel, 15), Cells(RowSel, 16)).Copy
 
'tu remplaces ça par:
'Range(début,fin).copy
 
'et mieux encore: Range(début,fin).valeur*= Range(début,fin).valeur**, où *= destination  et ** = origine, soit:
 
                    Range(Cells(RowFin, 1), Cells(RowFin, 17)).Value = Range(Cells(RowSel, 1), Cells(RowSel, 17)).Value  
             
       donc:
 
Private Sub Worksheet_Change(ByVal Target As Range)
     
        If Target.Column <> 3 Then Exit Sub
         If Target.Value <> 1 Then Exit Sub
         RowSel = Target.Row
   
             RowFin = Range("B65536" ).End(xlUp).Row + 1           '***              
             Range(Cells(RowFin, 1), Cells(RowFin, 17)).Value = Range(Cells(RowSel, 1), Cells(RowSel, 17)).Value             '****
End Sub
 
  5 lignes !
         
'             ***  Rang de la dernière ligne NON-vide,   A CONDITION QUE LA CELLULE  "B" de cette ligne ne soit   PAS VIDE  !)
    ' tu peux prendre n'importe quelle lettre de ta ligne dont tu sois sûr qu'elle soit toujours remplie:   A, ,B, G, H et tjrs 65536.
          '(+1 pour avoir le n° de la 1ere ligne VIDE)
 
    '****(COL 17, si tu remplies de 1 à 17)
 

Citation :


je vais continuer de lire un bouquin sur excel et vba  :D  
 
Bonne nuit  
 
 :hello:


 
C'est celà, bonne lecture, et en attendant, Bonne nuit à toi aussi.   :sleep:  


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 23-11-2009 à 23:38:43    

j'ai essayé d'ouvrir ton fichier, mais pas possible; pourras-tu me l'envoyer en ancien format, je n'ai pas office 2007 sur ce PC. (plus tard, je vas dormir, maintenant!)

Reply

Marsh Posté le 23-11-2009 à 23:50:10    

jjjuste une chose encore, à la 1° ligne, il faut évidemment mettre :     column <>18, et non pas column <> 3  !!!

Reply

Marsh Posté le 24-11-2009 à 09:24:10    

:lol:
 
Je ne suis pas quelqu'un qui se vexe rapidement. C'est juste que des remarques sur l'orthographe pour son probleme ne servaient pas a grand chose. Surtout qu'a la base, le morceau de code repondait a son attente.
Aucun rapport avec l'aide que tu lui apportais.
Bref, je dois surement etre dans ma période des 28 jours...  :sarcastic:  
 
Pour la balise cpp, bah tu mets :[ cpp] (sans espace) ton code et tu fermes la balise.[/cpp]
 
Le module des feuilles (onglets) sont des modules de classe.
 
J'attends aussi le fichier pour regarder plus en détails.
 
Je peux deja te dire qu'ici :

lamiche37 a écrit :

J'ai refait entièrement mon tableau  :D ,
 
la colonne ou je mettrais 1 ce retrouve sur la colonne R donc 18  :pt1cable:  
 
j'ai donc fait ceci:
 

Citation :

Private Sub Worksheet_Change(ByVal Target As Range)
   
   'Si on modifie une cellule autre que dans la colonne R ca ne fait rien
        If Target.Column <> 18 Then Exit Sub
   'Si on saisi autre chose que 1 en colonne R ca ne fait rien (comme suppr par ex)
        If Target.Value <> 1 Then Exit Sub
   
   'Recuperation de la ligne ou on saisi 1
        RowSel = Target.Row
   'On copie A et B
      Range(Cells(RowSel, 1), Cells(RowSel, 2), Cells(RowSel, 3), Cells(RowSel, 4),,Cells(RowSel, 5), Cells(RowSel, 6), Cells(RowSel, 7), _
       Cells(RowSel, 8), Cells(RowSel, 9), Cells(RowSel, 10), Cells(RowSel, 11), Cells(RowSel, 12),,Cells(RowSel, 13), Cells(RowSel, 14), _
       Cells(RowSel, 15), Cells(RowSel, 16))
.Copy
       
   
   'Récuperation de la derniere ligne, ou 1ere ligne vide
       Range("A65536" ).Select
       Selection.End(xlUp).Select
       RowFin = Selection.Row + 1
   'On colle sur la premiere ligne vide
       Cells(RowFin, 1).Select
       ActiveSheet.Paste
   'pour annuler le mode "copy" '(les pointillés scintillants)
       Application.CutCopyMode = False
   ' revient une case sous celle où tu as rentré le dernier "1"  (appelée "Target", cible)
         Target.Offset(1, 0).Select
   
   End Sub


 

Le Range te permets de sélectionner une cellule JUSQU'A une autre cellule. Ta syntaxe est donc erronnée. (Dans sa forme 'simple')
Si tu veux sélectionner/copier de A (Colonne 1) à P (Colonne 16) il faut faire :

Code :
  1. Range(Cells(RowSel, 1), Cells(RowSel, 16).Copy


 
 
Cordialement.

Message cité 1 fois
Message édité par SuppotDeSaTante le 24-11-2009 à 09:32:44

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 24-11-2009 à 10:29:42    

Ah, le revoilà! Bonjour, Monsieur. :hello:  
 
Merci pour le cpp, c'est effectivement plus joli, aéré, et tout, et de plus si simple que c'en est déconcertant!
 
Euh, pour le code :
 
 

SuppotDeSaTante a écrit :


..............Le Range te permets de sélectionner une cellule JUSQU'A une autre cellule. Ta syntaxe est donc erronnée. (Dans sa forme 'simple')
Si tu veux sélectionner/copier de A (Colonne 1) à P (Colonne 16) il faut faire :

Code :
  1. Range(Cells(RowSel, 1), Cells(RowSel, 16).Copy


 


 
C'est ce que je lui disais, non ?  : :)  

Citation :


tu remplaces ça par:      Range(début,fin).copy  
 
et mieux encore: Range(début,fin).valeur*= Range(début,fin).valeur**, où *= destination  et ** = origine, soit:  
 
                    Range(Cells(RowFin, 1), Cells(RowFin, 17)).Value = Range(Cells(RowSel, 1), Cells(RowSel, 17)).Value  
     


Et la macro que je lui proposais, variante de la tienne, que je ne résiste pas au plaisir d'écrire avec ton cpp, pour voir si c'est bien comme ça:  

Citation :


Code :
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.      
  3.   If Target.Column <> 18 Then Exit Sub
  4.   If Target.Value <> 1 Then Exit Sub
  5.   RowSel = Target.Row
  6.      RowFin = Range("B65536" ).End(xlUp).Row + 1                     
  7.     Range(Cells(RowFin, 1), Cells(RowFin, 17)).Value = Range(Cells(RowSel, 1), Cells(RowSel, 17)).Value           
  8. End Sub


 


 
Merci encore
Bien à toi
 


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 24-11-2009 à 11:11:35    

Oui c'est possible en effet que c'etait ce que tu disais, mais hum, j'ai meme pas lu... Tellement c'etait... hum... Moche ! :D
 
Donc en effet, une fois lisible :p ta macro roule ;)


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 24-11-2009 à 17:47:53    

Bonjour et merci à vous 2  :jap: ,
 
Voici mon nouveau fichier http://www.cijoint.fr/cjlink.php?f [...] vJ6rBN.xls sur le quel j'ai rajouté la "macro"
 
Sur le fichier la macro ne fonctionne pas  :heink:
 
Si c'est plus facile que je mettes un "O" ou un "N" pour Fini: Oui-Non  :??:  
 
Que pouvez vous me conseiller pour apprendre ce "langage" :ouimaitre: sur le bouquin que j'ai "Formules et Fonctions Excel 2003", je n'ai pas trouvé tout ces termes  :ouch:  
 
 :hello:  
 

Reply

Marsh Posté le 24-11-2009 à 18:33:01    

lamiche37 a écrit :

Bonjour et merci à vous 2  :jap: ,
 
Sur le fichier la macro ne fonctionne pas  :heink:
 
Si c'est plus facile que je mettes un "O" ou un "N" pour Fini: Oui-Non  :??:  
 
Que pouvez vous me conseiller pour apprendre ce "langage" :ouimaitre: sur le bouquin que j'ai "Formules et Fonctions Excel 2003", je n'ai pas trouvé tout ces termes  :ouch:  
 
 :hello:  
 


 
 
Bonsoir mon ami
 
C'est normal qu'elle marche pas!
 
Moi j'ai vu en 2 secondes ce qui n'allait pas.
Regarde-la BIEN, tu vas trouver.
 :ouch:  
 

 
 
 


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 24-11-2009 à 18:53:13    

Je vais t'aider: regarde aussi ton tableau. :love:   A y est?
 
L'informatique est aussi une question d'observation, de raisonnement et d'adaptation.  Amen. :ange:  
 
Pour ta question pour O / N, tu peux mettre ce que tu veux à condition de mettre la même chose ds la macro, of course.
 
pour les bouquins, moi chsais pas, les miens, ça fait un bail que je les ai, mais entre VBA pour les nuls, ou équivalent, (c'est pas un jugement de valeur, hein!), et les bouquins de chez microsoft ou micro-application, tu devrais trouver de quoi t'amuser.
 
 
 


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 24-11-2009 à 19:06:11    

Est ce une question de colonne vide  :??:  
 
Je ne vois pas  :(
 
Edit: En recopiant exactement ce que tu m'as fournit ça fonctionne si je remplie toutes mes cellules des colonnes avant la "R"  :wahoo:  
 
Donc il faudra que je remplisse obligatoirement toutes mes cellules  :??:  
 
Et autre petite question  :gratgrat: puis je conserver la police d'écriture et les couleurs (sinon je formate mes colonnes  :D )  
 
Pour mettre O à la place de 1 je modifie:

Citation :

If Target.Value <> 1 Then Exit Sub


Par:

Citation :

If Target.Value <> O Then Exit Sub


 
C'est ça :gratgrat:


Message édité par lamiche37 le 24-11-2009 à 19:25:43
Reply

Marsh Posté le 24-11-2009 à 20:44:46    

Sorry, j'étais allé mangir.
 
Alors, les réponses:
 
OUI
NON
OUI
C'est bien, tu as 2 oui pour 1 non. Enfin, on va dire ça comme ça.
 
Bon, effectivement, c'est une question de colonne. Je t'avais dit dans une des dernières descriptions:

Citation :


'Rang de la dernière ligne NON-vide   (A CONDITION QUE LA CELLULE  "B" de cette ligne ne soit   PAS VIDE  !)  
         '(+1 pour avoir le n° de la 1ere ligne VIDE):  
    RowFin = Range("B65536" ).End(xlUp).Row + 1  


 
Mais je vois que tu n'as pas compris le principe, et le tort nous en revient, car on ne te l'a pas expliqué.  
 
Donc la formule :     RowFin = Range("B65536" ).End(xlUp).Row  
veut dire qu'à partir de la toute dernière ligne possible (65536), on remonte -  End(xlUp)  - le long de la colonne B, jusqu'à trouver une cellule non-vide dans cette colonne.
 
 Selon le scénario de cette macro, cette cellule est censée être la dernière du tableau, donc à partir de laquelle on recopiera les lignes désirées. On rajoute +1 pour avoir le N° de la ligne vide. Tu peux prendre n'importe quelle colonne, à condition d'en choisir une dont tu es sûr qu'elle sera TOUJOURS la plus basse de ton tableau, le remplissage des autres col n'a alors pas d'importance.  
 
Le mot rowfin est arbitraire, tu peux mettre ligne1,  TotoLast, ou ce que tu veux, mais il illustre bien ce qu'il désigne ici, c'est utile pr quand tu fais ou relis une macro, tu vois tt de suite même 3 pages plus loin de quoi il s'agit.
 
Est-ce bien clair?  :)  
 
 
 
 
 


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 24-11-2009 à 20:47:10    

j'ai oublié de répondre à ta dernière question,  
 
If Target.Value <> O Then Exit Sub
 
oui, c'est tout à fait ça, Bravo.

Reply

Marsh Posté le 24-11-2009 à 20:57:14    

Laoo a écrit :

j'ai oublié de répondre à ta dernière question,  
 
If Target.Value <> O Then Exit Sub
 
oui, c'est tout à fait ça, Bravo.


 
 
ne serait-ce pas  
If Target.Value <> "O" Then Exit Sub
 
 
 
 
Cordialement
 

Reply

Marsh Posté le 24-11-2009 à 21:07:24    

Merci,
 
Donc si je ne veux pas avoir à remplir toutes mes cellules je choisis une colonne où toutes les cellules sont pleines  :??: donc ma colonne G
 

Citation :

Private Sub Worksheet_Change(ByVal Target As Range)
   
   'Si on modifie une cellule autre que dans la colonne R ca ne fait rien
        If Target.Column <> 18 Then Exit Sub
   'Si on saisi autre chose que n en colonne R ca ne fait rien (comme suppr par ex)
        If Target.Value <> n Then Exit Sub
   
   'Recuperation de la ligne ou on saisi n
        RowSel = Target.Row
         
   'Récuperation de la derniere ligne, ou 1ere ligne vide
     RowFin = Range("G65536" ).End(xlUp).Row + 1
     
   'On copie de A à Q
       Range(Cells(RowFin, 1), Cells(RowFin, 17)).Value = Range(Cells(RowSel, 1), Cells(RowSel, 17)).Value
       
 
   End Sub


 
Et j'apprécie effectivement les explications  :jap:  
 
ça donne vraiment envie d'en savoir plus  :love:  
 
 :hello:

Message cité 1 fois
Message édité par lamiche37 le 24-11-2009 à 21:43:32
Reply

Marsh Posté le 24-11-2009 à 21:52:58    

lamiche37 a écrit :

Merci,
 
Donc si je ne veux pas avoir à remplir toutes mes cellules je choisis une colonne où toutes les cellules sont pleines  :??: donc ma colonne G
 

Citation :


   'Récuperation de la derniere ligne, ou 1ere ligne vide
     RowFin = Range("G65536" ).End(xlUp).Row + 1
     
   'On copie de A à Q
       Range(Cells(RowFin, 1), Cells(RowFin, 17)).Value = Range(Cells(RowSel, 1), Cells(RowSel, 17)).Value
      End Sub


 
 
 :hello:


 
Tu n'es pas obligé d'avoir une colonne dont toutes les cellules sont remplies, mais c'est effectivement le mieux, afin d'être sûr de ne pas copier une ligne sur une autre. Ainsi tes recopies seront tjrs plus basses que ton tableau, CQFD.
 
Le monsieur au-dessus a raison, si c'est un 0 et non pas un 0  (Bonjour l'ambigüité!!), c'est à dire une lettre et non pas un chiffre, il convient d'écrire ......<>"O", sinon Excel se fâche...
 
Dis-moi, je pense à qq chose pour ton tableau, il me semblerait judicieux de rajouter dans la ligne que tu as recopiée une mention signalant qu'elle a été copiée, afin de ne pas la recopier plusieurs fois par inadvertance.  
 
Du genre Target.offset(0,1).Value="Vu"  (ou même Target.Value="Vu" )    à la fin, et au début:  
 
If Target.Value="Vu" Then Exit Sub   ?
 
Tu peux aussi colorer les lignes en fonction de leur état, fait, pas fait à faire, urgent...


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 24-11-2009 à 22:20:19    

Citation :

Dis-moi, je pense à qq chose pour ton tableau, il me semblerait judicieux de rajouter dans la ligne que tu as recopiée une mention signalant qu'elle a été copiée, afin de ne pas la recopier plusieurs fois par inadvertance.


 
 :??:  je veux justement pouvoir la recopier tant que je n'ai pas répondu "O" pour Oui donc pour certain travaux, plusieurs fois  :lol: afin que ça reste à l'écran (si je me fais bien comprendre  :pt1cable: )
 
Je ne comprends pas le:

Citation :

Du genre Target.offset(0,1).Value="Vu"  (ou même Target.Value="Vu" )    à la fin, et au début:  
 
If Target.Value="Vu" Then Exit Sub

 
 
En ce qui concerne:

Citation :


Tu peux aussi colorer les lignes en fonction de leur état, fait, pas fait à faire, urgent...


je pense que ce sera ma prochaine étape avec la création d'un onglet par machine et le renvoi des lignes qui concernent ces machines (donc la colonne "H" ). Pour l'instant je fais un copier/coller sur un autre dossier afin d'avoir un suivi des machines et des pannes  :whistle:  
 
 :jap:  
 
Sur ce   :sleep:

Reply

Marsh Posté le 24-11-2009 à 23:22:57    

lamiche37 a écrit :


 :??:  je veux justement pouvoir la recopier tant que je n'ai pas répondu "O" pour Oui donc pour certain travaux, plusieurs fois  :lol: afin que ça reste à l'écran (si je me fais bien comprendre  :pt1cable: )
 


 
non, pas du tout... :pt1cable:  
 
  Tu remplaces 1, qui signifiait: pas fait, à recopier, par "0", et tu me dis que cela signifiera "FAIT" ?????????????????????   Là je suis paumé, et ça ne va plus du tout ds la macro!!!!
 
Splique-moi, svp.
 
Dans ce cas, si "0" est le contraire de 1  (qui devient "N" ), il faut mettre alors:
 
If Target.Value <> "N" Then Exit Sub
 
qui signifie aussi : If Target.Value = "O" Then Exit Sub (mention inutile, impliquée par la précédente, indiqée pour l'exemple).
 
 
Autrement dit:  
Si j'écris "N", je recopie, si j'écris "O", je recopie PAS, je sors de la macro. Right?
 
 
 
Et si tu la recopies en bas de tableau pour qu'elle reste présente, tu ne veux pas supprimer la ligne d'origine, par hasard, ce qui serait ptêtre plus rationnel?  (genre: Target.entirerow.Delete)
 
 

Citation :


Je ne comprends pas le:

Citation :

Du genre Target.offset(0,1).Value="Vu"  (ou même Target.Value="Vu" )    à la fin, et au début:  
 
If Target.Value="Vu" Then Exit Sub

 


 
C'était pour signaler dans la ligne qu'elle avait été copiée...
 
 
Dors en paix, mon ami
 
 


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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