Sélection en langage VBA [Résolu/Fermé]

Signaler
Messages postés
63
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
28 avril 2020
-
Messages postés
23408
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
2 juin 2020
-
Bonjour,

Je souhaiterais effectuer la chose suivante en langage VBA:
sélectionner des cellules jusqu'à la derniere ligne de mon tableau.

Problèmes:
-je veux sélectionner des cellules dans les colonnes B, E et G. Les colonnes ne sont donc pas collées les unes aux autres.

-la dernière ligne non vide de mon tableau est variable. Parfois j'ai 20 lignes et parfois 50. j'aimerais que la détection soit automatique.

Je n'ai aucune formation en VBA mais je dois faire ça pour mon entreprise et dois surtout être capable d'expliquer le tout à mon tuteur. Si vous avez des éléments de réponse j'aimerais aussi quelques infos sur les fonctions utilisées.

Merci d'avance pour votre aide.

Megatronnbjja


5 réponses

Messages postés
73
Date d'inscription
lundi 29 avril 2013
Statut
Membre
Dernière intervention
21 janvier 2015

Tu veux sélectionner tout ça en VBA ? Pour ça on utiliserait plus du SQL, en tout cas je n'ai aucune idée de comment en langage VBA uniquement on pourrait sélectionner tout cela.
En SQL ça donnerai :" Select B, E, G FROM **Nomdetatable**;"
Messages postés
15221
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
13 mai 2020
1 292
Bonjour,
exemple avec enregistreur de macro
Sub Macro1()
'
' Macro1 Macro
' enregistreur de macro: selection plages de cellules
Range("J3:J14,L3:L14,N3:N14").Select
End Sub

votre macro:

Sub test()
'ligne derniere cellule non vide feuille1,colonne B
derlig = Worksheets("feuil1").Range("B" & Rows.Count).End(xlUp).Row
'selection des cellules B1 a Bderlig,D1 a Dderlig,G1 a Gderlig
Worksheets("feuil1").Range("B1:B" & derlig & ",E1:E" & derlig & ",G1:G" & derlig).Select
End Sub

Bonne suite
Messages postés
63
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
28 avril 2020

Bonjour,

merci pour ta réponse, ça me sort du petrin.
Je me pose toutefois deux questions:

1/ derlig = Worksheets("feuil1").Range("B" & Rows.Count).End(xlUp).Row
pourquoi xlUp alors que l'on souhaite avoir la dernière ligne (j'aurais pensé a xlDown) et à quoi sert le .Row ?

2/ j'avais écrit pour une autre application la ligne suivante:
Range("$A$2", Range("$AC$2").End(xlDown)) avec dernière ligne:10
Ceci me permet bien de sélectionner la plage (A2:AB10) ?

merci d'avance,

Megatronnbjjja
Messages postés
15221
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
13 mai 2020
1 292
Re,

ecrivez avec (j'aurais pensé a xlDown) vous verrez le resultat.
Messages postés
63
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
28 avril 2020

re

avec xlDown j'ai un message d'erreur. Mais j'essai de comprendre comment fonctionne cette syntaxe.
Avez-vous la réponse pour ma deuxième question?
Messages postés
15221
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
13 mai 2020
1 292
Bonjour,

faudrait la ligne de code complete pour votre deuxieme question!! Chez moi la selection est: A2:AC le fond du panier (derniere ligne pour execl 2007) ce qui pour moi tout a fait normal.
Messages postés
63
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
28 avril 2020

Alors je ne connais pas du tout le SQL. Où suis-je censé écrire ce type de langage?
Merci de ta réponse en tout cas.
Messages postés
23408
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
2 juin 2020
6 182
Bonjour,

1/ derlig = Worksheets("feuil1").Range("B" & Rows.Count).End(xlUp).Row
pourquoi xlUp alors que l'on souhaite avoir la dernière ligne (j'aurais pensé a xlDown) et à quoi sert le .Row ?

Ici tu pars de la dernière ligne de la feuille (rows.count=nombre de lignes de la feuille) et tu remontes pour trouver la dernière ligne occupée.
Toi, avec xldown, tu pars de A2 et tu cherches la dernière ligne occupée de la zone en cours.
Si tu as 20 lignes avec la ligne 10 vide tu seras sur la ligne 9. Si tu es sûr qu'il n'y a pas de vides c'est bon.
Avec la 1ère syntaxe tu seras sur la ligne 20, la dernière occupée réelle même s'il y a des vides.

.row te donne le n° de ligne du range.
F1 sur une fonction te donne l'aide excel qui est très bien faite

eric

Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
Messages postés
63
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
28 avril 2020

Bonjour,

J'ai bien compris ce que fait cette macro (même si je n'ai pas compris les fonction InStr et Lcase....l'aide excel parle de chaine, start, etc mais pour moi c'est du chinois)

J'ai essayé cette macro avec les valeurs de mon tableau, ça fonctionne bien. Mais pour être sur, le critère est bien CONTIENT "a" et CONTIENT "b"? Pas besoin de rajouter le symbole * ?

Enfin, lorsque je rajoute un
And InStr(LCase(Cells(lig, "A")), "c") = 0

la macro ne fonctionne plus, des lignes valides sont quand même masquées. Verrais-tu d'où vient le problème?

Megatronnbjja
Messages postés
23408
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
2 juin 2020
6 182
Re,

J'ai bien compris ce que fait cette macro (même si je n'ai pas compris les fonction InStr et Lcase....l'aide excel parle de chaine, start, etc mais pour moi c'est du chinois)
Lis et relis plus lentement.

la macro ne fonctionne plus, des lignes valides sont quand même masquées. Verrais-tu d'où vient le problème?
Oui j'ai ma petite idée, mais pas envie de reconstruire un fichier de test.
Merci de déposer un fichier de travail lorsque que tu as une question.
Déposer le fichier xls sur cjoint.com et coller ici le lien fourni.

Et lorsque que celle-ci sera finie merci de mettre en résolu et de démarrer des nouvelles questions pour les suivantes.

eric
Messages postés
63
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
28 avril 2020

Je pense qu'il sera plus simple de te donner toute ma macro:

Sub demande_rapports_qualité()

Sheets("demande de rapports").Activate
Cells.Clear

Sheets("suivi cdes fournisseurs").Activate  'Active la feuille suivi de commandes
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData  'Affiche toutes les lignes du tableau

     Dim derlig As Long
     Dim dercol As Integer
     Dim tableau As Variant
 
         derlig = Range("F" & Rows.Count).End(xlUp).Row  'cherche la dernière ligne du tableau dans la colonne F
         dercol = Cells(5, Cells.Columns.Count).End(xlToLeft).Column  'Cherche la dernière colonne du tableau dans la ligne 5
         
 
       Dim lig As Long
                       For lig = 5 To derlig
                       If InStr(LCase(Cells(lig, "A")), "Manuel") = 0 And InStr(LCase(Cells(lig, "A")), "Yiwei") = 0 And InStr(LCase(Cells(lig, "A")), "Nicolas") = 0 And InStr(LCase(Cells(lig, "A")), "Mengchun") = 0 Then Rows(lig).EntireRow.Hidden = False Else Rows(lig).EntireRow.Hidden = True
                       Next lig
                       
 Set tableau = Range([A2], Cells(derlig, dercol)).SpecialCells(xlCellTypeVisible)  'permet de sélectionner le tableau
         
 tableau.AutoFilter Field:=19, Criteria1:="<>"  'filtre les lignes avec date accusée
 tableau.AutoFilter Field:=29, Criteria1:="<=14"  'filtre les ligne avec délai avant livraison de maximum 14 jours
 
     Dim derlig2 As Long
     Dim tableau2 As Variant
 
         derlig2 = Range("F" & Rows.Count).End(xlUp).Row  'cherche la dernière ligne du tableau filtré dans la colonne F
         Set tableau2 = Range([A2], Cells(derlig2, dercol)).SpecialCells(xlCellTypeVisible)  'permet de sélectionner le tableau filtré


With Sheets("suivi cdes fournisseurs")

    tableau2.SpecialCells(xlCellTypeVisible).Copy _
    Sheets("demande de rapports").Range("A10") 'copie puis colle les lignes filtrées
 
End With

Sheets("suivi cdes fournisseurs").Activate  'Active la feuille suivi de commandes
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData  'Affiche toutes les lignes du tableau


 
Sheets("demande de rapports").Activate
End Sub



ça ne fonctionne pas au niveau du filtre "multi-critère". Le tableau obtenu contient des lignes avec en colonne A : "Manuel Nicolas Mengchun et Yiwei".....

Merci encore
Messages postés
23408
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
2 juin 2020
6 182
tu penses mal
Messages postés
63
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
28 avril 2020

désolé, mauvais timing dans l'envoi du commentaire.

Voici le lien vers le document test:

https://www.cjoint.com/?0EqmcN6Bxu1

Et oui, dès que la question est réglée je mets en résolu.
En tout cas merci beaucoup pour ton temps.
Messages postés
23408
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
2 juin 2020
6 182
Ta demande était :
alors si par exemple je veux filtrer la plage (A1:A10) avec comme critère: ne contient ni "a" ni "b" ni "c",
C'est fichier qui correspond à ta demande et qui permet tous les test de tous les cas de figure que je voulais.
Pas un torchon avec une seule cellule de remplie avec "JF" sur A1:A10.
Ca j'arrive à le faire en 0.2s...

Ras le bol des demandeurs qui ne fournissent pas un fichier minimum pour travailler sur leur question.
J'abandonne, la question de départ étant résolue tu peux mettre en résolu.

eric