Fonction à argument variable sur VBA (EXCEL) [Résolu/Fermé]

Signaler
Messages postés
15
Date d'inscription
mardi 26 août 2014
Statut
Membre
Dernière intervention
27 août 2014
-
Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
-
Bonjours ,
je me suis beaucoup aider de ce site pour résoudre les problème que j'ai avec VBA mais un problème ou je ne trouve aucune réponse. je travaille dans une entreprise pour quelque jours encore et je me suis lancée dans un travaille plutôt important (avis personnelle n'ayant commencer la programmation qu'au début du mois sans base) celui d'automatiser un tableau de formation . il leur permettra d'ajouter des formations sur des colonne , avec la date a laquelle il l'ont obtenue et la date a laquelle elle ne sera plus valide . Mais le problème c'est dans la partie du code qui concerne la date de fin de validité . je souhaite mettre la fonction MOIS.DECALER ("ici une case, et ici une TextBox) avec a l'intérieur 2 variable l'une étant la case et l'autre une donnée entrée dans un userform, et qui s'applique sur un certain nombre de ligne qui peut varier sur plusieurs année (le nombre d'employer).
voilà le code:

nb_lignes_nom = Cells(2, 1).End(xlDown).Row

For i = 4 To nb_lignes_nom
Cells(i, 5).Select
Selection.FormulaLocal = "=MOIS.DECALER((i,4);UserForm2.TextBox2.Value)"

Next

l'erreur que me donne VBA ce trouve dans la ligne la plus longue et il s'agit de l'erreur : 1004
"erreur défini par l'application ou par l'objet"

Merci d'avance.

9 réponses

Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
slt,

userform2.textbox2.value
sont entre les guillemets donc VBA comsidere ce mot et l'écrit tel quel dans ta formule (i.e. aucun sens pour la fonction décaler)

essaye :

Selection.FormulaLocal = "=MOIS.DECALER((" & i & ",4);" & UserForm2.TextBox2.Value & ")" 


et tient moi au courant
Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
si ça s'obstine à ne pas marcher :
CDate(cells(i,4).Value)


et attention il subsiste un bug que je ne sait pas résoudre avec les date dont le jour est inferieur à 12 mais si t'as pas de soucis t'embête pas avec ça
Messages postés
15
Date d'inscription
mardi 26 août 2014
Statut
Membre
Dernière intervention
27 août 2014

la seconde modification fait a fait "disparaitre" la fonction elle n'est plus dans les case concernée.Mais il n'affiche pas d'erreur , j'ai vérifier le placement des "&" et des guillemets mais il sont bon ...
Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
utilise la fontion debogage de VBA et donne mois les valeurs des variables quand la ligne est surlignée en jaune.
j'aurais besoin que tu mette un espion sur
Cells(i, 5).FormulaLocal

et
CDate(cells(i,4).Value) 


Et remet moi le code que tu as écrit stp
Messages postés
15
Date d'inscription
mardi 26 août 2014
Statut
Membre
Dernière intervention
27 août 2014
>
Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019

Je ne pourrai vérifier ça que demain , je ne suis que stagiaire la bas et a l heure de d'ébauche je me fais "sortir " pour qu il puisse fermer --'
Du coups je vous donnerai les info demain a la première heure . Merci
Messages postés
15
Date d'inscription
mardi 26 août 2014
Statut
Membre
Dernière intervention
27 août 2014

j'ai mis un espion et dans la boucle la valeur que renvoie les deux bout de code au début sont "erreur" , il rentre dans la boucle et leur valeur change pour cell(i,5).Formulalocal la valeur devient : ""
et pour la formule CDate (Cells (i,4)Value) il affiche 00:00:00
je renvoie le code avec le dessus (qui peuvent peut être avoir un intérêt .

If CheckBox1.Value = True Then

Range("E1").Select
Selection.EntireColumn.Insert
Range("E3").Value = "programmée"
Selection.EntireColumn.AutoFit
Selection.EntireColumn.Insert
Range("E3").Value = "fin de validité"
Selection.EntireColumn.AutoFit

nb_lignes_nb_lignes_nom = Cells(2, 1).End(xlDown).Row

For i = 4 To nb_lignes_nom
Cells(i, 5).FormulaLocal = "=MOIS.DECALER(" & CDate(Cells(i, 4).Value) & ";" & UserForm2.TextBox2.Value & ")"
Next
Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
Si Cdate ne marche pas c'est que le contenu de la case (i,4) ne peut pas être convertit en date.
ça vaudrait le coup que tu force le format de cette colonne à un format de date (celui que tu veux, par macro ou à a main) pour voir si ça change quoique ce soit
Messages postés
15
Date d'inscription
mardi 26 août 2014
Statut
Membre
Dernière intervention
27 août 2014

il s'agit de changer le format de la colonne. je ne suis pas sur de ce que j'ai écrit pour faire le changer (avec des recherche sur les différent site qui en parle) et si c'est bon , rien ne se produit.

For i = 4 To nb_lignes_nom
Cells(i, 4) = Format ("dd.mm.yy")
Cells(i, 5).FormulaLocal = "=MOIS.DECALER(" & CDate(Cells(i, 4).Value) & ";" & UserForm2.TextBox2.Value & ")"
Next
Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
pour le format essaye cells(i,4).NumberFormat = "dd/mm/yyyy"
Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
sans le Cdate ça faisait quoi ?
Messages postés
15
Date d'inscription
mardi 26 août 2014
Statut
Membre
Dernière intervention
27 août 2014

la même chose --' et il ne met au format date que la premier date ... je ne comprend rien...
Messages postés
15
Date d'inscription
mardi 26 août 2014
Statut
Membre
Dernière intervention
27 août 2014

avec les espion cette fois-ci , la valeur de : " Cells(i, 4).Value" est vide , c'est peut être ça qui bloque le processus ?
Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
Ce serait possible que tu mette ton ficher dans un Cijoint pour que je puisse regarder directement ou c'est confidentiel ?
Messages postés
15
Date d'inscription
mardi 26 août 2014
Statut
Membre
Dernière intervention
27 août 2014

ce n'est pas "confidentielle" mais trop sécuriser du coup , je ne peut rien faire passer par internet ... je peut parcontre mettre tout le code et l'userform.


Private Sub CommandButton2_Click()
Unload Me
End Sub

Private Sub ok_Click()
Dim nb_lignes_nom As Integer

Range("D1").Select
Selection.EntireColumn.Insert
Range("D1").Value = UserForm2.TextBox1.Value
Selection.VerticalAlignment = xlBottom
Selection.HorizontalAlignment = xlCenter
Range("D3").Value = "obtention"
Selection.EntireColumn.AutoFit

If CheckBox1.Value = True Then

Range("E1").Select
Selection.EntireColumn.Insert
Range("E3").Value = "programmée"
Selection.EntireColumn.AutoFit
Selection.EntireColumn.Insert
Range("E3").Value = "fin de validité"
Selection.EntireColumn.AutoFit

nb_lignes_nb_lignes_nom = Cells(2, 1).End(xlDown).Row

For i = 4 To nb_lignes_nom
Cells(i, 4).NumberFormat = "dd/mm/yyyy"
Cells(i, 5).NumberFormat = "m/d/yyyy"
Cells(i, 5).FormulaLocal = "=MOIS.DECALER((" & CDate(Cells(i, 4).Value) & ",4);" & UserForm2.TextBox2.Value & ")"
Next

Range("D1:F1").Merge
Selection.VerticalAlignment = xlBottom
Selection.HorizontalAlignment = xlCenter

Else
End If
End Sub
Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
c'est normal le :
 nb_lignes_nb_lignes_nom = Cells(2, 1).End(xlDown).Row
?

ta variable nb_ligne_nom doit pas avoir de valeur et reste à 0 du coup il ne sais pas jusqu'ou compter et il sort tout de suite je pense


à toute fin utile : quand tu mets du code sur CCM utilise le petit bouton au dessus de la zone de texte et précsise que c'est du basic c'est plus facil à lire et ça met un peu de couleur dans ce monde de brut :-)
Messages postés
15
Date d'inscription
mardi 26 août 2014
Statut
Membre
Dernière intervention
27 août 2014

ah... ça explique pas mal de problème ... merci ^^ . je le saurais pour la prochaine fois comme ça . ça semble mieux fonctionner par la même occasion ... mais maintenant il m'affiche #N/A sur chaqu'une des lignes ou il ne "trouve" ou ne lis pas la case avec la "donner source "
Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
normalement tu a un petit bouton 'Attention' qui te décris ce qui ne va pas dans ta formule non ?

1/C'est des cas isolés celles qui ne marchent pas ou c'est toutes les lignes ?

2/ pourquoi tu mets pas cells (i,5) et cells(i,4) au même format ? (simple curiosité ça n'a aucune incidence sur le code)
Messages postés
15
Date d'inscription
mardi 26 août 2014
Statut
Membre
Dernière intervention
27 août 2014

c'est sur tout les lignes, oui il me dit que la "case départ" est vide alors qu'il y a toujours le bout de code dans VBA . pour les Dates , je faisais des test rien de mieux pour apprendre et voir les différence ^^ .
jai placer un espion sur i , il varie bien a chaque passage , du code étape par étape , il ne reste donc que la notation qui n'as pas changer depuis le début . (si j'ai enlever le CDate (qui m'indiquer une erreur 1004) et comme je n'est pas "compris" son sens (et que j'aimerai ètre capable d'expliquer ce que je fais) surtout que l'on demande de "changer la valeur de la ligne au format date mais maintenant qu'il y est de base ...
Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
essaye en enlevant le cdate et le .value et en mettant .address à la place
Messages postés
15
Date d'inscription
mardi 26 août 2014
Statut
Membre
Dernière intervention
27 août 2014

c'est fait , ça donne le même résultat --'
Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
Rhhhhhoooooo.....
quand tu va dans la case avec le #N/A et que tu cliques dans la barre des fx il te met bien la cellule d'avant en encadré bleu (ou mauve ou n'importe quel autre couleur) ?
Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
 Cells(i, 5).FormulaLocal = "=MOIS.DECALER((" & CDate(Cells(i, 4).Value) & ",4);" & UserForm2.TextBox2.Value & ")"



une parenthese en trop après le DECALER non ?
Messages postés
15
Date d'inscription
mardi 26 août 2014
Statut
Membre
Dernière intervention
27 août 2014


j'ai ça avec ce code (je n'arrive pas a indiqué que c'est du basic... ou alors je sais pas ou ...) :
 

nb_lignes_nom = Cells(2, 1).End(xlDown).Row

For i = 4 To nb_lignes_nom
Cells(i, 4).NumberFormat = "dd/mm/yyyy"
Cells(i, 5).NumberFormat = "dd/mm/yyyy"
Cells(i, 5).FormulaLocal = "=MOIS.DECALER(" & Cells(i, 4) & "; " & UserForm2.TextBox2.Value & ")"
Next
Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
c'est normal qu'il te mette #N/A vu qu'il n'y a pas tous les arguments

essaye :
    nb_lignes_nom = Cells(2, 1).End(xlDown).Row
    
    For i = 4 To nb_lignes_nom
    Cells(i, 4).NumberFormat = "dd/mm/yyyy"
    Cells(i, 5).NumberFormat = "dd/mm/yyyy"
    Cells(i, 5).FormulaLocal = "=MOIS.DECALER(" & Cells(i, 4).address(false,false, xlA1, false,false) & "; " & UserForm2.TextBox2.Value & ")"
    Next


pour faire du code tu surligne ton code tu vas sur l'icone à côté de S et tu clique sur 'Basic'
Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
et là normalement il va te dire que la case d'avant est vide donc valeur = 0 (donc en date : 1/1/1900 et décaler en fonction)
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 463
Salut,

Je ne fais que passer...

Le mode d'emploi pour les balises <code> (au cas ou) est ICI.

Cordialement,
Pijaku
Messages postés
15
Date d'inscription
mardi 26 août 2014
Statut
Membre
Dernière intervention
27 août 2014

Merci beaucoup d'avoir pris le temps de répondre ^^ , euh question subsidiaire, qu'est ce que tu a rajouter à la fin ? ces "false" et cette "xlA1" a quoi servent-ils et pourquoi ne pas les avoir utiliser avant ?
Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
https://docs.microsoft.com/fr-fr/office/vba/api/excel.range.address?redirectedfrom=MSDN

ravi d'avoir pu t'aider (entre stagiaire faut se serrer les coudes)