Boucle If dans une routine for

p19

XLDnaute Nouveau
Bonjour,

Je tente d'écrire un code pour monter un tableau de type calendrier.

En fait, je souhaite avoir une cellule contenant une date, puis une seconde dessous blanche, puis une troisième avec la date suivant la date de la première cellule, puis une date blanche ...

Le code suivant bloque dans ma routine "For i = 1 To nb_jours - 1" à l’intérieur de laquelle j'insère un If.

J'ai une erreur de type "Erreur de compilation, For sans Next"

Quelqu'un peut il m'expliquer ? Et me donner des conseils...

D'avance merci, je débute

Sub mon_tablo()
Dim i As Variant
Dim date_debut As Date
Dim date_test As Date
Dim nb_jours As Long


i = 12
date_debut = "1/5/2013"

date_test = date_debut
nb_jours = Day(DateSerial(Year(date_test), Month(date_test) + 1, 1) - 1)
'MsgBox (nb_jours)
Sheets("Feuil3").Activate
Range("A1").Value = date_debut
Range("A1").Select
ActiveCell.Offset(1, 0).Select
ActiveCell.Value = date_debut
ActiveCell.Offset(1, 0).Select

For i = 1 To nb_jours - 1
If (i Mod 2) = 0 Then
Cells(i + 1, 1).Value = date_debut + i
Else
Cells(i + 1, 1).Value = ""
Next i

End Sub
 

p19

XLDnaute Nouveau
Re : Boucle If dans une routine for

Merci, le code fonctionne.

En revanche, je ne comprends pas pourquoi il ne prend, dans la suite de dates, que les date impaires et saute les dates paires ?

Capture.JPG

Merci d'avance.

Cordialement.
 

Pièces jointes

  • Capture.JPG
    Capture.JPG
    13.6 KB · Affichages: 62
  • Capture.JPG
    Capture.JPG
    13.6 KB · Affichages: 60

p19

XLDnaute Nouveau
Re : Boucle If dans une routine for

Bonsoir PierreJean et merci, cela à bien fonctionné.

Je poursuit mon code et souhaite remplir mon tableau de dates sur 12 mois (donc douze colonnes).

Je compléte maintenant parfaitement ma première colonne et ai complété mon vba afin que celui ci revienne en début de seconde colonne avec comme valeur de date de début de seconde colonne une date égale à ma première date + 1 mois.

J'ai écrit le code suivant qui me fait bien ce que je souhaite. en revanche, c'est après que cela se complique.

Avez vous une idée SVP ?



Sub mon_tablo()
Dim i As Variant
Dim j As Variant

Dim date_debut As Date
Dim date_test As Date
Dim nb_jours As Long
Dim nb_jour1 As Variant
Dim date_retenue As Date
i = 2
j = 1

date_debut = "1/5/2013"
date_retenue = "1/5/2013"
date_test = date_debut
nb_jours = Day(DateSerial(Year(date_test), Month(date_test) + 1, 1) - 1)
nb_jour1 = nb_jours * -2
'MsgBox (nb_jours)
Sheets("Feuil3").Activate
Range("A1").Value = date_debut
Range("A1").Select
ActiveCell.Offset(1, 0).Select
ActiveCell.Value = date_debut
'ActiveCell.Interior.Color = RGB(255, 0, 0)
'ActiveCell.Font.ColorIndex = 2
ActiveCell.Offset(1, 0).Select
For j = 1 To 12

For i = 1 To ((nb_jours * 2) - 2)
If (i Mod 2) = 0 Then
Cells(i + 1, 1).Value = date_debut + 1
date_debut = date_debut + 1
ActiveCell.Offset(1, 0).Select
Else
Cells(i + 1, 1).Value = ""
ActiveCell.Offset(1, 0).Select
End If
Next i

ActiveCell.Offset(0, 1).Select
ActiveCell.Offset(nb_jour1, 0).Select
date_retenue = date_retenue + nb_jours
ActiveCell.Value = date_retenue
Next j
End Sub

D'avance merci.


Philippe
 
Dernière édition:

p19

XLDnaute Nouveau
Re : Boucle If dans une routine for

Re bonjour à tous,

J'ai "un peu" modifié le code ci dessous et cela progresse mais difficilement : Mon souhait est d'obtenir un tableau sur 12 colonnes (un an) qui alterne une ligne date et une ligne blanche.
Le code ci dessous débute bien l'opération ( je ne l'ai fait que sur quatre mois) dans la première colonne mais c'est ensuite que cela se gâte !

Si quelqu'un peut m'expliquer ce qui ne va pas.

D'avance merci pour votre aide.

Voici le code

Sub essi_ablo()
Dim a As Variant
Dim b As Variant
Dim c As Variant
Dim d As Variant
Dim date_test As Date
Dim date_debut As Date
date_debut = "1/5/2013"
'date_test = date_debut
Dim nb_jours As Long
nb_jours = Day(DateSerial(Year(date_debut), Month(date_debut) + 1, 1) - 1)

For a = 1 To nb_jours * 2
If (a Mod 2) = 0 Then
Cells(a, 1).Value = date_debut
date_debut = date_debut + 1
Else
Cells(a + 1, 1).Value = ""
ActiveCell.Offset(1, 0).Select
End If
Next a


nb_jours = Day(DateSerial(Year(date_debut), Month(date_debut) + 1, 1) - 1)

For b = 1 To nb_jours
a = 1
Cells(b, a + 1).Value = date_debut
date_debut = date_debut + 1
Next b

nb_jours = Day(DateSerial(Year(date_debut), Month(date_debut) + 1, 1) - 1)

For c = 1 To nb_jours
b = 1
Cells(c, b + 2).Value = date_debut
date_debut = date_debut + 1
Next c

nb_jours = Day(DateSerial(Year(date_debut), Month(date_debut) + 1, 1) - 1)

For d = 1 To nb_jours
c = 1
Cells(d, c + 3).Value = date_debut
date_debut = date_debut + 1
Next d

End Sub

Cordiales salutations.

N.B. Je pense que plutôt d’enchaîner, on peut très certainement les chaîner mais je n'y suis pas parvenu.

Philippe
 

p19

XLDnaute Nouveau
Re : Boucle If dans une routine for

Je viens de comprendre mes erreurs et cela fonctionne maintenant avec le code suivant :

Sub essi_ablo()
Dim a As Variant
Dim b As Variant
Dim c As Variant
Dim d As Variant
Dim date_test As Date
Dim date_debut As Date
date_debut = "1/5/2013"
'date_test = date_debut
Dim nb_jours As Long

nb_jours = Day(DateSerial(Year(date_debut), Month(date_debut) + 1, 1) - 1)

For a = 1 To nb_jours * 2
If (a Mod 2) = 0 Then
Cells(a, 1).Value = date_debut
date_debut = date_debut + 1
Else
Cells(a + 1, 1).Value = ""
ActiveCell.Offset(1, 0).Select
End If
Next a


nb_jours = Day(DateSerial(Year(date_debut), Month(date_debut) + 1, 1) - 1)

For b = 1 To nb_jours * 2
a = 1
If (b Mod 2) = 0 Then
Cells(b, a + 1).Value = date_debut
date_debut = date_debut + 1
Else
Cells(b, a + 1).Value = ""
ActiveCell.Offset(1, 0).Select
End If
Next b

nb_jours = Day(DateSerial(Year(date_debut), Month(date_debut) + 1, 1) - 1)

For c = 1 To nb_jours * 2
b = 1
If (c Mod 2) = 0 Then
Cells(c, b + 2).Value = date_debut
date_debut = date_debut + 1
Else
Cells(c, b + 2).Value = ""
ActiveCell.Offset(1, 0).Select
End If
Next c

nb_jours = Day(DateSerial(Year(date_debut), Month(date_debut) + 1, 1) - 1)

For d = 1 To nb_jours * 2
c = 1
If (d Mod 2) = 0 Then
Cells(d, c + 3).Value = date_debut
date_debut = date_debut + 1
Else
Cells(d, c + 3).Value = ""
ActiveCell.Offset(1, 0).Select
End If
Next d

End Sub

Ma question est maintenant la suivante : Plutôt que de répéter des FOR ... NEXT, n'y à t'il pas une solution pour faire tout dans une seule boucle imbriquée ?

D'avance merci.

Philippe
 

ROGER2327

XLDnaute Barbatruc
Re : Boucle If dans une routine for

Bonjour à tous.


Un essai :​
VB:
Sub cal()
Dim an%, nbj%, i%, c%, dateDébut As Date, dep As Range
'
    dateDébut = "1/5/2013"  'Première date
    Set dep = [C2]          'Coin supérieur gauche du calendrier.

    nbj = DateSerial(Year(dateDébut) + 1, Month((dateDébut)), Day(dateDébut)) - dateDébut
    For i = 1 To nbj
        dep.Offset(2 * (Day(dateDébut) - 1), c).Value = dateDébut
        If Month(dateDébut) <> Month(dateDébut + 1) Then c = c + 1
        dateDébut = dateDébut + 1
    Next
End Sub



ROGER2327
#6396


Lundi 23 Décervelage 140 (Saint Tank, animal - fête Suprême Quarte)
1[SUP]er[/SUP] Pluviôse An CCXXI, 7,0869h - lauréole
2013-W03-7T17:00:31Z
 

p19

XLDnaute Nouveau
Re : Boucle If dans une routine for

Merci Roger,

Ça fonctionne parfaitement.

J'ai du mail à comprendre la ligne "dep.Offset(2 * (Day(dateDébut) - 1), c).Value = dateDébut"

J'ai annoté le code comme je le comprends :

Sub cal()
Dim an%, nbj%, i%, c%, dateDébut As Date, dep As Range
'
dateDébut = "1/5/2013" 'Première date
Set dep = [C2] 'Coin supérieur gauche du calendrier.

nbj = DateSerial(Year(dateDébut) + 1, Month((dateDébut)), Day(dateDébut)) - dateDébut 'calcule le nombre de jour dans l'année
For i = 1 To nbj ' fait tourner la routine jusqu'au nombre de jour dans l'année
dep.Offset(2 * (Day(dateDébut) - 1), c).Value = dateDébut ' ?
If Month(dateDébut) <> Month(dateDébut + 1) Then c = c + 1 ' teste si on ne change pas de mois
dateDébut = dateDébut + 1 ' ajoute 1 jour à la précedante date
Next
End Sub



Pouvez-vous m'éclairer s'il vous plaît ?

D'avance merci.
 

p19

XLDnaute Nouveau
Re : Boucle If dans une routine for

Bonsoir,

Ca y est ! En décryptant en mode pas à pas, j'ai compris le code
dep.Offset(2 * (Day(dateDébut) - 1), c).Value = dateDébut ' ?

J'essaye donc de poursuivre en insérant une condition sur le jour de la semaine me donnat un fond différent si c'est le week end de celui des autres jours. J'ai donc inséré un select case qui me resiste :

Sub cal()
Dim an%, nbj%, i%, c%, dateDébut As Date, dep As Range
'
dateDébut = "1/5/2013" 'Première date
Set dep = [C2] 'Coin supérieur gauche du calendrier.

nbj = DateSerial(Year(dateDébut) + 1, Month((dateDébut)), Day(dateDébut)) - dateDébut 'calcule le nombre de jour dans l'année
For i = 1 To nbj ' fait tourner la routine jusqu'au nombre de jour dans l'année
dep.Offset(2 * (Day(dateDébut) - 1), c).Value = dateDébut ' ?
Select Case Format((dateDébut), "dddd") = "samedi" 'or ((dateDébut),"dddd")="dimanche"
dep.Interior.Color = RGB(255, 5, 255)
Case Else
dep.Interior.Color = RGB(200, 50, 56)
End Select


If Month(dateDébut) <> Month(dateDébut + 1) Then c = c + 1 ' teste si on ne change pas de mois
dateDébut = dateDébut + 1 ' ajoute 1 jour à la précedante date
Next
End Sub

Pourriez-vous m'expliquer pourquoi ?

D'avance merci.

Philippe
 

ROGER2327

XLDnaute Barbatruc
Re : Boucle If dans une routine for

Re...


(...)

J'ai du mail à comprendre la ligne "dep.Offset(2 * (Day(dateDébut) - 1), c).Value = dateDébut"

J'ai annoté le code comme je le comprends :

(...)

Pouvez-vous m'éclairer s'il vous plaît ?

(...)

Volontiers. La ligne en question prend dep comme référence (cellule C2 devant recevoir la 1[SUP]ère[/SUP] date) et décale cette référence de 2 * (Day(dateDébut) - 1) ligne(s) et de c colonne(s).
La première fois (pour i = 1) le décalage est 2 * (1 - 1) (= 0) et 0 (car c possède cette valeur à l'initialisation. La référence à C2 décalée de zéro ligne, zéro colonne reste C2.
La deuxième fois (pour i = 2) le décalage est 2 * (2 - 1) (= 2) et 0 (car le mois n'ayant pas changé c reste nul. La référence à C2 décalée de deux lignes, zéro colonne devient C4.
Et ainsi de suite jusqu'à la fin mois.
Au début du mois suivant, c est incrémenté de 1 et prend la valeur 1. Le processus continue donc dans la colonne voisine à droite de la colonne de C2 soit la colonne D.
Et ainsi de suite jusqu'à la fin de l'année.​


Bonne soirée.



ROGER2327
#6397


Lundi 23 Décervelage 140 (Saint Tank, animal - fête Suprême Quarte)
1[SUP]er[/SUP] Pluviôse An CCXXI, 8,2184h - lauréole
2013-W03-7T19:43:27Z
 

ROGER2327

XLDnaute Barbatruc
Re : Boucle If dans une routine for

Suite...


J'étais un peu en retard avec mes commentaires. J'espère être meilleur cette fois-ci...

Il y a deux erreurs dans votre code :
  • Mauvaise syntaxe de Select.Case.
  • Gestion de la cellule de référence pour l'attribution des couleurs.
La correction de la première est faite sans commentaire dans le code qui suit.
Pour la deuxième : Lorsque vous écrivez
Code:
dep.Interior.Color = RGB(255, 5, 255)
vous faites toujours référence à la cellule désignée par dep, soit C2. Il faut écrire
Code:
dep.Offset(2 * (Day(dateDébut) - 1), c).Interior.Color = RGB(255, 5, 255)
Pour éviter la lourdeur des répétitions, vous pouvez procéder comme suit :​
VB:
Sub cal()
Dim an%, nbj%, i%, c%, dateDébut As Date, dep As Range
'
    dateDébut = "1/5/2013" 'Première date
    Set dep = [C2] 'Coin supérieur gauche du calendrier.

    nbj = DateSerial(Year(dateDébut) + 1, Month((dateDébut)), Day(dateDébut)) - dateDébut
    For i = 1 To nbj
        With dep.Offset(2 * (Day(dateDébut) - 1), c)
            .Value = dateDébut
            Select Case Format((dateDébut), "dddd")
            Case "samedi", "dimanche"
                .Interior.Color = RGB(255, 5, 255)
            Case Else
                .Interior.Color = RGB(200, 50, 56)
            End Select
        End With
        If Month(dateDébut) <> Month(dateDébut + 1) Then c = c + 1
        dateDébut = dateDébut + 1
    Next
End Sub
C'est élégant (bof...) et tout aussi efficace.​


ROGER2327
#6398


Lundi 23 Décervelage 140 (Saint Tank, animal - fête Suprême Quarte)
1[SUP]er[/SUP] Pluviôse An CCXXI, 8,3604h - lauréole
2013-W03-7T20:03:54Z
 

Discussions similaires

Réponses
5
Affichages
255
Réponses
11
Affichages
363

Statistiques des forums

Discussions
312 610
Messages
2 090 217
Membres
104 452
dernier inscrit
hamzamounir