Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1538 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Bug sur Boucle for sur une ligne et sur un test supérieur à

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Bug sur Boucle for sur une ligne et sur un test supérieur à

n°1887439
nathanc
Posté le 24-05-2009 à 23:10:13  profilanswer
 

bonjour,
J'ai un problème sur une boucle qui ne fonctionne pas correctement.
Elle test si la ligne est cachée et si une cellule (nombres dans ces cellules) dans cette ligne est inférieur à la valeur de la combobox de l'userform.
Si la ligne n'est pas cachée et la cellule de la ligne est supérieur à combobox.value, on ne cache pas la ligne, sinon on la cache.
Malgré mes efforts, je ne comprends pas pourquoi les cellules dont la valeur est inférieur à celle de la combobox ne sont pas cachées !
je vous transmets mon code et attends vos commentaires.
Je vous remercie d'avance
 
___________________________________________
Static Derniere_ligne As Long
Static a As Long
Dim N As Integer
 
Derniere_ligne = Feuil1.Columns.End(xlDown).Row
a = Derniere_ligne + 1
 
Application.ScreenUpdating = False
 
Sheets("Listing ST" ).Select
 
 
 
 
For N = 3 To a
 
f = UserForm9.ComboBox1.Value
e = Feuil1.Range("CA" & N).Value
 
If UserForm9.ComboBox1.Value <> "0" Then
 
    If Feuil1.Rows(N).Hidden = False And f >= e Then
 
    Feuil1.Rows(N).Hidden = True
 
End If
End If
End If
 
Next N
________________________________________________
 
Merci d'avance

mood
Publicité
Posté le 24-05-2009 à 23:10:13  profilanswer
 

n°1887479
Deamon
Posté le 25-05-2009 à 09:16:32  profilanswer
 

Tu n'aurais pas un "End If" en trop par hasard ?

n°1887732
Turkleton
I don't quite understand you
Posté le 25-05-2009 à 16:34:10  profilanswer
 

Deamon a écrit :

Tu n'aurais pas un "End If" en trop par hasard ?


 
C'est d'autant plus dommage qu'il n'y a même pas besoin de blocs "If" ici, cela suffit :

If UserForm9.ComboBox1.Value <> "0" And Feuil1.Rows(N).Hidden = False And f >= e Then Feuil1.Rows(N).Hidden = True


---------------
If you think it could look good, then I guess it should
n°1888607
nathanc
Posté le 27-05-2009 à 14:56:07  profilanswer
 

même comme ceci cela ne marche pas.
 
Static Derniere_ligne As Long
Static a As Long
Dim N As Integer
 
 
Derniere_ligne = Feuil1.Columns.End(xlDown).Row
a = Derniere_ligne + 1
 
Application.ScreenUpdating = False
 
Sheets("Listing ST" ).Select
 
 
 
 
 
a = Derniere_ligne + 1
 
 
 
 
 
 
For N = 3 To a
 
f = UserForm9.ComboBox1.Value
e = Feuil1.Range("CA" & N).Value
 
If UserForm9.ComboBox1.Value <> "0" Then
 
    If Feuil1.Rows(N).Hidden = False And f >= e Then
 
    Feuil1.Rows(N).Hidden = True
 
End If
End If
 
Next N

n°1888614
Deamon
Posté le 27-05-2009 à 15:13:41  profilanswer
 


Tu traites ComboBox1.Value comme un String :

Code :
  1. UserForm9.ComboBox1.Value <> "0"


puis comme un entier :

Code :
  1. f = UserForm9.ComboBox1.Value
  2. ...
  3. If ... And f >= e Then


Il est peut être là le problème.


Message édité par Deamon le 27-05-2009 à 15:13:49
n°1888649
Turkleton
I don't quite understand you
Posté le 27-05-2009 à 16:35:44  profilanswer
 

Bon, comment dire... Ton code n'est pas terrible, à défaut d'être compréhensible. Quelques commentaires seraient les bienvenus. Et nous dire aussi si tu as un message d'erreur quand tu lances ta macro, ou si cela va jusqu'au bout mais sans les effets escomptés.
 
On va quand même essayer  ;)  
 

Code :
  1. Static Derniere_ligne As Long
  2. Static a As Long
  3. Dim N As Integer
  4. Derniere_ligne = Feuil1.Columns.End(xlDown).Row  // Que cherches-tu à récupérer ici ? Utiliser "End(xlDown).Row" sur toute ta feuille, ça peut avoir un comportement plus qu'erratique en fonction de la mise-en-forme de tes données. Admettons que ça marche bien pour les tiennes, j'imagine que tu récupères ici la dernière ligne avec une valeur dedans
  5. a = Derniere_ligne + 1  // Pourquoi utiliser une autre variable, et à quoi sert le "+1" ?
  6. Application.ScreenUpdating = False
  7. Sheets("Listing ST" ).Select  // ??? Tu changes de feuille maintenant, alors que tu n'y fais référence nulle part ailleurs dans ton code (tu utilises toujours "Feuil1" ) ? C'est normal ?
  8. a = Derniere_ligne + 1  // Encore cette ligne ? Elle n'était pas dans ton premier post, j'imagine que c'est une erreur de copier/coller
  9. For N = 3 To a   // Houla, ton "N" est un integer, mais il pourrait théoriquement prendre des valeurs aussi haute que "a" qui est un Long ? Pas terrible...
  10. f = UserForm9.ComboBox1.Value
  11. e = Feuil1.Range("CA" & N).Value  // Et tu reviens prendre une valeur de ta "Feuil1", j'espère que c'est la même feuille que "Listing ST"... D'autre part, c'est normal que tu ailles jusqu'à la colonne "CA" ?
  12. If UserForm9.ComboBox1.Value <> "0" Then  // A quoi te sert ta variable "f" si tu ne l'utilises pas ? D'autre part, la réflexion de Daemon est judicieuse : "f" est-elle un String ou un Integer ? Tu devrais la déclarer (et "e" aussi) comme tu l'as fait pour les autres variables.
  13.     If Feuil1.Rows(N).Hidden = False And f >= e Then  // Ton "Feuil1.Rows(N).Hidden = False" ne sert à rien ici. Si c'est déjà True, ton instruction d'après ne changera rien.
  14.     Feuil1.Rows(N).Hidden = True
  15. End If 
  16. End If // Encore une fois, je pense que tu peux résumer tes 5 dernières lignes en : "If f >= e Then Feuil1.Rows(N).Hidden = True" (pour peu que tes valeurs soient toutes supérieures à 0, ce qui évite le premier test)
  17. Next N


 
Bref, plein de trucs à revoir, ce qui fait plein de possibilités pour que ton code ne marche pas. Fais-nous savoir où tu en es.


---------------
If you think it could look good, then I guess it should
n°1889347
nathanc
Posté le 29-05-2009 à 11:30:20  profilanswer
 

Static Derniere_ligne As Long
Static a As Integer
Dim N As Integer
Dim f As String
Dim e As String
 
Derniere_ligne = Feuil1.Columns.End(xlDown).Row
 
Application.ScreenUpdating = False
   
a = Derniere_ligne + 1
 
For N = 3 To a
 
f = UserForm9.ComboBox1.Value
e = Feuil1.Range("CA" & N).Value
 
If UserForm9.ComboBox1.Value <> "0" Then
 
    If Feuil1.Rows(N).Hidden = False And f >= e Then
 
Feuil1.Rows(N).Hidden = True
 
End If
End If
 
Next N
__________________________________________________________
 
En fait, je récupère la première ligne non utilisée (cela marche bien dans ma feuille de donnée).
La sélection de la feuille est assez débile vu que je travaille dessus.
Maintenant, je considère N comme un entier aussi. Il prendra beaucoup de moins de valeurs ?
 
Au niveau des erreurs, en fait il n'y en a pas qui s'affiche mais il n'effectue pas la comparaison entre les deux données !
"If Feuil1.Rows(N).Hidden = False And f >= e"
Il ne cache pas alors la ligne ou la donnée est inférieur à la donnée de base !
Attention, le test doit s'eefectuer uniquement sur les lignes qui sont affichées et non pas sur toutes les lignes.
 
Je vois que j'ai encore beaucoup de choses à apprendre !
J'ai appris sur le tard et je ne suis pas perfectionniste dans ma programmation
Je vous remercie de l'aide apportée à mon preogramme !
 
A+

n°1889512
Turkleton
I don't quite understand you
Posté le 29-05-2009 à 15:10:29  profilanswer
 

Retour au bloc pour dissection du code :
 

Code :
  1. Static Derniere_ligne As Long
  2. Static a As Integer
  3. Dim N As Integer
  4. Dim f As String    // bin non en fait, c'est ce que te disais Deamon, ça ne va pas marcher si
  5. Dim e As String   // tu compares des chaines de caractères. Déclare-les en integer
  6. Derniere_ligne = Feuil1.Columns.End(xlDown).Row
  7. Application.ScreenUpdating = False
  8.  
  9. a = Derniere_ligne + 1  // toujours pas compris ce que ça faisait là. Si tu récupères la dernière ligne utilisée, pourquoi tester aussi celle d'après (inutilisée du coup) ?
  10. For N = 3 To a
  11. f = UserForm9.ComboBox1.Value
  12. e = Feuil1.Range("CA" & N).Value  // Tu es toujours sûr de ton "CA" ? C'est pas "A" plutôt ?
  13. If UserForm9.ComboBox1.Value <> "0" Then    // "f = UserForm9.ComboBox1.Value" donc tu peux utiliser f aussi ici. Tu l'utilises d'ailleurs encore comme une "string", enlève les guillemets autour du 0
  14.     If Feuil1.Rows(N).Hidden = False And f >= e Then
  15. Feuil1.Rows(N).Hidden = True
  16. End If
  17. End If
  18. Next N


 

nathanc a écrit :


En fait, je récupère la première ligne non utilisée (cela marche bien dans ma feuille de donnée).
Si ça marche chez toi, c'est le principal
 
La sélection de la feuille est assez débile vu que je travaille dessus.
 ;)  
 
Maintenant, je considère N comme un entier aussi. Il prendra beaucoup de moins de valeurs ?
C'est "a" que tu considères maintenant comme integer. Il ne va prendre "moins de valeurs", ça peut juste t'éviter des désagréments. Ton instruction "For N = 3 To a" fait que N va prendre toutes les valeurs entre 3 et a. Donc si N est un integer et que a est un long, il se pourrait que a soit trop grand ( >32767, limite des integer) pour rentrer dans N -> plantage
 
Au niveau des erreurs, en fait il n'y en a pas qui s'affiche mais il n'effectue pas la comparaison entre les deux données !
"If Feuil1.Rows(N).Hidden = False And f >= e"
Il ne cache pas alors la ligne ou la donnée est inférieur à la donnée de base !
Si f et e sont déclarés comme integer, ça marcherait sans doute mieux
 
Attention, le test doit s'eefectuer uniquement sur les lignes qui sont affichées et non pas sur toutes les lignes.
Tu n'es pas obligé de garder cette condition, mais ça accélérera (un peu) le traitement. Dans ma version, je l'avais enlevé pour te montrer que tes deux blocs If peuvent être simplifiés
 


 
Le problème principal je pense, c'est le type des variables e et f. Déclare-les comme integer. Si la valeur de ta ComboBox est considérée comme string et ne veut pas rentrer dans f, utilise un cast : f = CInt(UserForm9.ComboBox1.Value).


---------------
If you think it could look good, then I guess it should

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Bug sur Boucle for sur une ligne et sur un test supérieur à

 

Sujets relatifs
Création d'un test sur PowerPoint avec VBApb pour fermer une boucle (calculatrice)
Caractères accentués, fichier batch et ligne de commandeSupprimer une ligne dans un fichier
écrire en fin de ligne avec ofstreamBoucle For & If Imbriqués
Copier / Coller ligne entre fichiers excelRécupérer la première ligne d'une cellule
Copier coller une ligne excel sur autre feuille avec conditionsHMTL, forcer plusieurs passages à la ligne
Plus de sujets relatifs à : Bug sur Boucle for sur une ligne et sur un test supérieur à


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR