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 bla1.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 ifSi 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 IfMerci 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 Ifsi 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 !
Noobody can help me ?
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
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 IfHonnê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 ?
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
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 IfAprè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 IfEt 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 IfPinaise grosse épine du pied enlevée
Bises
Troph