Posez votre question Signaler

Excel VBA selection lignes avec condition [Résolu/Fermé]

linette44 24Messages postés dimanche 1 avril 2007Date d'inscription 20 mai 2008 Dernière intervention - Dernière réponse le 23 mai 2008 à 00:04
Bonjour,
Après un 1er message parti trop vite (voir linette 44, 21.45), voici mon problème.
Je désire sélectionner les lignes répondant à la valeur "contrat" dans la colonne A et différent de "816 et 819" dans la colonne C.
Les lignes sélectionnées devront être coupées et coller sur une nouvelle feuille.
J'ai également un deuxième problème sur un autre classeur :
Faire la somme des valeurs de chaque colonne(4 colonnes) sur la 1ère ligne vierge au bas du tableau.
Merci de votre aide
Lire la suite 
Réponse
+10
moins plus
Bonsoir,

Je suis en train de travailler sur une macro similaire. Pour répondre à ta dernière question, oui, c'est normal qu'Excel copie toutes les lignes (même celles cachées par le filtre), ça m'est déjà arrivé. Et si c'est un bug, moi ça m'arrive souvent...

Voilà, alors j'ai un tableau avec:
- premiere colonne vide
- 2e colonne : Nom
- 3e colonne : Prénom
- 4e colonne : sexe
- 5e colonne : age

je veux copier les monsieurs dans une autre feuille de calcul et les dames de même dans une 3eme feuille de calcul (il faut que ces 2 feuilles de calcul existent déjà, tu peux les rajouter à la main, ou bien ajouter du code au début pour les créer). Les noms de mes feuilles de calcul sotn sheet1, sheet2 et sheet3.

voici mon code (certainement possible de l'améliorer) il faut le compléter avec le rajout des en-têtes de colonnes mais le principe est là :

Sub CreationOnglets()

' COPIE DES LIGNES DESIREES DANS LES FEUILLES DE CALCUL DEDIEES

Dim Rw As Range
Dim Ligne As Long

' Sélectionne l'ensemble des données (utile pour qu'Excel ne "réfléchisse" pas sur les 65000 lignes)

Sheets("Sheet1").Select
ActiveCell.SpecialCells(xlLastCell).Select
Range(Selection, Cells(1)).Select

' Boucle qui va passer sur chaque ligne de la sélection afin de déterminer si des lignes contiennent le flag voulu
' puis copie dans une deuxième feuille de calcul

For Each Rw In Selection.Rows

Ligne = Rw.Row

If Rw.Cells(1, 4).Value = "M" Then
Rw.Copy Destination:=Worksheets("Sheet2").Cells(Ligne, 1).EntireRow
End If

Next Rw

' Boucle qui va passer sur chaque ligne de la sélection afin de déterminer si des lignes contiennent le flag voulu
' puis copie dans une troisième feuille de calcul

For Each Rw In Selection.Rows

Ligne = Rw.Row

If Rw.Cells(1, 4).Value = "F" Then
Rw.Copy Destination:=Worksheets("Sheet3").Cells(Ligne, 1).EntireRow
End If

Next Rw


' Supression des lignes vierges dans les feuilles de calcul récemment constituées

Sheets("Sheet2").Activate

With ActiveSheet.UsedRange
derLi = .Row + .Rows.Count - 1
End With
Application.ScreenUpdating = False
For r = derLi To 1 Step -1
If Application.CountA(Rows(r)) = 0 Then Rows(r).Delete
Next r


Application.StatusBar = "- 20% - Macro en cours d'exécution, merci de patienter."

Sheets("Sheet3").Activate

With ActiveSheet.UsedRange
derLi = .Row + .Rows.Count - 1
End With
Application.ScreenUpdating = False
For r = derLi To 1 Step -1
If Application.CountA(Rows(r)) = 0 Then Rows(r).Delete
Next r

' Pop-up d'avertissement de fin de macro.

MsgBox "Le fichier est prêt pour envoi. Veuillez effectuer un test de cohérence avant envoi.", vbOKOnly, "Macro terminée"

End Sub

m77- 29 avril 2008 à 10:36
bonjour,
Ton message date un pe mé je sui intéressée par ske tu a fé.
J'ai essayé de fer ton tableau com tu le décri au début de ton message
Voilà, alors j'ai un tableau avec:
- premiere colonne vide
- 2e colonne : Nom
- 3e colonne : Prénom
- 4e colonne : sexe
- 5e colonne : age

je veux copier les monsieurs dans une autre feuille de calcul et les dames de même dans une 3eme feuille de calcul (il faut que ces 2 feuilles de calcul existent déjà, tu peux les rajouter à la main, ou bien ajouter du code au début pour les créer). Les noms de mes feuilles de calcul sotn sheet1, sheet2 et sheet3.

Mais maleureusement ca ne marche pas car ca met erreur a ce moment là
' Boucle qui va passer sur chaque ligne de la sélection afin de déterminer si des lignes contiennent le flag voulu
' puis copie dans une deuxième feuille de calcul

For Each Rw In Selection.Rows

Ligne = Rw.Row

If Rw.Cells(1, 4).Value = "M" Then
Rw.Copy Destination:=Worksheets("Sheet2").Cells(Ligne, 1).EntireRow
End If


Je vais texpliké mé besoin pe etr et gsper poura tu m'aidé
Moi g un tableau avec diférent moteur ayant un numéro diférent. il son composé de diférente pièce et j'aimerai faire un tableau moteur par page
colone 1: numéro1 pièce
colone 2: numéro 2 pièce
colone 3: nom de la pièce
colone 7: n°commande
colone 11: date retour
colone 13: numéro du moteur avec lekel je ve trié par page (un moteur par page)
(lé colone vide sont rempli a la main apré avoir colecté les doné)

J'aimerai ka chak foi kil repair un numéro il me genère un tableau par raport a ce numéro en me copian ttes les ligne de ce numéro avec les données des pièces

c'est compréhensible?!

c'est le meme principe ke toi de metre les femme dan un tableau page 3 et les homme page 2 avec leur age et leur nom sof ke moi c'es un numéro par tableau avec toutes le pieces associées

Merci beaucoup de pouvoir maidé...
J'atend avec inpatience...
Réponse
+3
moins plus
bonjour

Dans ton tableau Excel, sur ta feuille1 tu insères une ligne vide avant ton titre(tu peux la masquer).

En Feuille2 tu as ton titre en ligne 1 Nom Entreprise Nbre d'Accident
en ligne 2 tu mets la formule :
=INDEX(Feuil1!$A$1:$A$50;MIN(SI(NB.SI(A$1:A1;Feuil1!$A$3:$A$50)=0;SI(Feuil1!$A$3:$A$50<>"";LIGNE(Feuil1!$A$3:$A$50)))))&""
en colonne A et à valider par CTRL + MAJ  + ENTRER
et
=SOMME(SI(Feuil1!$A$1:$A$50=A2;(Feuil1!$B$1:$B$50);0))
en colonne B et à valider par CTRL + MAJ  + ENTRER


Puis tu sélectionnes les deux cellules et avec la petite croix en bas à droite tu les tires sur plusieurs lignes.

Normalement tu devrais avoir le résultat espéré.

Réponse
+1
moins plus
Et deja j'ajoute la question suivante: comment faire pour que le "tri" d'une donnee vers l'un ou l'autre des onglets s'applique uniquement a la derniere ligne que l'on vient d'entrer (et non pas a toute la plage de cellules)? Ou alternativement, comment faire pour que lorsqu'on execute la macro, elle n'applique pas encore une fois le tri a toutes les donnees (mais uniquement aux dernieres donnees introduites)? Merci!

Réponse
+1
moins plus
C'est bon j'ai trouvé ^^

Ca marche bien et voir même super bien :)

Et bien encore merci Eric pour ce fameux cours que tu m'as donné là...

A très bientôt :)

Réponse
+1
moins plus
bonjour

aucunes copies ne s'effectuent...

C'est certainement que tu n'as aucune donnée sélectionnée : je ne peux pas savoir quelles valeurs tu sélectionnes
Essaie avec ceci peut-être afin de numériser toutes les valeurs
    If  Val(Rw.Cells(1, 4).Value) = Val(numSemaine) Then
        If Val(Rw.Cells(1, 5).Value) = Val(numDCS) Then

C'est pour que toutes les lignes soit de taille 25.
Avec une telle instruction, il n'y a que la ligne 553 qui est touchée... !

Réponse
+0
moins plus
bonjour

problème 1 :

tu appliques un filtre avec une personnalisation pour la deuxième colonne du fait de 2 critères.
ensuite tu sélectionnes tes lignes puis couper et coller où tu veux.


problème 2 :

Faire la somme des valeurs de chaque colonne(4 colonnes) sur la 1ère ligne vierge au bas du tableau.

fait la somme en ligne 2 après le titre, avec la formule :

=somme(d3:d65536)

Réponse
+0
moins plus
Bonjour et merci pour les réponses.
Problème 1 :
Il s'agit de faire une macro comme indiqué dans mon premier message qui est parti trop vite .
Je peux appliquer les filtres mais en fonction du fichier de départ le nombre de lignes filtrées à copier peut varier. Comment repérer les lignes à copier ?
Je viens de tester un couper/coller après un filtre, mais la copie prend toutes les lignes du tableau et pas uniquement les lignes filtrées...est ce normal ?
Voici mes nouvelles interrogations

Réponse
+0
moins plus
Bonjour, merci solcosmico pour cette fantastique macro qui repond a un besoin que j'avais egalement. Cependant en ce qui me concerne il y a une nuance et comme je connais trop peu le langage VB je me permets de poser la question:
il s'agit du meme modele de macro que du tien mais avec la difference suivante: dans mon tableau avec colonnes Nom Prenom Sexe Age, je mets "M" ou "F" sous sexe, mais c'est uniquement le Nom qui doit se copier dans un autre onglet (pas toute la ligne Nom Prenom Sexe Age). Il se peut que j'aie a poser d'autres questions similaires, si ca ne derange pas... merci d'avance en tout cas

Réponse
+0
moins plus
Bonjour tout le monde,

Voilà, je trouve la macro proposée très interéssante... J'ai un problème similaire à ce sujet, si cela ne vous dérange pas que je la pose ici-même, cela va peut-être pouvoir répondre également à d'autres problèmes posés.

dans mon tableau Excell, j'ai une feuille1 qui contient ceci :

Nom Entreprise Nbre d'Accident

Entrp1 5
Entrp2 1
Entrp3 3
Entrp1 1

Comme vous pouvez le voir, une entreprise peut se répeter plusiurs fois (ici Entrp1).

Je voudrais pouvoir faire en sorte de faire un récapitulatif dans une Feuille2 du nombre d'accident par entreprises, exemple :

Entrp1 6 (5+1)
Entrp2 1
Entrp3 3

Le vrai problème est qu'on puisse reperer que le nom d'une entreprise se répete, et copier seulement qu'une seule fois le nom de cette entreprise et calculer (somme) le nombres d'accident que cette entreprise à pu generer.

Merci beaucoup de votre aide, et encore désolé si je pertube le veritable sujet.

Réponse
+0
moins plus
Bonjour gbinforme,

La seule chose que je voudrais te dire c'est MERCI :)

Ca marche très très bien. Je ne sais quoi te dire d'autre, tu me sauve la vie, et je peux enfin avancer dans mon travail.

Avec ta permission je voudrai garder contact avec toi :)

Merci encore.

Réponse
+0
moins plus
Bonjour,

Tu peux aussi utiliser un tableau croisé dynamique
- Sélectionner ta zone de données avec les noms des champs
- menu 'données / Rapport de tableau croisé dynamique puis 'terminer' (plus tard tu pourras passer par 'suivant' pour voir d'autres possibilités)
- dans la liste des champs tu prends 'nom_entreprise' que tu déposes dans 'champs de lignes'
- dans la liste des champs tu prends 'nbre_accidents' que tu déposes dans zone de 'Données'

Par défaut c'est le total des valeurs mais ça pourrait être le nombre, la moyenne etc
Et si tu double-cliques sur un total ça t'extrait les lignes concernées dans une nouvelle feuille
Ce n'est qu'un aperçu de ce que tu peux faire avec les tableaux croisés dynamiques

eric

Réponse
+0
moins plus
PS : Sin devient Swindler, je me suis inscrit sur le forum :)

Merci Eric pour ta proposition, très interessante, je viens de la tester, seulement voilà (peut-être que j'utilise mal) :

Il me fait bien la somme, et ne copie pas 2 fois le même nom d'entreprise, jusque là tout va bien, mais dès que j'ajoute une nouvelle entreprise dans ma Feuille1, il ne la compte pas. Hors dans la formule précedente de " gbinforme" cela marche.

J'ai quand même essayé avant de creer le tableau, de selectionner une plus grande zones de données, mais là il met dans le tableau dynamique, un champ vide, et c'est tout...

Parcontre j'avous que le tabelau dynamique est interessant.

Pour encore mieu améliorer le sytème, j'essai de faire en sorte que maintenant, je n'ai plus besoin de noter le nombre d'accident par entreprise, puisque le fait d'ecrire le nom d'une entreprise équivaut à 1 accident. Exemple :

Entrp 1
Entrp 5
Entrp 7
Entrp 5
Entrp 2
Entrp 5

On ne rentrera seulemnt que les nom, et on obtiendra : Entrp 5 = 3 accident (vu que le nom se repete 3 fois) etc etc...

Justement ceci je n'arrive pas à le faire :(

Je suis vraiment désolé, je suis un vrai débutant qui essai d'apprendre...

Merci encore pour vos réponse et votre aide précieuse.


Swindler

Réponse
+0
moins plus
Pour la mise à jour:
-Sélectionne les colonnes (en cliquant-glissant sur les noms des colonnes sur fond gris A B C...) plutôt qu'une zone pour définir ton tableau croisé
- Dans le tableau croisé tu as une barre d'outils, clique sur ! rouge pour mettre à jour, ou clic-droit dans le tableau et 'actualiser les données'.

Pour compter au lieu d'additionner:
-dans le tableau croisé sélectionne un total
- dans la barre d'outil utilise l'outil 'parametres de champ' et choisi la fonction que tu veux (nombre ou nb)

eric

Réponse
+0
moins plus
Encore merci Eric,

Ca à marché, seulement je ne comprend pas pourquoi dans le tabelau dynamique, dans "champ de ligne" il me met bien le nom des entreprise et un champ (vide).

Sachant que je vais faire un graphique après, il risque de me copier (vide) également.

D'où peut bien sortir ce nom (vide) ??

Merci Eric

Réponse
+0
moins plus
Il veut comptabiliser les valeurs vides également. Sur le nom de ton champ dans le TCD tu as une liste déroulante pour choisir les valeurs affichées, décoche '(vide)'
eric

Réponse
+0
moins plus
Exact, je ne suis pas fufute là :(

Derniere question Eric, peut-on éviter de "rafréchir" à chaque modification ?? On ne peut pas mettre un timer de rafrachissement automatique ???

Merci :)

Réponse
+0
moins plus
Honnetement tu vas aller le voir à chaque saisie le TCD ?
Ca serait pas un truc de faineant ça faire une macro pour éviter un clic ? ;-)
Sinon oui tout est faisable... mais si tu veux faire met le plutôt dans l'evement 'change' que par un timer. Déjà il sera vraiment à jour à chaque consultation et c'est bcp plus simple à faire. Tu enregistres la macro en faisant le rafraichissement, tu l'adaptes un peu le code et tu le colles là`où ça va bien (evenement change de ta feuille)
eric

Réponse
+0
moins plus
Merci Eric :)

Ce n'est pas moi le féneant :)

Disons que ce fichier sera consulté et modifier assez régulièrement par la secretaire, donc j'essai de lui facilité la tache au maximum, mais j'avous qu'une petite formation sur le clic droit rafraichir serai à faire (rire).

Merci beaucoup de ton aide :)

Réponse
+0
moins plus
Déproteger une feuille en début de macro:
Sheets("Feuil2").Unprotect


Reproteger en fin de macro:
Sheets("Feuil2").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True


Rafraichir un TCD nommé "Tableau croisé dynamique4" à l'activation :
Private Sub Worksheet_Activate()
    ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotCache.Refresh
End Sub

A mettre dans l'evenement 'activate' de la feuille du TCD. Clic-droit sur son onglet et 'visualiser le code', coller les 3 lignes et corriger le nom du TCD si besoin

eric

Réponse
+0
moins plus
Bonjour Eric,

Merci encore pour ton message...

Dis moi, quand tu dis : Déproteger une feuille en début de macro. C'est pour "activer/désactiver" une macro ?
Parcontre je n'ai pas très bien compris où je dois mettre Sheets("Feuil2").Unprotect et Sheets("Feuil2").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

Pour ce qui est des 3 dernière ligne ca j'ai compris...

En fait je ne compreznd pas à quoi servent ces ligne et où les mettre éxactement...

Merci encore pour ta réponse.

:)

Ce document intitulé «  Excel VBA selection lignes avec condition  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.