optimisation de macro

chich

XLDnaute Occasionnel
Bonjour a tous
ma macro ne fonctionne pas entièrement car elle ne tien pas de la possibilité que (I3)
peux être non vide (renseigner manuellement)
et je souhaite qu'elle s'applique a la plage (I3:10) en foction de la plage (A3:AH10)

Private Sub Worksheet_Activate()
Range("I3").Value = IIf(I3 <> "", "", IIf(AA3 = "", "07:00", ""))
End Sub
Merci d'avance
 

Pièces jointes

  • DEMO.xlsm
    21.7 KB · Affichages: 24

Dranreb

XLDnaute Barbatruc
Bonjour.
Pas compris non plus mais appliquant ce que vous aviez écrit sans comprendre, ça pourrait donner ça :
VB:
Private Sub Worksheet_Activate()
Dim T(), L&, C&
T = [I3:AH10].Value
For L = 1 To 8: For C = 1 To 8
   If L Mod 3 <> 0 And C Mod 3 <> 0 Then T(L, C) = IIf(IsEmpty(T(L, C)), _
      IIf(IsEmpty(T(L, C + 18)), TimeSerial(7, 30, 0), Empty), Empty)
   Next C, L
[I3:P10].Value = T
End Sub
 

chich

XLDnaute Occasionnel
Bonjour.
Pas compris non plus mais appliquant ce que vous aviez écrit sans comprendre, ça pourrait donner ça :
VB:
Private Sub Worksheet_Activate()
Dim T(), L&, C&
T = [I3:AH10].Value
For L = 1 To 8: For C = 1 To 8
   If L Mod 3 <> 0 And C Mod 3 <> 0 Then T(L, C) = IIf(IsEmpty(T(L, C)), _
      IIf(IsEmpty(T(L, C + 18)), TimeSerial(7, 30, 0), Empty), Empty)
   Next C, L
[I3:P10].Value = T
End Sub
Re merci pour votre interet
ces presque ca il manque juste qu' il soit pris en compte si par exemple (I3) et déjà renseigner manuellement
 

Dranreb

XLDnaute Barbatruc
Ne pouvez vous expliquer clairement ce que vous voulez dans chacun des 4 cas possible ?
1) — Ni Ia cellule ni celle 18 colonnes à sa droite ne sont renseignées,
2) — Seulement celle de gauche l'est,
3) — Seulement celle de droite l'est,
4) — Les deux le sont.
 

chich

XLDnaute Occasionnel
Ne pouvez vous expliquer clairement ce que vous voulez dans chacun des 4 cas possible ?
1) — Ni Ia cellule ni celle 18 colonnes à sa droite ne sont renseignées,
2) — Seulement celle de gauche l'est,
3) — Seulement celle de droite l'est,
4) — Les deux le sont.
re
le but et que toutes les cellules peuvent être renseigner manuellement et donc quant une cellule
est non vide alors la formule ne s'applique pas a cette dernière
j' être suffisamment explicite
 

Dranreb

XLDnaute Barbatruc
Répondez à ma question telle que je l'ai posée. Que doit on mettre dans la cellule de gauche dans chacun des 4 cas ?
Il ne s'agit quand même pas tout simplement de mettre 7:30 dans les cellules vide et de laisser ce qu'il y a dans celles qui sont renseignées, j'espère ? Ce serait trop simple !
VB:
Private Sub Worksheet_Activate()
Dim T(), L&, C&
T = [I3:AH10].Value
For L = 1 To 8: For C = 1 To 34
   If L Mod 3 <> 0 And C Mod 3 <> 0 And Not IsEmpty(T(L, C)) Then T(L, C) = TimeSerial(7, 30, 0)
   Next C, L
[I3:AH10].Value = T
End Sub
 
Dernière édition:

chich

XLDnaute Occasionnel
Répondez à ma question telle que je l'ai posée. Que doit on mettre dans la cellule de gauche dans chacun des 4 cas ?
Il ne s'agit quand même pas tout simplement de mettre 7:30 dans les cellules vide et de laisser ce qu'il y a dans celles qui sont renseignées, j'espère ? Ce serait trop simple !
VB:
Private Sub Worksheet_Activate()
Dim T(), L&, C&
T = [I3:AH10].Value
For L = 1 To 8: For C = 1 To 34
   If L Mod 3 <> 0 And C Mod 3 <> 0 And Not IsEmpty(T(L, C)) Then T(L, C) = TimeSerial(7, 30, 0)
   Next C, L
[I3:AH10].Value = T
End Sub
Re
Oui vous avez tout compris
 

chich

XLDnaute Occasionnel
C'est le 32 qui nest pas bon remplacez le par le bon nombre de colonnes de la plage.
Re l' ideal serait de fusionner les deux et je souhaiterais aussi me débarrasser du Worksheet_Activate()
et de le remplacer par Private Sub Worksheet_Change(ByVal Target As Range) si possible !

Private Sub Worksheet_Activate()
Dim T(), L&, C&
T = [I3:AH10].Value
For L = 1 To 8: For C = 1 To 8
If L Mod 3 <> 0 And C Mod 3 <> 0 And IsEmpty(T(L, C)) Then T(L, C) = TimeSerial(7, 30, 0)
Next C, L
[I3:AH10].Value = T
End Sub

Private Sub Worksheet_Activate()
Dim T(), L&, C&
T = [I3:AH10].Value
For L = 1 To 8: For C = 1 To 8
If L Mod 3 <> 0 And C Mod 3 <> 0 Then T(L, C) = IIf(IsEmpty(T(L, C)), _
IIf(IsEmpty(T(L, C + 18)), TimeSerial(7, 30, 0), Empty), Empty)
Next C, L
[I3: P10].Value = T
End Sub
 

Dranreb

XLDnaute Barbatruc
Eh bien faites le ! Je ne sais pas ce que vous voulez fusionner, moi.
Et puis tiens, pour éviter tout risque d'erreur de nombres de lignes ou de colonnes remplacez donc :
For L = 1 To 8: For C = 1 To 8
par :
For L = 1 To UBound(T, 1): For C = 1 To UBound(T, 2)
 
Dernière édition:

Discussions similaires

Réponses
3
Affichages
294

Membres actuellement en ligne

Statistiques des forums

Discussions
312 196
Messages
2 086 100
Membres
103 116
dernier inscrit
kutobi87