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 30/06/2009, 10h29   #1
Membre à l'essai
 
Date d'inscription: septembre 2008
Messages: 45
Par défaut Pb défilement feuille

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
En fait, chaque sheet est un mois de 2009, et dans chaque, il y a des éléments, chacun possédant un identificateur unique. Je fais une recherche sur cet identificateur.
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 !
Qwerty111 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 10h42   #2
Membre actif
 
Date d'inscription: octobre 2007
Localisation: 29
Messages: 176
Par défaut

Bonjour

tout d'abord, sheet.count?????

plutôt :

Code :
Sheets.Count

et ensuite, pour pouvoir t'aider, merci de remplacer :

Citation:
effectue une recherche pour trouver un élément qui peut-être dans n'importe quelle feuille, si tu trouve, exit function
par le code que tu utilises....
mapeh est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 11h02   #3
Membre à l'essai
 
Date d'inscription: septembre 2008
Messages: 45
Par défaut

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
J'ai pas mal réduit la chose (documents professionnels oblige) , mais le principal est là.
Qwerty111 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 11h11   #4
Membre actif
 
Date d'inscription: octobre 2007
Localisation: 29
Messages: 176
Par défaut

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
 
mapeh est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 11h58   #5
Membre à l'essai
 
Date d'inscription: septembre 2008
Messages: 45
Par défaut

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 ?
Qwerty111 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 12h01   #6
Membre actif
 
Date d'inscription: octobre 2007
Localisation: 29
Messages: 176
Par défaut

Re-,

j'adore ces certitudes, sans même avoir testé....

Citation:
Mais ça n'ira pas ton bout de code.
La méthode Find est bien plus rapide...

Risques-tu de rencontrer plusieurs fois ton critère de recherche dans la même feuille?
mapeh est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 12h23   #7
Expert Confirmé
 
Avatar de Krovax
 
Date d'inscription: juillet 2008
Localisation: Elsass
Âge: 24
Messages: 1 887
Par défaut

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 vu que ce que tu avais donné n'avais pas de sens (le delete disparu) il ne pouvais pas le faire a ta place
Krovax est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 12h28   #8
Membre actif
 
Date d'inscription: octobre 2007
Localisation: 29
Messages: 176
Par défaut

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....
mapeh est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 12h32   #9
Expert Confirmé
 
Avatar de Krovax
 
Date d'inscription: juillet 2008
Localisation: Elsass
Âge: 24
Messages: 1 887
Par défaut

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
 
Edit après test ca marche bien, ca fait le cas avec plusieurs opcurence dans une colonne
Krovax est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 14h13   #10
Membre à l'essai
 
Date d'inscription: septembre 2008
Messages: 45
Par défaut

Citation:
Envoyé par mapeh Voir le message
Re-,

j'adore ces certitudes, sans même avoir testé....



La méthode Find est bien plus rapide...

Risques-tu de rencontrer plusieurs fois ton critère de recherche dans la même feuille?
Non, mais jsuis pas totalement con, toi non plus, faut que j'adaptes pas mal le truc, c'est tout...

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.
Qwerty111 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 14h35   #11
Expert Confirmé
 
Avatar de Krovax
 
Date d'inscription: juillet 2008
Localisation: Elsass
Âge: 24
Messages: 1 887
Par défaut

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
 
Je te demande pas de tout modifié mais quitte a modifier celle la autant le faire bien
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.
Krovax est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 15h27   #12
Membre à l'essai
 
Date d'inscription: septembre 2008
Messages: 45
Par défaut

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.
Qwerty111 est déconnecté   Envoyer un message privé Réponse avec citation
NEWS EXCELF.A.Q EXCELTUTORIELS EXCELSOURCES EXCELOUTILS EXCELLIVRES EXCELOFFICE 2010

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 10h22.


Vos questions techniques : forum d'entraide Excel - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.