Insertion d'un tableau de dates VBA

Bonjour à tous ,

Je suis confrontrée à un problème qui est le suivant :

Je veux créer, à partir des données que l'utilisateur rentrera dans la boîte UserForm , un tableau de dates. L'utilisateur entre une date de début , une date de fin, ainsi que la périodicité qu'il veut (soit par semaine ou par mois )

1) Voici le code :

Function tabl()
  Dim tableau() As Double
  Dim i As Double, j As Double
  Dim mois As Date

  i = DateDiff("m", Range("A1"), Range("A2"), 2)  'A1 pour la valeur date début, A2 pour date de fin

  ReDim tableau(i)

  mois = Range("A1").Value

    For j = 1 To UBound(tableau)

        tableau(j) = DateAdd("m", i, mois)
        Range("A" & j) = tableau(j)

   Next j

End Function

Lorsque j'exécute le code, il se bloque à la ligne " Range("A" & j) = tableau(j) " ...

2) Deuxième problème , j'aimerais que lorsque l'utilisateur coche la case "Semaine" il puisse avoir un tableau de date sous forme de semaine

Private Sub periode_en_mois_Click()

     Dim colonne As String

     For Each bouton_colonne In Frame_periode.Controls

        If bouton_colonne.Value Then

            colonne = bouton_colonne.Caption

         End If
    Next
End Sub
Private Sub periode_en_semaine_Click()

     Dim colonne As String

     For Each bouton_colonne In Frame_periode.Controls

         If bouton_colonne.Value Then

            colonne = bouton_colonne.Caption

         End If
   Next
End Sub 

Voilà, j'espère avoir été clair , merci d'avance pour votre aide

Salut Amarillis et bienvenue sur le Forum,

J'avais déjà vu ton message ce matin et me suis dit que sans fichier, les réponses allaient tarder.

Tu vois donc ce qu'il te reste à faire

Cordialement.

joindre un fichier forum

Salut Yvouille,

Oui tu as raison ça sera sûrement plus clair !

Voici le fichier.

J'aimerais créer le tableau de dates comme dans la feuille nommé 'avancement physique' (feuille prototype de ce que je veux réaliser)

Ton fichier n'est pas passé. Tu as dû louper l'étape numéro 4 de mon explication.

Si ton fichier est trop gros, tu reçois une message. Essaie alors de le compresser ou de passer par le site C-Joint.

Amicalement.

Je vais y arriver.... !

Salut,

Je suis désolé, mais je ne vais pas vraiment pouvoir t’aider. J’ai des messages d’erreur qui m’indiquent qu’il me manque des objets sur ma machine ou d’autres trucs dans le genre.

Tu ne pourras qu’espérer qu’un autre membre prendra le relais ou sinon – si plus personne s’intéresse à ce fil déjà bien entamé – indique-le comme ‘’Résolu’’ en cliquant sur le petit V vert dans l’un de tes messages en recommence-en un autre.

Mais n’oublie jamais de fournir un fichier qui est toujours fort utile.

Dans l’espoir de t’avoir quand même permis d’avancer un peu, ne serait-ce que concernant l’utilisation de ce Forum.

Amicalement.

Bonjour,

Une fonction retourne une valeur (ou un tableau) mais ne peut en aucun cas modifier son environnement.

Le résultat est dans la (les pour une fonction matricielle) cellule d'appel et c'est tout. Tu ne peux pas remplir une autre cellule.

eric

Bonjour,

Tout d'abord merci pour vos réponses.

eriic, je comprends pas ton message (ps: je suis débutante sur VBA) .

Entre temps j'ai quelqu'un qui m'a montré un autre code pour mettre en place mon tableau dynamique de dates . Mais il y a toujours un soucis : lorsque je veux calculer la difference entre les deux dates entrées dans la userform, la difference est égale à zero.

Je joins le fichier

eriic, je comprends pas ton message

quand tu utilises une fonction dans une cellule le résultat est dans la cellule et c'est tout.

Tu ne peux pas lui dire met tel résultat dans telle autre cellule. Seule une procédure peut le faire.

Ok je vois, et comment créer dans ce cas là une procédure ?

Bonjour,

une façon :

Private Sub Valider_Click()
    Dim dat As Date, serieDat() As Date, i As Long

    If Not periode_en_mois And Not periode_en_semaine Then
        MsgBox "Veuillez choisir la périodicité svp"
        Exit Sub
    End If
    Range([A2], [A2].End(xlDown)).ClearContents
    dat = CDate(Calendrier)
    ReDim serieDat(1 To 1)
    Do While dat <= Calendrier2
        i = i + 1
        ReDim Preserve serieDat(1 To i)
        serieDat(i) = dat
        If periode_en_mois Then
            dat = DateAdd("m", i, Calendrier)
        Else
            dat = dat + 7
        End If
    Loop
    For i = 1 To UBound(serieDat)
        [A1].Offset(i) = CDate(serieDat(i))
    Next i
    Unload Me
    'Unload ferme l'UserForm
    'Le nom de l'UserForm a été remplacé par Me (puisque ce code est placé dans l'UserForm à fermer
End Sub

Je ne colle pas en bloc le tableau résultat car sinon certaines date sont mise en texte par vba.

Si ton programme est destiné à plusieurs postes tu devrais te méfier des contrôles Calendar et Cie.

Selon la version d'office différentes versions existent et c'est une vraie galère pour installer la bonne sur chaque poste défaillant. Et il faudra recommencer lorsque certains auront une nouvelle version. Pas très pérenne...

Regarde, déjà Yvouille n'a pu faire tourner ton fichier.

Contente-toi d'un textebox dont tu contrôles la validité de la date, ou sinon met un calendrier fait par formulaire (google en regorge).

erov

ça fonctionne ! Seul problème c'est que lorsque l'utilisateur demande par semaine, je voudrais un numéro de semaine .

Alors j'ai modifié ta procédure :

 If periode_en_mois Then
            dat = DateAdd("m", i, Calendrier)
        Else

            dat = DateAdd("ww", i, date_semaine) 'dat = dat + 7
        End If

Alors j'ai essayé la fonction DateValue mais cela n'accepte que les chaînes

lorsque l'utilisateur demande par semaine, je voudrais un numéro de semaine

C'est à dire ?

Une date est une date, un n° de semaine n'est pas une date.

Chez moi une date+7 jours fait bien une semaine de plus...

Oui , lorsque l'utilisateur introduit une date , je veux être capable de transformer cette date en un numéro de semaine.

Par exemple, l'utilisateur entre la date " 01/01/2015" je veux que ce soit écrit 1 . Car l'utlisateur ne travaille pas forcément avec l'écriture "../../...." mais avec l'écriture "s1, s2, s3, etc..". Voilà pourquoi je met en place cette option , je veux m'adapter à l'utilisateur!

Pourquoi ne pas l'avoir précisé dans ta question alors ?

Remplace pltôt la boucle For qui est la restitution des résultats :

    For i = 1 To UBound(serieDat)
        If periode_en_semaine Then
            [A1].Offset(i) = Year(serieDat(i)) & "-" & DatePart("ww", serieDat(i), vbMonday, vbFirstFourDays)
        Else
            [A1].Offset(i) = CDate(serieDat(i))
        End If
    Next i

en sachant que ce sera faux pour les 31/12/2007, 30/12/2019 et 29/12/2031

Ca fonctionne super !!

J'ai pas été assez clair depuis le début , faut dire que c'est la première fois que je poste quelquechose .

Merci pour ton aide précieuse, j'ai appris pas mal de choses grâce à toi

Rechercher des sujets similaires à "insertion tableau dates vba"