Résolu Copier Coller ligne complète si une condition est respectée

LouisHSE

Habitué
Bondour !
Alors je suis une quille en VGA/macro blabla... Enfin j'ai jamais eu de cours... Mais je crois que c'est bien cette "chose" qu'il me faut pour un tableur excel car la ligne de code avec les SI OU ET imbriqués est imbuvable.

Alors du coup comment je peux faire pour que sur la feuille 2 de mon classeur, apparaissent toutes les lignes de mon classeur 1 dès lors qu'une cellule de la colonne G a une valeur supérieure ou égale à 80 ?
Sachant que les 2 premières lignes du classeur 2 sont des titres et que dans le tableau classeur 1 il y a aussi des parties (je sais pas si ça a une importance de le préciser).



Merci beaucoup par avance pour les gentilles personnes qui aideront la quille que je suis :D
 

drul

Obscur pro du hardware
Staff
Salut,
Vu ce que tu décris le "=SI(...)" ne paraît pas bien compliqué ...
 

LouisHSE

Habitué
Salut en effet c'est faisable mais très fastidieux...

J'ai une dizaine de colonnes et plusieurs centaines de lignes.
J'ai peut être pas été clair dans ma demande.
En gros :
ma colonne G contient un niveau sonore et chaque ligne constitue un point de mesure. Mon tableau du classeur 1 est donc une simple rentrée de données avec des mises en formes conditionnelles.
Ce que je souhaite c'est qu'à chaque fois que j'ai un niveau sonore supérieur ou égal à 80 (colonne G du classeur 1), la ligne complète soit retranscrite dans le classeur 2. Et uniquement les lignes là (qu'il n'y ait pas des trous lorsqu'il trouve une ligne avec une valeur inférieure à 80).

Si c'est faisable juste avec les si(et(ou machin, peut être un petit aperçu ne serait de refus car là j'ai en exemple cette ligne de code pour une seule colonne :

=SI(OU(ET('Carto 11-2012'!G46>80;ESTVIDE('Carto 11-2012'!F46));ET('Carto 11-2012'!G46<80;ESTVIDE('Carto 11-2012'!F46));ET('Carto 11-2012'!G46=80;ESTVIDE('Carto 11-2012'!F46)));"";'Carto 11-2012'!F46)

car là problèmes :

- je fais apparaitre des lignes vides lorsque la valeur en G est <80
- je dois récrire à chaque colonne un code différent car même si je fixe la cellule, bah en glissant avec le petit point noir de la cellule ça copie la même chose (normal en même temps)

Je pense (pour pas dire être sûr) que mes erreurs sont simples c'est juste que là je m'arrache les cheveux :/
 

drul

Obscur pro du hardware
Staff
Ouais en effet si tu veux pas les lignes vides ça complique ...
Alors en VBA c'est très simple à faire, mais tu n'as jamais ouvert VBA c'est bien ça ?

Une ou deux question quand même:
La macro doit être lancée comment (bouton, modification d'une des données/cellule, ...) ?
Est-il envisageable de complètement vider la feuille 2 et de la reconstruire entièrement à chaque exécution de la macro ? (si non ça va méchamment compliquer la donne ...)
 

LouisHSE

Habitué
Alors je sais ouvrir VBA (hourra) mais c'est tout :pt1cable:

L'idéal serait que le classeur 2 se mette à jour seul lorsque je change des valeurs (donc modification des données/cellules si je fais l'analogie ?).

Ensuite ce serait bien de pouvoir garder une trace de cette feuille 2, qui me permettra de faire un suivi (pour voir si lors de prochaines mesures on a un niveau sonore plus ou moins élevé...).

Donc pour résumer :

- pas de lignes vides
- déclenchement automatique quand je change les données
- que ça se créée sur une nouvelle feuille à chaque fois

Je peux sauter par la fenêtre donc si j'ai bien compris ?


Remarque:
La macro se lance à chaque cellule que je modifie avec l'option "modification des données..." ? Si c'est le cas c'est juste infaisable alors autant faire la macro que je lance manuellement (car si je rentre les centaines de données et que la macro décide de créer une nouvelle feuille à chaque fois... bah voilà quoi :D

En tout cas merci de ton intérêt ça fait plaisir ! :)
 

drul

Obscur pro du hardware
Staff
Effectivement si tu veux chaque fois créer une nouvelle feuille on est mal partit pour le faire à chaque modif sur feuille1 ...

Dans le cas présent un lancement manuel me semble préférable.

Tu as déjà une idée de comment t'y prendre (en français, pour le vba on verra après).

N.B. mon but est de t'apprendre les rudiments du VBA, pas de faire la macro à ta place (même si je ferai sûrement le gros du travail en fin de compte), mais j'aimerais vraiment que tu aies appris qqch et compris ce qu'on aura réalisé. Ceci peut prendre pas mal de temps (même pour un problème simple)
 

LouisHSE

Habitué
une idée de comment m'y prendre... aucune idée :pt1cable:


genre si g10>= 80 => alors copier la ligne associée entière (qui peut être ligne 12 à cause des titres), sinon ne rien copier


Je pense que je vais abandonner si c'est trop complexe et je ferai un vieux copy/paste, mais ça me prendra beaucoup plus de temps. Arghhh dilemme quand tu nous tiens
 

magellan

Modérâleur
Staff
Comme tous les langages le VBA n'est pas "complexe" en soi, mais il peut le devenir si l'on ne respecte pas des fondamentaux précis concernant la structuration des opérations.

Si tu veux que l'aide soit efficace, je t'invite à préciser les règles de fonctionnement aussi finement que possible.

Par exemple
- Si la cellule est vide, ne pas copier
- Si la cellule contient "x" ou contient "y", faire ceci, sinon faire cela
- Si la somme des cellules "a" "b" "c" est comprise entre 10 et 40, ou entre 45 et 75 faire ceci/cela.

Etc
Cela rendra les règles exploitables, claires, et nous pourrons te donner des pistes.

Dans programmation, il y a une éthique simple:
- Pose toutes les questions que tu veux, aucune question n'est bête
MAIS
- N'escompte pas que l'on fasse le boulot à ta place, parce que tu es là pour comprendre ce que tu fais

:)
 

LouisHSE

Habitué
eh bien justement ça va être là le souci je sens.
tout doit découler de la valeur des cellules dans une seule colonne.
Si cette cellule dépasse ou est égale à 80, il me faut la ligne complète qui sorte sur la nouvelle feuille car les autres colonnes me renseignent l'endroit de la mesure, le type d'appareil, les conditions blabla

A contrario pour toutes les cellules qui seront strictement inférieures à 80 de ladite colonne, je ne souhaite aucun report de la ligne sur ma feuille 2.

La feuille 2 est en fait un résumé de ce qu'il ne va pas sur mon site, et donc je pourrai prioriser les actions en conséquence.


D'ailleurs pour pousser le vice encore plus, on peut intégrer directement dans la macro qu'elle ordonne ensuite le tableau feuille 2 dans l'ordre décroissant par rapport à cette valeur tant étudiée ? (bien sûr en gardant les données associées à cette valeur, enfin la ligne quoi, que ça trie en ligne par rapport aux colonnes.... c'est vraiment pas clair je sais pas expliquer x) ).
 

drul

Obscur pro du hardware
Staff
Essayes d'exprimer en français du code:
un exemple qui n'a rien à voir avec ton problème:

Code:
Pour toutes les lignes de 1 à 30:
  Si Valeur en A > Valeur en B ALORS:
    Valeur en C = 1
  Sinon
    Valeur en C = 0
 

LouisHSE

Habitué
eh bien des lignes 1 à 30, si ma cellule A > B => alors C = 1 et si A < B => C = 0

là ça va c'est compréhensible, je "panique" à la vue des autres topics quand je vois des .Rows machin truc x') parce que là ma compréhension s'élève au niveau de l'encéphalogramme d'une grenouille. Morte. Écrasée par un semi-remorque. Sur une route de campagne. En hiver.
 

LouisHSE

Habitué
ou genre ça :

AG.Range(iAG & ":" & iAG).Copy HO.Cells(iHO, 2)

ce moment de solitude que je me tape en lisant ces lignes
 

drul

Obscur pro du hardware
Staff
:D

C'est comme une langue étrangère c'est juste une question de syntaxe, mais le fonds du problème tu peux le poser en français, essaye donc de faire pour ton problème ce que j'ai fais dans l'exemple, ensuite je pourrai jouer à google translator ...
 

magellan

Modérâleur
Staff
Vous y en va parler la france :D

Blague à part, applique ce que Drul t'indique, traduis ton besoin en étapes élémentaires en français afin qu'on s'amuse à voir si en code c'est envisageable, complexe, ou simplement impossible ;)
 

outilsetprocess

Expert
Moi aussi au début je galérais je comprenais absolument rien mais Drul m'a aidé, je partais de 0 et y'a pas grand chose à apprendre c'est beaucoup de logique

Genre tu crées des variables

Par exemple X un entier, ou un range

Et tu te sers de cette variable qui sera dynamique sur ton tableur

Par exemple

Dim a as Integer
For a = 1 to 15
Cells(a, 20) = "blablabla"
Next

après y'a quelques trucs à apprendre par cœur
Bien sûr je vais pas faire le crack mais faire un code en Français littéraire puis essayer de le traduire en vba ça aide et y'a aussi plein de "formules" à apprendre mais avec les mots clés on les retrouve sur internet
Y'a aussi la syntaxe des fois le débogueur détecte pas mais ça se fait pas comme ça

Moi je suis un débutant c'est sûr mais je pars plus de 0 j'arrive à comprendre un code c'est déjà ça ^^
Le vba j'ai l'impression que c'est beaucoup de pratique de toute manière donc on peut pas trop demander à un débutant de se démerder il y arrivera jamais

Mais essayer en français au moins
 

drul

Obscur pro du hardware
Staff
N.B le macro recorder est outil très utile pour apprendre la syntaxe ! (même si le code pondu est une horreur au final :D)
 

LouisHSE

Habitué
alors pour toutes les lignes de 1 à 65536

Si valeur de cellule dans colonne G >= 80 Alors:

copier ligne correspondante dans feuille 2

sinon

ne rien copier



c'est nul c'est ce que j'ai écris plus haut x')


J'avais retranscris ce que j'avais pu avec ce code là piqué dans un autre topic

Code:
 Sub test()

     
     
    Dim ligne_a_deplacer As Integer

    Dim cel As Range

    Dim vo

     
    ligne_a_deplacer = Worksheets("test").Range("a" & Worksheets("test").Rows.Count).End(xlUp).Row

     
    With Sheets("Carto 11-2012")

        For Each cel In .Range("g3:g" & .Range("g" & .Rows.Count).End(xlUp).Row)

            If cel.Value <> ">80" Then

            .Rows(cel.Row).Copy Destination:=Worksheets("test").Cells(ligne_a_deplacer, 1)
            
        
            ligne_a_deplacer = ligne_a_deplacer + 1
            
            End If
            
            
            If Not cel.Value <> "<80" Then
            
            
            
        

     
     
            End If

         Next

    End With

    End Sub



Seulement il me copie toutes les lignes bêtement. Il me réécrit pas non plus les "titres" des colonnes mais ça à la limite je peux les copy paste manuellement.
Je m'explique pour ces colonnes "titres" :
tout en haut sur les 2 premières lignes j'ai les gros titres "date, appareil, local, ..." et ensuite j'ai une 2 lignes fusionnées pour découper le tableau en différents bâtiments.

Euh clair ? x')
 

LouisHSE

Habitué
(oui je n'ai absolument rien capté à ce que j'ai écris et je vois là qu'il y a un premier hic sur Dim vo --> j'ai pas changé le vo)
 

magellan

Modérâleur
Staff
ben c'est déjà pas mal dis donc!
Déjà une chose : pas besoin du bloc
Code:
If Not cel.Value <> "<80" Then
End If
En gros: tu le testes déjà au-dessus, donc concrètement aucun besoin de le refaire:)

par contre, tu peux traiter une exception pour la première ligne et la copier brute... La technique serait alors de faire un "else" et testant également si tu es sur la première ligne

Par exemple:
[Fixed]
pour toute cellule sur ma zone
si(la ligne est la première de la série)
copier la ligne // on conserve ainsi l'entête
sinon
si(la colonne G >80)
copier la ligne // on copie alors les données.
fin de si
fin de si
fin boucle
[/fixed]
[EDIT]j'ai rien dit pour ce qui est rayé... suis fatigué là...[/EDIT]
[Strike]Par contre, là où j'ai systématiquement un doute, c'est à la copie des lignes à savoir la numérotation de position de ligne dans la feuille cible... ah mes souvenirs sont lointains, mais il me semble qu'il te manque une incrémentation qui dit
"Voilà le numéro de ligne cible" pour éviter des lignes vides à toute ligne non copiée.[/Strike]
 

LouisHSE

Habitué
eeeeeeeeeet c'est l'encéphalogramme de la grenouille... je n'ai rien compris hein c'est juste un code que j'ai trouvé dans un topic du forum et que j'ai essayé d'arranger à ma sauce en changeant 3 ou 4 mots :D

mais oui je vois ce que tu dis en "rayé" je sais pas s'il faut prendre en compte le début des valeurs ou directement la 1ère ligne et la macro se débrouille
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 051
Membres
1 586 282
Dernier membre
Yannick3553
Partager cette page
Haut