MACRO rechercher la valeur max dans une colonne ? - VB/VBA/VBS - Programmation
Marsh Posté le 07-02-2007 à 18:06:55
Bonsoir,
Et là, quelle est la valeur max?
peux-tu nous les claser par ordre décroissant pour voir?
Cordialement
Marsh Posté le 08-02-2007 à 08:57:43
Bonjour,
la valeur max est 07-08-005A
ci-dessous la liste trié par ordre décroissant
ce sont des N° de devis 07 = annéée / 08 = mois du devis / 001 = N° du devis du mois /
lettre correspond à un sous devis d'une même demande
colonne A
07-08-005A
07-08-005
07-02-006B
07-02-006A
07-01-005
07-01-005
07-01-005
07-01-004A
07-01-004
merci de ton aide,
Marsh Posté le 08-02-2007 à 12:14:30
Bonjour,
en gros cela??
Sub Macro4()
ligmax = Cells(65000, 1).End(xlUp).Row
monmax = ""
For i = 1 To ligmax
If Cells(i, 1) > monmax Then
monmax = Cells(i, 1)
imax = i
End If
Next i
Cells(imax, 1).Select
End Sub
Marsh Posté le 08-02-2007 à 12:41:56
J'ai oublié de te dire que je suis novice en vba (je tatonne doucettement),
je viens de copier ta macro, mais quand je l'execute je bloc sur
Cells(imax, 1).Select
erreur d'éxecution
je dois certainement modifier certaines données dans la macro ?
D'avance merci,
Marsh Posté le 08-02-2007 à 13:58:52
Bonjour,
si c'est un ficher de test, peux-tu l'envoyer?
en passant par
http://www.cjoint.com/
Cordialement
Marsh Posté le 08-02-2007 à 15:45:29
Ci-dessous fichier,
http://cjoint.com/?cipRGHcZBL
a ta disposition pour ttes info complémentaire,
Merci bcp,
Marsh Posté le 08-02-2007 à 15:58:32
Bonsoir,
pourquoi as-tu mis "6" dans monmax?
Sub Macro5()
'
' Macro5 Macro
' Macro enregistrée le 08/02/2007 par pinheiro
'
'
ligmax = Cells(65000, 1).End(xlUp).Row
monmax = ""
For i = 2 To ligmax
If Cells(i, 1) > monmax Then
monmax = Cells(i, 1)
imax = i
End If
Next i
Cells(imax, 1).Select
End Sub
en supprimant le 6 cela ne plante pas chez moi.
@+
Marsh Posté le 08-02-2007 à 16:53:10
mea culpa
le 6 c'est moi sui l'ai mis par erreur
cela marche très bien (sauf que je suis obligé de retirer mon entête de colonne en a1=N°devis, car la macro sélectionne à chaque fois la cellule A1)
encore merci,
Marsh Posté le 08-02-2007 à 16:59:16
non, le for i=2 to ligmax permet de sauter la première ligne
Marsh Posté le 08-02-2007 à 17:48:26
RE MEA CULPA,
FORMIDABLE CA FONCTIONNE
je n'avais pas réalisé les tests sur ta dernière version
par contre, pour comprendre :
ligmax = Cells(65000, 1).End(xlUp).Row (cherche le max à partir de la dernière ligne)
monmax = "" (max de valeur texte)
For i = 2 To ligmax ( à partir de la ligne 2)
If Cells(i, 1) > monmax Then ( ? )
monmax = Cells(i, 1) (adresse de la cellule max)
imax = i (?)
End If
Next i
Cells(imax, 1).Select (sélectionne la cellule valeur max)
End Sub
merci de compléter ou corriger si tu as du temps à me consacrer (c'est pour mieux comprendre Vba)
tu vas peut être dire que j'abuse, mais je suis sur une autre macro :
With Range(IIf([A1] = Range("W1" ), [A1], [A:A].Find(Range("W1" ), [A1])), "B65536" )
Range(.Item(1), .ColumnDifferences(.Item(1))(0)).Select
End With
End Sub
elle fonctionne mais pas vraiment comme je veux
je souhaiterai trouver (toujours pour le même fichier) :
un N° devis bien précis dans la colonne A (car cette macro sélectionne les valeurs commençant par...)
sélectionner uniquement les 7 derniéres lignes contenant cette valeur
les couper et supprimer(pour ne pas laisser de lignes vides dans la base)
pour les coller sur une autre feuille
A ta dispo pour tout complément d'info,
Marsh Posté le 08-02-2007 à 18:01:42
ligmax = Cells(65000, 1).End(xlUp).Row (cherche la dernière ligne non vide à partir du bas de la colonne)
monmax = "" (rempli à null au départ contiendra le max de valeur texte)
For i = 2 To ligmax ( à partir de la ligne 2)
If Cells(i, 1) > monmax Then ( cells(i,1).value pour être plus correct donne le contenu de la cellule placée en ligne i et colonne 1 ? )
monmax = Cells(i, 1) (si cells(i,1).value est supérieur à la valeur se trouvant dans monmax, alors c'est provisoirement la plus grande, je la range dans monmax et conserve le numéro de la ligne dans imax)
imax = i (voir la réponse ligne au dessus)
End If
Next i
Cells(imax, 1).Select (sélectionne la cellule en ligne imax colonne 1)
End Sub
Marsh Posté le 08-02-2007 à 19:12:15
Bonsoir,
pas bien compris ce que tu veux faire de ta macro?
sélectionner les sept lignes consécutives?
sélectionner toutes les lignes dispersées dont la colonne 1 est identique?
Marsh Posté le 08-02-2007 à 20:04:59
pour être plus claire, je cherche une macro qui :
- sélectionne toutes les lignes contenant dans la colonne A le N° devis rechercher (type 07-01-002A)
- couper (et supprimer pour ne pas laisser des lignes vides) et coller ces lignes sur la feuille 2
j'espère être plus claire,
Marsh Posté le 08-02-2007 à 22:15:32
tes lignes sont-elles les unes derriére les autres de façon continue?
le type 07-01-002A inclue-t-il 07-01-002 07-01-002b etc?
Marsh Posté le 08-02-2007 à 23:50:31
oui, les lignes contenant une valeur identique se suivent (mais la liste n'est pas dans un ordre précis coiss ou décroiss).
la macro doit identifier et sélectionner les cellules contenant exactement la même valeur (equiv) 07-01-002A étant une valeur et 07-01-002 en étant une autre
Marsh Posté le 08-02-2007 à 23:54:08
en quoi le filtre ne te convient pas ?
c'est pour mieux comprendre ce dont tu as besoin
Marsh Posté le 09-02-2007 à 07:56:01
Bonjour,
premier "jet" à étudier:
monarticle = "06-12-007"
Range("a1" ).AutoFilter Field:=1, Criteria1:=monarticle
Range(Cells(2, 1), Cells(65527, 1).End(xlUp)).Select
Selection.EntireRow.Select
'ici copy dans autre fichier
Selection.Delete
ActiveSheet.ShowAllData
les coller dans une autre feuille du même classeur?
Cordialement
Marsh Posté le 09-02-2007 à 10:05:56
j'ai testé la macro fonctionne, COOOOOL
la valeur cherchée se trouve sur autre classeur (clas1), mais parcontre les lignes sélectionnées dans le clas2 doivent être collés sur une autre de feuille de ce clas 2 (infos collés à la suite-dans dernière ligne vide).
Windows("Classeur1" ).Activate
monarticle = Range("G1" )
Windows("Classeur2" ).Activate
Range("a1" ).AutoFilter Field:=1, Criteria1:=monarticle
Range(Cells(2, 1), Cells(65527, 1).End(xlUp)).Select
Selection.EntireRow.Select
'ici copy dans autre fichier
Selection.Delete
ActiveSheet.ShowAllData
End Sub
Par contre serait-il possible de sélectionner les 7 1ère lignes filtrées uniquement, je m'explique :
1 devis = 7 lignes maxi (car 7 produit par devis)
Clas1 est ma matrice pour renseigner les devis (j'ai déjà réalisé une macro qui copie les données sur clas2 feuil 1 dernière cellule vide)
Clas2 feuille 1 est ma base active de mes devis (dernière mis à jour)
Clas2 feuille 2 est mon historique des modifications
Marsh Posté le 09-02-2007 à 15:02:08
Bonjour,
comme d'habitude, à aménager, à tester etc...
Application.DisplayAlerts = False
ligneinser = Sheets("feuil2" ).Cells(65527, 1).End(xlUp).Row + 1
monarticle = "06-12-005"
Range("a1" ).AutoFilter Field:=1, Criteria1:=monarticle
Range(Cells(2, 1), Cells(65527, 1).End(xlUp)).Select
Selection.EntireRow.Copy
ActiveSheet.Paste Destination:=Sheets("feuil2" ).Cells(ligneinser, 1)
Selection.Delete
ActiveSheet.ShowAllData
Application.DisplayAlerts = True
Cordialement
Marsh Posté le 09-02-2007 à 16:18:04
bonsoir, ingenieurcesi,
c'est bien un filtre, mais en macro puisque lasapinière le demande en macro
Marsh Posté le 09-02-2007 à 16:27:07
formidable, cela marche,
Sauf, je sais j'abuse peu être, serait-il possible de copier uniquement les 7 premières lignes filtrées (qui sont en principe mon devis avant modification) et les lignes restantes (les 7 dernières en principe le devis mis à jour)
a ta dispo,
Marsh Posté le 09-02-2007 à 16:36:08
bonjour lasapiniere,
pour information,
je sais pas si tu connais mais tu peux utiliser l'enregistrement de macro
en lancant l'enregistrement et en faisant à la suite le filtre tu aurais obtenu une partie du code
seniorpapou il sert a quoi ton display alert, tu voulais pas plutot mettre "la mise à jour de l'ecran" ( ce que tu m'avais montré la dernière fois pour améliorer le sudoku ) ?
Marsh Posté le 09-02-2007 à 16:45:15
lasapiniere a écrit : formidable, cela marche, |
Application.DisplayAlerts = False
ligneinser = Sheets("feuil1" ).Cells(65527, 1).End(xlUp).Row + 1
Range(Cells(ligneinser-2, 1), Cells(ligneinser, 1).End(xlUp)).Select
Selection.EntireRow.Copy
ActiveSheet.Paste Destination:=Sheets("feuil2" ).Cells(2, 1)
monarticle = "06-12-005"
Range("a1" ).AutoFilter Field:=1, Criteria1:=monarticle
Range(Cells(2, 1), Cells(65527, 1).End(xlUp)).Select
Selection.EntireRow.Copy
ActiveSheet.Paste Destination:=Sheets("feuil2" ).Cells(9, 1)
Selection.Delete
ActiveSheet.ShowAllData
Application.DisplayAlerts = True
ca devrait marche
tes données sont bien sur la feuil1 , tu copie les 7 dernières et tu copie celles obtenues par l'enregistrement ?
Marsh Posté le 09-02-2007 à 16:46:15
avant ca
Range("a1" ).AutoFilter Field:=1, Criteria1:=monarticle
rajoute sheets("feuil1" ).select
Marsh Posté le 09-02-2007 à 17:05:13
Bonsoir,
pour ingenieurcesi le :
Citation : Application.DisplayAlerts = False |
pour éviter d'avoir à répondre à un message de confirmation au moment du delete
Citation : ligneinser = Sheets("feuil1" ).Cells(65527, 1).End(xlUp).Row + 1 |
ne serait-ce pas:
ligneinser = Sheets("feuil1" ).Cells(65527, 1).End(xlUp).Row
Range(Cells(ligneinser-6, 1), Cells(ligneinser, 1).End(xlUp)).Select
@+
Marsh Posté le 09-02-2007 à 17:33:26
et meme ligneinser-7 pour avoir les 7 dernières
par contre ton selection.delete supprime les valeurs selectionnées. je n'ai vu nulle part qu'il voulait les supprimer.
Marsh Posté le 09-02-2007 à 18:01:58
voir son post le 8/2/07 à 20h 04.59
meme ligneinser-7 pour avoir les 7 dernières : oui si tu gardes row+1
mais j'ai retiré le +1
Marsh Posté le 13-02-2007 à 13:06:30
bonjour,
désolé, j'étais absent quelques temps
j'ai essayé la macro ci-dessous, mais malheureusement cela ne fonctionne pas.
elle ne copie pas les bonnes lignes, sur la feuille 2 ni les supprime de la feuille 1
Windows("Classeur1" ).Activate
monarticle = Range("G1" )
Windows("test macro" ).Activate
Application.DisplayAlerts = False
ligneinser = Sheets("feuil1" ).Cells(65527, 1).End(xlUp).Row
Range(Cells(ligneinser - 6, 1), Cells(ligneinser, 1).End(xlUp)).Select
Selection.EntireRow.Copy
ActiveSheet.Paste Destination:=Sheets("feuil2" ).Cells(2, 1)
monarticle = Range("G1" )
Sheets("feuil1" ).Select
Range("a1" ).AutoFilter Field:=1, Criteria1:=monarticle
Range(Cells(2, 1), Cells(65527, 1).End(xlUp)).Select
Selection.EntireRow.Copy
ActiveSheet.Paste Destination:=Sheets("feuil2" ).Cells(9, 1)
Selection.Delete
ActiveSheet.ShowAllData
Application.DisplayAlerts = True
End Sub
un exemple (avec le devis 07-01-003) pour essayer d'être plus claire en ce qui concerne ma demande.
clas 1 = basse de donnée avec mon N° de devis en G1
clas 2 = archives modif / avec feuil 1 et feuil 2
feuil 1 : dernière maj devis / feuil 2 : historique modifs
j'ai réalisé une macro qui : copie les infos du clas 1 dans clas 2 feuil 1 (à partir de la dernière ligne vide), ce qui fait :
clas2 feuil 1
devis
07-01-002 (x7lignes)
07-01-003 (x7lignes)
07-01-004 (x7lignes)
07-01-003 (x7 lignes) infos collées par le biais de ma macro
la macro que l'on cherche doit donner le résultat suivant :
clas2 feuil 1 clas 2 feuil 2
devis devis
07-01-002 (x7lignes) 07-01-003 (x7lignes)
07-01-004 (x7lignes)
07-01-003 (x7 lignes)
pour le numéro de devis traité, elle recherche dans
- clas2feuil1 les lignes contenant le n° de devis (filtre) (soit 14 lignes)
- copie / supprime et colle (dans la prmière ligne vide) les 7 premières lignes contenant le N°devis (pas ligne entête bien sur) dans clas2feuil2
a votre disposition,
Marsh Posté le 07-02-2007 à 17:59:38
Bonjour à tous,
Je cherche une macro qui sélectionne la cellule contenant la valeur max, sachant que les valeurs des cellules sont de ce type :
colonne A
07-01-005
07-01-005
07-01-005
07-02-006A
07-02-006B
07-08-005
07-08-005
07-01-004
07-01-004A
.........
merci de votre aide,