Si Si impératrice et diverses questions

Bonsoir à tous.

j'ai quelques petites questions (de noob surement, mais qui je gênent!)

1 Si Si Impératrice

pour moi les déclarations suivantes semblent identiques mais au final si je teste (pas d'exmple précis à donner) ça semble différents.

vous confirmer?

if cel.value > 0 and cel.value<7 then 
bla bla bla

et 

if cel.value>0 then
 if cel.value <7 then
bla bla

1.2 Question SiSi bis.

dans une condition toutes les lignes sont elles lues? ou seulement celles qui correspondent à la condition.

exemple

if cel1.value >0 then
 cel2.value = cel1.value*2
else
cel2.value=cel1.value/2
end if

Si je mets 8 la valeur sera multipliée à par 2

si je mets -3 la valeur sera divisée par 2. mais la ligne cel2.value = cel1.value*2 sera-t'elle quand même lue ou pas?

[u]2. Une ligne de Cokemande?

[/u]

Y a t'il un intéret à mettre plusieurs commandes ur la même ligne?

exemple

cel1.ClearContents: cel2.ClearContents: cel3.ClearContents: cel4.ClearContents

est-ce la même chose que ?

cel1.ClearContents
cel2.ClearContents
cel3.ClearContents
cel4.ClearContents

[u]3. Erreur sans erreur

[/u]

Sur un autre post vous m'aviez donné une solution pour définir l'adresse d'une cellule en erreur.

Or maintenant j'ai une erreur lorsqu'il n'y a pas d'erreur.

"erreur 1004"

pas de cellule correspondantes et il me pointe vers la ligne qui définit les éventuelles cellule à erreur.

Y a t'il moyen de biaiser ceci?

Gestion_erreur:
    Dim Plager As Range, Cibler As Range

        'Recherche dans la plage A1:P5000
      Set Plager = Range("A1:P5000")

        On Error Resume Next ' <=activé ou désactivé pas de différence
        Set Cibler = Plager.SpecialCells(xlCellTypeFormulas, xlErrors) ' <= Ligne pointée quand pas d'erreur trouvée
        If Not Cibler Is Nothing Then
          Cibler.Offset(-2).Select
          Selection.Interior.ColorIndex = 3
          Cibler.Offset(-3).Select
          Selection.Interior.ColorIndex = 3

          MsgBox "Une donnée erronée se trouve dans les cases rouges !"
        End If

Merci pour vos éclairages avertis.

Troph

PS sur le fichier joint

dans la colonne lundi,

si on tape 1 en D2 les cellules grisées se découvrent et on peut inscrire les formats horaires.

si on tape autre chose que 1 ou 0 on a un message d'avertissement

maintenant lorsque l'on tape 0 je voudrait que les valeurs en C3 C4 D3 D4 s'effacent

c'est cette partie du code qui me fait tout planter et j'arrive pas à trouver pourquoi.

sans ces qq lignes ya aucun souci.

If cel0.Value = 0 Then
    If cel3.Value <> "" Then
    cel1.ClearContents: cel2.ClearContents: cel3.ClearContents: cel4.ClearContents
    Exit For
    End If
    Else
    Resume Next
End If

si je n'efface qu'une valeur ça fonctionne je vois pas pkoi avec les 4 ça coince.

d'autre part si je mets la condition est différent de vide sur les 4 cellules, on a le même type d'erreur.

si je fais 4 "si" différents l'un derrière l'autre je retombe sur l'erreur.

je sais plus quoi faire.

Help !

11test-remise-a-0.rar (59.54 Ko)

Noobody can help me ?

Bonsoir,

Quelques réponses :

1 Si Si Impératrice

=> les 2 instructions sont identiques

=> la différence : dans le premier cas, les 2 conditions sont évaluées, dans le second cas, la première condition est évaluée, et si vraie, la seconde est évaluée

1.2 Question SiSi bis.

=> dans un "if", la condition est évaluée, seule la ligne remplissant la condition est lue.

=> astuce pour le voir : faire du "pas à pas" avec "F8"

2. Une ligne de Cokemande?

=> je n'utilise jamais cette syntaxe, je trouve que c'est illisible. Mais ce n'est qu'un avis personnel

3. Erreur sans erreur

=> dans le cas cité, on a une gestion d'erreur dans la gestion d'erreur, cela ne fonctionne pas.

=> conseil : la gestion d'erreur ne doit être utilisée que pour afficher l'erreur, non préconisé de réécrire x lignes de codes dans la gestion d'erreur, sinon plus aucune maîtrise de ce qui se passe.

=> si besoin, créer une nouvelle fonction "light", qui évaluera l'erreur et renverra un vrai/faux en cas d'erreur à la fonction appelante, la suite est gérée dans la fonction appelante

J'espère avoir répondu aux question pour te permettre d'avancer !

Bonne soirée

Bouben


Re-bonsoir,

a priori, en supprimant la ligne suivante "Resume Next", l'erreur n'apparaît plus.

If cel0.Value = 0 Then
    If cel3.Value <> "" Then
    cel1.ClearContents: cel2.ClearContents: cel3.ClearContents: cel4.ClearContents
    Exit For
    End If
    Else
    Resume Next
End If

Honnêtement, je te conseille de supprimer toute la gestion d'erreur.

Au moins, un message d'erreur apparaîtra sur la ligne qui plante et dans ce cas, il faut la recoder pour qu'elle ne plante plus

Juste un conseil

Bonne soirée

Bouben

Merci d'avoir pris du temps pour me répondre,

Merci pour tes conseils je vais tester

Quant à la question les commandes en lignes où l'une en dessous de l'autre est-ce que cela change quelque chose au niveau de la lecture du code ?

Re-re,

D'autres conseils

Pour la lisibilité du code, il est fortement préconisé d'indenter les instructions "IF".

Exemple :

Avant :

'pour mercredi
If Range("H" & 2 + (i * n)).Value = 1 Then
Range("H" & 2 + (i * n)).Interior.ColorIndex = 2
Range("G" & 3 + i * n, "H" & 4 + i * n).Interior.ColorIndex = 2
Range("H" & 5 + i * n).Interior.ColorIndex = 2
Range("G" & 5 + i * n).Interior.Color = RGB(235, 190, 237)
Range("G" & 6 + i * n).Interior.Color = RGB(195, 235, 198)
Range("H" & 6 + i * n).Interior.Color = RGB(233, 235, 179)
Range("G" & 7 + i * n, "H" & 8 + i * n).Interior.Color = RGB(250, 198, 195)
Range("G" & 3 + i * n, "H" & 8 + i * n).Font.ColorIndex = 1
Else
If Range("H" & 2 + (i * n)).Value = 0 Then
'gris
Range("H" & 2 + (i * n)).Interior.ColorIndex = 2
Range("G" & 3 + i * n, "H" & 8 + i * n).Interior.Color = RGB(204, 200, 200)
Range("G" & 3 + i * n, "H" & 8 + i * n).Font.Color = RGB(204, 200, 200)
Else
If Range("H" & 2 + (i * n)).Value <> 0 Or Range("H" & 2 + (i * n)).Value <> 1 Then
Range("H" & 2 + (i * n)).Interior.ColorIndex = 3
MsgBox "Vous devez choisir entre 0 et 1."
Exit Sub
End If
End If
End If

Après :

'pour mercredi
If Range("H" & 2 + (i * n)).Value = 1 Then
    Range("H" & 2 + (i * n)).Interior.ColorIndex = 2
    Range("G" & 3 + i * n, "H" & 4 + i * n).Interior.ColorIndex = 2
    Range("H" & 5 + i * n).Interior.ColorIndex = 2
    Range("G" & 5 + i * n).Interior.Color = RGB(235, 190, 237)
    Range("G" & 6 + i * n).Interior.Color = RGB(195, 235, 198)
    Range("H" & 6 + i * n).Interior.Color = RGB(233, 235, 179)
    Range("G" & 7 + i * n, "H" & 8 + i * n).Interior.Color = RGB(250, 198, 195)
    Range("G" & 3 + i * n, "H" & 8 + i * n).Font.ColorIndex = 1
Else
    If Range("H" & 2 + (i * n)).Value = 0 Then
        'gris
        Range("H" & 2 + (i * n)).Interior.ColorIndex = 2
        Range("G" & 3 + i * n, "H" & 8 + i * n).Interior.Color = RGB(204, 200, 200)
        Range("G" & 3 + i * n, "H" & 8 + i * n).Font.Color = RGB(204, 200, 200)
    Else
        If Range("H" & 2 + (i * n)).Value <> 0 Or Range("H" & 2 + (i * n)).Value <> 1 Then
            Range("H" & 2 + (i * n)).Interior.ColorIndex = 3
            MsgBox "Vous devez choisir entre 0 et 1."
            Exit Sub
        End If
    End If
End If

Et de découper en plusieurs fonctions/procédures pour avoir des procédures plus courtes

Et éventuellement en les mutualisant ; sans avoir bien regardé, il me semble que les traitements pour lundi, mardi, ..., dimanche doivent être similaires, pouvant être regroupés dans une même procédure, si besoin en passant le jour en paramètres si spécificités pour certains jours)

Allez, bon courage !

Et cette fois, bonne nuit

Bouben


Trophinou a écrit :

Quant à la question les commandes en lignes où l'une en dessous de l'autre est-ce que cela change quelque chose au niveau de la lecture du code ?

Aucune différence !

Merci pour tout.

effectivement ce code est assez vieux et je dois avouer que j'ai pas trop eu le courage de le modifier.

j'en ai fait d'autres plus récent sur le même moule où le jour est en boucle aussi.

Ça demande une gymnastique intellectuelle plus grande que si on détaille, mais je suppose que ça doit etre plus court et plus efficace.

pour ma gestion d'erreur j'ai trouvé en testant le format de l'entrée dans les cases (cause de l'erreur) (ligne surlignée)

Gestion_erreur:
    Dim Plager As Range, Cibler As Range

        'Recherche dans la plage A1:P5000
      Set Plager = Range("A1:P5000")

        On Error Resume Next
If IsNumeric(cel1) And IsNumeric(cel2) And IsNumeric(cel3) And IsNumeric(cel4) Then
        Exit Sub
        Else
        Set Cibler = Plager.SpecialCells(xlCellTypeFormulas, xlErrors)
        If Not Cibler Is Nothing Then
          Cibler.Offset(-2).Select
          Selection.Interior.ColorIndex = 3
          Cibler.Offset(-3).Select
          Selection.Interior.ColorIndex = 3

          MsgBox "Une donnée erronée se trouve dans les cases rouges !"
        End If
     End If

Pinaise grosse épine du pied enlevée

Bises

Troph

Rechercher des sujets similaires à "imperatrice diverses questions"