Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 11/03/2010, 10h41   #1
Nouveau Membre du Club
 
Inscription : octobre 2009
Messages : 75
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 75
Points : 25
Points : 25
Par défaut Date dans textbox

Bonjour,
je souhaite en fonction de la date saisie dans mon textbox, supprimer toutes les lignes qui ont en colonne A une date supérieure à la date dans mon textbox

voici le début de mon code, suis-je sur la bonne voie? je pense me tromper sur le format de la date


Code :
1
2
3
For Each Cellule In Range("a5:a" & Cells(Columns(1).Cells.Count, 1).End(xlUp).Row)
        If Cellule.value >=  Userform2!TextBox1 Then ActiveCell.EntireRow.Delete
    Next Cellule
merci de votre aide

Dernière modification par luko6 ; 11/03/2010 à 10h56.
luko6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 12h26   #2
Nouveau Membre du Club
 
Inscription : octobre 2009
Messages : 75
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 75
Points : 25
Points : 25
j'ai un peu avancé
voici mon code

Code :
1
2
3
For Each Cellule In Range("a5:a" & Cells(Columns(1).Cells.Count, 1).End(xlUp).Row)
        If Cellule.Value = CDate(UserForm2!TextBox1.Value) Then ActiveCell.EntireRow.Delete
    Next Cellule
mais c'est pas encore satisfaisant
il repere pas la valeur de la text box
pouvez vous m'aider?
luko6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 13h08   #3
Membre Expert
 
Inscription : juillet 2007
Messages : 2 134
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 2 134
Points : 2 154
Points : 2 154
Salut luko6 et le forum
Code :
1
2
3
For Each Cellule In Range("a5:a" & Cells(Columns(1).Cells.Count, 1).End(xlUp).Row)
        If Cellule.Value = CDate(UserForm2!TextBox1.Value) Then ActiveCell.EntireRow.Delete
    Next Cellule
Pour chaque cellule de la plage
si Cellule = conversion en date de TextBox1 alors
Supprimer la ligne entière de la cellule active... qui peut être n'importe laquelle, même la cellule IV65536
Code :
1
2
3
For Each Cellule In Range([A5], Cells(Rows.Count, "A").End(xlUp))
        If CDate(CLng(Cellule)) = CDate(UserForm2!TextBox1) Then Rows(Cellule.row).Delete
    Next Cellule
Attention, je n'ai pas testé
- Je n'aime pas employer des noms qu'Excel peut utiliser (comme Cellule) sous risque de créer une erreur.
- Columns(1).cells.count donne le nombre possible de cellules de la colonne A, qui est le même que le nombre de lignes que la feuille.
- Tu t'affranchis du Select/Selection, ce qui est super. Mais n'oublie pas que ta sélection n'a plus rien à voir avec la cellule sur laquelle tu est en train de travailler => ça peut conduire à supprimer n'importe quelle ligne dès que tu trouves une correspondance.

Ne connaissant pas tes données, juste une supposition.
Dans ta TextBox tu mets une date => Cdate transforme ton texte en une date : un nombre entier qu'il interprète comme une date.
Dans ta colonne A, il faut donc que les dates soient des nombres entiers. il y a toujours une infinité de possibilité, j'en ai choisi une.
A+
Gorfael est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 14h36   #4
Nouveau Membre du Club
 
Inscription : octobre 2009
Messages : 75
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 75
Points : 25
Points : 25
merci pour ta réponse.

ma colonne A est deja sous forme de date
donc mon code est le suivant :

Code :
1
2
3
For Each Cellule In Range([A5], Cells(Rows.Count, "A").End(xlUp))
        If (Cellule) = CDate(UserForm2!TextBox1) Then Rows(Cellule.Row).Delete
    Next Cellule
ça a l'air de marcher sauf que mon code s'arrete en cours alors qu'il reste des dates
je dois relancer le code PLUSIEURS fois pour les supprimer totalement.
comment cela se fait?

aussi je voudrais supprimer toutes les lignes dont la date est apres la date de mon textbox et non "=" comme actuellement
luko6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 15h46   #5
Inactif
 
Inscription : février 2010
Messages : 517
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 517
Points : 513
Points : 513
Salut,

le plus simple et le plus rapide reste probablement de constituer une plage des lignes qu'il convient de supprimer et de ne le faire qu a la fin. Utiliser pour cela Application.Union.- Cette maniere de faire evitera les crocs en pattes generalement generes par le suppressions au fur et a mesure.
babaothe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 16h26   #6
Nouveau Membre du Club
 
Inscription : octobre 2009
Messages : 75
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 75
Points : 25
Points : 25
le probleme c'est que ma plage de données est variable
c'est pourquoi je passe par un textbox ou je peux saisir la date que je souhaite
luko6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 16h26   #7
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 452
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 452
Points : 12 780
Points : 12 780
Bonjour,
pour les suppressions de lignes, il faut commencer par la fin et remonter
Code :
1
2
3
4
Dim i As Long
For i = Cells(Rows.Count, "A").End(xlUp).Row To 5 Step -1
    If DateDiff("d", Range("A" & i).Value, CDate(UserForm2!TextBox1)) > 0 Then Rows(i).Delete
Next i
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 17h38   #8
Inactif
 
Inscription : février 2010
Messages : 517
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 517
Points : 513
Points : 513
Citation:
Envoyé par luko6 Voir le message
le probleme c'est que ma plage de données est variable
c'est pourquoi je passe par un textbox ou je peux saisir la date que je souhaite
Que tu passes ou non par une textbox ne change rien au principe .

tu peux toujours faire ceci (exemple):

Code :
1
2
3
4
5
6
7
8
9
10
11
12
dim suppression as range
for each c in range("C1:C!00")
   If ....ta_condition then
       if suppression is nothing then
           set suppression = c.Row
       else
           set suppression = union.suppression(suppression, c.row)
       end if
   end if
next
suppression.entirerow.delete
set suppression = nothing
ce code te paraitra plus long, mais il sera plus rapide si tu as un grand nombre d'elements a traiter
babaothe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 17h57   #9
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 201
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 201
Points : 4 204
Points : 4 204
Bonjour,

il vaut mieux toujours chercher à éviter de parcourir des collections vu que c'est "ressourcivor", vois si ceci convient (le textbox n'est pas filtré !) :

Code :
1
2
3
4
5
Private Sub CommandButton1_Click()
Dim dtmDatecible As Date
dtmDatecible = CDate(TextBox1.Value)
Call DestroyViaFitreAutoDatesurDVP(dtmDatecible)
End Sub
dans un module standard :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub DestroyViaFitreAutoDatesurDVP(dtmDatecible)
Dim lngNoCol As Long
Dim strFormatbase As String
Dim vntCrit1 As String
Dim objBase As Range
Dim objGomme As Range
 
lngNoCol = 1
vntCrit1 = ">=" & CDec(dtmDatecible)
Set objBase = ActiveSheet.Range(Cells(Rows.Count, lngNoCol).End(xlUp), Cells(1, lngNoCol))
Cells(1, lngNoCol).Select
strFormatbase = Cells(2, 1).NumberFormat
Columns(lngNoCol).NumberFormat = "General"
objBase.AutoFilter Field:=lngNoCol, Criteria1:=vntCrit1
Set objGomme = ActiveSheet.AutoFilter.Range ' voir l'exemple avec tbl dans l'aide à Resize si besoin.
objGomme.Offset(1, 0).Resize(objGomme.Rows.Count - 1, objGomme.Columns.Count).EntireRow.Delete
 Selection.AutoFilter
objBase.NumberFormat = "m/d/yyyy" 'on peut redimentionnner aussi
' penser à libérer les objets selon contexte
End Sub
voir, pour le traitement du filtre auto, si besoin : ce fil

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2010, 15h50   #10
Nouveau Membre du Club
 
Inscription : octobre 2009
Messages : 75
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 75
Points : 25
Points : 25
c'est parfait!
j'ai utilisé la solution d'Ormonth et cela fonctionne tres bien et tres rapidement
je vous remercie tous et particuliérement Ormonth.
Bonne fin de journée
Cordialement
luko6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 17h58.


 
 
 
 
Partenaires

Hébergement Web