|
Publicité | ||||||||||||||||||||||
|
|
#1 |
|
Membre à l'essai
![]() Date d'inscription: septembre 2008
Messages: 45
|
Bonjour voici ce que je fais :
Code :
sub blabla (param) for j=1 to sheet.count effectue une recherche pour trouver un élément qui peut-être dans n'importe quelle feuille, si tu trouve, exit function next j Mon problème, que je n'avais pas remarqué, c'est que quand l'élément n'existe pas dans aucune des feuilles, ben j prends les valeurs suivantes : 1,2,3,1,2,3,1,2,3,1,2,3... Pour l'instant, je bosse sur 3 mois, donc 3 feuilles. Donc je ne comprends pas pourquoi à la fin cela ne s'arrête pas . Help, i need somebody, Help ! |
|
|
|
|
|
#2 | |
|
Membre actif
![]() Date d'inscription: octobre 2007
Localisation: 29
Messages: 176
|
Bonjour
tout d'abord, sheet.count????? plutôt : Code :
Sheets.Count
et ensuite, pour pouvoir t'aider, merci de remplacer : Citation:
|
|
|
|
|
|
|
#3 |
|
Membre à l'essai
![]() Date d'inscription: septembre 2008
Messages: 45
|
Code :
ident = moncritère For j = 1 To Sheets.Count Sheets(j).Activate Cells(1, 3).Select: Selection.End(xlDown).Select '3 car c'est la seule colonne qui sera tjrs pleine nbLigne = Selection.Row For i = 2 To nbLigne If Cells(i, 1).Value = ident ActiveWorkbook.Sheets(j).Rows(i). rechercheById.nbLigne = nbLigne Exit Function End If Next i Next j |
|
|
|
|
|
#4 |
|
Membre actif
![]() Date d'inscription: octobre 2007
Localisation: 29
Messages: 176
|
Bonjour,
je n'ai pas compris le traitement à effectuer si tu trouves la correspondance, mais tu peux effectuer la recherche ainsi : Code :
ident = moncritère For j = 1 To Sheets.Count With Sheets(j) Set c = .Columns(3).Find(ident) If Not c Is Nothing Then 'ton code Exit Function End If End With Next j |
|
|
|
|
|
#5 |
|
Membre à l'essai
![]() Date d'inscription: septembre 2008
Messages: 45
|
Je supprime la ligne quand je trouve. Le .delete a été malencontreusement supprimé.
Mais ça n'ira pas ton bout de code. Jvais refléchir à ton bout de code, j'ai pas l'habitude d'utiliser find... D'habitude, je regarde en xldown, et je tes un à un. Niveau traitement, lequel est le plus rapide ? |
|
|
|
|
|
#6 | |
|
Membre actif
![]() Date d'inscription: octobre 2007
Localisation: 29
Messages: 176
|
Re-,
j'adore ces certitudes, sans même avoir testé.... Citation:
Risques-tu de rencontrer plusieurs fois ton critère de recherche dans la même feuille? |
|
|
|
|
|
|
#7 |
|
Expert Confirmé
![]() Date d'inscription: juillet 2008
Localisation: Elsass
Âge: 24
Messages: 1 887
|
Effectivement le find est bien plus rapide (j'avais fait quelque test qui allai tous en ce sens)
De plus l'exemple de l'aide est particulièrement simple a d'adapter au recherche multiple et autre. Pour ce qui est du code donné par qwerty en 3ème poste j'ai quelque truc a redire, problème d'algorithmique (quand on supprime les ligne on doit parcourir la feuille a l'envers ou modifier la variable de la boucle mais c'est pas top), utilisations des select. Pour avoir le nombre de ligne des méthodes fiables et complète et rapide http://www.developpez.net/forums/d45...gnees-feuille/ Je te conseille vraiment le code de mapeh il sera plus rapide et plus propre. C'est sur que le code tel quel n'ira pas c'est a toi de remplacer 'ton code ben par ton code |
|
|
|
|
|
#8 |
|
Membre actif
![]() Date d'inscription: octobre 2007
Localisation: 29
Messages: 176
|
Re-,
Salut, Krovax... Euh, en me relisant, je viens de m'apercevoir d'une belle connerie.... ça m'étonnerait qu'une Fonction te supprime une ligne, quelle qu'elle soit... Il faut obligatoirement passer par une Sub.... Donc tu peux supprimer Exit Function....(à la rigueur, Remplacée par Exit Sub) Pfffft.... |
|
|
|
|
|
#9 |
|
Expert Confirmé
![]() Date d'inscription: juillet 2008
Localisation: Elsass
Âge: 24
Messages: 1 887
|
A la rigueur l'enlever complètement s'il veut faire la recherche dans chaque feuille
Ca donnerais quelque chose comme ca (a tester) Code :
dim c as range dim j as integer dim indent as string ident = "moncritère" ' a toi de le définir ce doit être une chaine de caractère For j = 1 To Sheets.Count With Sheets(j) Set c = .Columns(3).Find(ident) If Not c Is Nothing Then Do c.entirerow.delete Set c = .Columns(3).Find(ident) Loop While Not c Is Nothing End If End With Next j |
|
|
|
|
|
#10 | |
|
Membre à l'essai
![]() Date d'inscription: septembre 2008
Messages: 45
|
Citation:
Je bosse sur un macro de 3000 lignes (séparée en modules) où il n'y pas un seul find :p Faudrais que je retouche tout ça. sinon, l'identifiant est unique, donc je le rencontre qu'une seule fois obligatoirement. Impossible d'en avoir en double. Et désolé pour le .delete disparu mon plus gros problème, c'était que ma boucle for j=0 to sheets.count était infinie, sans que je sache pourquoi en fait. |
|
|
|
|
|
|
#11 |
|
Expert Confirmé
![]() Date d'inscription: juillet 2008
Localisation: Elsass
Âge: 24
Messages: 1 887
|
si l'identifiant est unique dans le test if
Code :
If Not c Is Nothing Then c.entirerow.delete exit sub 'ou exit function End If Et honnètement faire 3000ligne de code sans find alors que l'on recherche des valeur (et avec des select) y en a qui on des PC d'est des bête de course (ou alors ils ne s'ont pas pressé Que vaux sheets.count? Tu es sur que c'est infinie et pas seulement long car a moins de modifier j dans la boucle ce que tu n'as pas lair de faire un for n'est pas infinie C'est le do qui donne dans l'infinie Dernière modification par Krovax ; 30/06/2009 à 15h31. |
|
|
|
|
|
#12 |
|
Membre à l'essai
![]() Date d'inscription: septembre 2008
Messages: 45
|
La macro sans find, c'est pas moins qui l'ai codé, je reprend le boulot de qq
![]() Il a pas du faire bcp de recherche sur la rapidité du code je pense. Sa macro, première fois que je l'ai lancé sur le Pc sur lequel je bosse, ça m'a pris 20 minutes de traitement. 20 vraies minutes. Alors que bon, il y a beaucoup de traitement, ok, mais les tableaux à gérer les plus grand font dans le 600 lignes quoi ... enfin ça fait peur sur le coup. Donc je suis en train de me taper tout à modifier pour n'avoir que des find. Je vais tester la boucle maudite sur un autre fichier. Sinon, j'essayerais un truc du style Code :
For each Sheet in Workbooks("NomFichier.xls").Sheets Dernière modification par Qwerty111 ; 30/06/2009 à 16h06. |
|
|
|
|
|
![]() |
||
[XL-2003] Pb défilement feuille
|
||
| Outils de la discussion | |
|
|