Ajouter jours à cellule contenant date | ||
---|---|---|
Inscription: 10/07/2014
Messages:
1
Système d'exploitation: PC Version Excel utilisée: 2007 |
Posté le : 10-07-2014 12h39
Bonjour à tous,
Actuellement en stage j'utilise chaque jour VBA notamment afin de monter un tableau de prévision de trésorerie pour l'entreprise dans laquelle je travaille.
Je dois faire une fonction qui me permet de modifier une date d'échéance de règlement en permettant à l'utilisateur de saisir le délai supplémentaire qu'il souhaite ajouter à cette échéance initiale.
J'aurais idéalement voulu stocké cette nouvelle date dans la cellule précédente. J'ai essayé une sub pour pouvoir le faire, mais d'après mes cours VBA, les sub ne sont pas idéales pour renvoyer des valeurs. Voilà pourquoi j'ai utilisé une fonction, que je ne maîtrise plus très bien.
Le seul résultat que j'obtient est soit #valeur! soit 01/01/1900.
Je pense que mes deux principaux problèmes sont dans la saisie de la variable de la fonction et la définition de son type, et ensuite y ajouter le nombre de jours saisis.
Ci-joint mes écritures complétées de commentaires :
Function RETARD(dateactualisee As Range)
Dim jours As Integer
Dim nbrj As Integer
Dim reponse As Integer
'Si qui permet de vérifier que la cellule à laquelle l'utilisateur veut ajouter un nbr de jours supplémentaire contient bien une date
If IsDate(dateactualisee.Value) = False Then
MsgBox "L'utilisation de cette fonction requiert une date en paramètre"
Exit Function
End If
'demande à l'utilisateur s'il...
reponse = MsgBox("Souhaitez-vous retarder la date de règlement prévue ?", 36, "Prévoir retard")
'Si la réponse est positive
If reponse = 6 Then
nbrj = InputBox("De combien de jours souhaitez-vous retarder l'échéance ?", "Saisir nombre jours supplémentaires", "0")
'Si qui permet de vérifier que l'utilisateur a bien saisi un nombre
If IsNumeric(nbrj) = False Then
MsgBox "Vous n'avez pas saisi un nombre, recommencer.", vbOKOnly & vbInformation
Exit Function
End If
'Ajoutes la valeur saisie par l'utilisateur à la cellule initialement choisie
dateactualisee.Value = DateAdd(dateinterval.Day, jours, dateactualisee.Value)
Else
MsgBox " Vous n'avez pas modifier la date prévue de règlement", vbOKOnly & vbInformation
End If
End Function
De plus j'ai essayé avec Cells(i,j).Value / Cells(i,j).Date mais je ne peux pas fixer une cellule en particulier car elle ne se modifie pas par l'incrémentation comme le permettent les fonctions Excel. Du coup je n'arrive pas à utiliser une Cells lorsque son emplacement est inconnu à l'avance car le tableau est susceptible d'être mis à jour via de nouvelle ligne quotidiennement (j'ai utilisé des boucles, mais avec (i=1 to n) elle ne finissait jamais).
Merci d'avance,
Bien cordialement à tous,
AlexandreVBA
|
|
|
Re: Ajouter jours à cellule contenant date | ||
---|---|---|
Inscription: 09/01/2008
De Montréal, Québec
Messages:
463
Système d'exploitation: PC Version Excel utilisée: 97 à 2016 |
Posté le : 11-07-2014 22h48
Bonjour alexandreVBA et bienvenu dans le forum,
Effectivement tes cours de VBA auraient dû t'apprendre qu'une procédure (Sub) ne retourne jamais de valeur et non qu'elle ne sont pas idéales pour ce faire.
1- Ton code ne compile pas, tu as sans doute oublié d'insérer la directive Option Explicit en en-tête de module. Là-dessus il faut blâmer Microsoft et personne d'autre : voir dans l'éditeur VBA Menu Outils/Options..., onglet Éditeur et cocher Déclaration des variables obligatoire ce qui ajoutera automatiquement la directive Option Explicit à tout nouveau module; Microsoft laisse par défaut, et c'est un défaut, cette case non cochée (misère). Ensuite compiler le code souvent, très souvent, à l'aide du menu Débogage/Compiler VBAProject.
2- La fonction RETARD ne retourne aucune valeur, elle se contente de modifier le paramètre passé en référence (dateactualisee). Auquel cas une procédure (Sub) aurait tout aussi bien fait l'affaire. Bien que ne retournant jamais quoi que ce soit, on peut parfaitement modifier un paramètre passé en référence à l'intérieur d'un procédure.
3- La variable dateinterval n'est déclarée nulle part, la compilation te l'aurait révélée. Aussi cette variable n'est utilisée qu'à un seul endroit dans DateAdd(dateinterval.Day, jours, dateactualisee.Value). Où donc voudras-tu saisir une valeur pour cette variable?
4- La fonction DateAdd ne supporte aucun paramètre Jours qui n'étant déclaré nulle part prend pour valeur initiale zéro (0) en tant qu'entier (Integer) et dateinterval.Day est inconnu au régiment. Revoir impérativement la syntaxe de la fonction DateAdd dans l'aide (F1).
5- Il est contre-indiqué de ne pas utiliser les constantes symboliques dans le code.
If reponse = 6 devrait se lire If reponse = vbYes et MsgBox("Souhaitez-vous retarder la date de règlement prévue ?", 36, "Prévoir retard") devrait se lire MsgBox("Souhaitez-vous retarder la date de règlement prévue ?",vbYesNo + vbQuestion , "Prévoir retard") C'est plus parlant.
Bref, un petit classeur exemple et quelques autres explications seraient de mise, en particulier la manière utilisée pour lancer cette fonction.
Ceci dit je laisse à d'autres le soin de poursuivre, j'ai d'autres bricoles au fourneau.
Cordialement,
Guy
Edité par Guy le 12/07/2014 01:19:19
|
|
|