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

Bug sur Boucle for sur une ligne et sur un test supérieur à - VB/VBA/VBS - Programmation

Marsh Posté le 24-05-2009 à 23:10:13    

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

Reply

Marsh Posté le 24-05-2009 à 23:10:13   

Reply

Marsh Posté le 25-05-2009 à 09:16:32    

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

Reply

Marsh Posté le 25-05-2009 à 16:34:10    

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
Reply

Marsh Posté le 27-05-2009 à 14:56:07    

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

Reply

Marsh Posté le 27-05-2009 à 15:13:41    


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
Reply

Marsh Posté le 27-05-2009 à 16:35:44    

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
Reply

Marsh Posté le 29-05-2009 à 11:30:20    

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+

Reply

Marsh Posté le 29-05-2009 à 15:10:29    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed