Fonction à argument variable sur VBA (EXCEL)

Résolu/Fermé
rutabagans Messages postés 15 Date d'inscription mardi 26 août 2014 Statut Membre Dernière intervention 27 août 2014 - Modifié par rutabagans le 26/08/2014 à 15:41
borntobealive Messages postés 138 Date d'inscription jeudi 17 juillet 2014 Statut Membre Dernière intervention 25 février 2019 - 27 août 2014 à 16:26
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

borntobealive Messages postés 138 Date d'inscription jeudi 17 juillet 2014 Statut Membre Dernière intervention 25 février 2019 7
26 août 2014 à 16:09
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
0
rutabagans Messages postés 15 Date d'inscription mardi 26 août 2014 Statut Membre Dernière intervention 27 août 2014
Modifié par rutabagans le 26/08/2014 à 16:45
merci d'avoir répondu aussi vite , le code marche , mais ne varie pas avec la date inscrite dans le les cases de la colonne 4.

je ne comprend pas comment fonctionnent les "&" , a quoi il serve ça fait plusieurs fois que j'en voit dans les codes ?
0
borntobealive Messages postés 138 Date d'inscription jeudi 17 juillet 2014 Statut Membre Dernière intervention 25 février 2019 7
26 août 2014 à 16:54
& permet de concaténer des chaine de caractere et d'intercaler ainsi des variable ( comme to i ou userform2.textBox.Value) dans des string.

tu avais oublier Cells et essaye de t'affranchir du select qui ralentit ton code :

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

For i = 4 To nb_lignes_nom 
Cells(i, 5).FormulaLocal = "=MOIS.DECALER(" & Cells(i,4) ";" & UserForm2.TextBox2.Value & ")" 
0
rutabagans Messages postés 15 Date d'inscription mardi 26 août 2014 Statut Membre Dernière intervention 27 août 2014
26 août 2014 à 16:56
merci de votre aide je galérais depuis ce matin sur ce code .
0
borntobealive Messages postés 138 Date d'inscription jeudi 17 juillet 2014 Statut Membre Dernière intervention 25 février 2019 7
26 août 2014 à 16:57
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
0
rutabagans Messages postés 15 Date d'inscription mardi 26 août 2014 Statut Membre Dernière intervention 27 août 2014
26 août 2014 à 17:06
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 ...
0
borntobealive Messages postés 138 Date d'inscription jeudi 17 juillet 2014 Statut Membre Dernière intervention 25 février 2019 7
27 août 2014 à 10:32
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
0
rutabagans Messages postés 15 Date d'inscription mardi 26 août 2014 Statut Membre Dernière intervention 27 août 2014
Modifié par rutabagans le 27/08/2014 à 11:21
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
0
borntobealive Messages postés 138 Date d'inscription jeudi 17 juillet 2014 Statut Membre Dernière intervention 25 février 2019 7
27 août 2014 à 11:47
pour le format essaye cells(i,4).NumberFormat = "dd/mm/yyyy"
0
borntobealive Messages postés 138 Date d'inscription jeudi 17 juillet 2014 Statut Membre Dernière intervention 25 février 2019 7
27 août 2014 à 11:41
sans le Cdate ça faisait quoi ?
0
rutabagans Messages postés 15 Date d'inscription mardi 26 août 2014 Statut Membre Dernière intervention 27 août 2014
27 août 2014 à 11:44
la même chose --' et il ne met au format date que la premier date ... je ne comprend rien...
0
rutabagans Messages postés 15 Date d'inscription mardi 26 août 2014 Statut Membre Dernière intervention 27 août 2014
27 août 2014 à 11:55
avec les espion cette fois-ci , la valeur de : " Cells(i, 4).Value" est vide , c'est peut être ça qui bloque le processus ?
0
borntobealive Messages postés 138 Date d'inscription jeudi 17 juillet 2014 Statut Membre Dernière intervention 25 février 2019 7
27 août 2014 à 13:59
Ce serait possible que tu mette ton ficher dans un Cijoint pour que je puisse regarder directement ou c'est confidentiel ?
0
rutabagans Messages postés 15 Date d'inscription mardi 26 août 2014 Statut Membre Dernière intervention 27 août 2014
Modifié par rutabagans le 27/08/2014 à 14:16
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
borntobealive Messages postés 138 Date d'inscription jeudi 17 juillet 2014 Statut Membre Dernière intervention 25 février 2019 7
27 août 2014 à 14:42
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 :-)
0
rutabagans Messages postés 15 Date d'inscription mardi 26 août 2014 Statut Membre Dernière intervention 27 août 2014
27 août 2014 à 14:57
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 "
0
borntobealive Messages postés 138 Date d'inscription jeudi 17 juillet 2014 Statut Membre Dernière intervention 25 février 2019 7
27 août 2014 à 15:18
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)
0
rutabagans Messages postés 15 Date d'inscription mardi 26 août 2014 Statut Membre Dernière intervention 27 août 2014
27 août 2014 à 15:26
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 ...
0
borntobealive Messages postés 138 Date d'inscription jeudi 17 juillet 2014 Statut Membre Dernière intervention 25 février 2019 7
Modifié par borntobealive le 27/08/2014 à 15:46
essaye en enlevant le cdate et le .value et en mettant .address à la place
0
rutabagans Messages postés 15 Date d'inscription mardi 26 août 2014 Statut Membre Dernière intervention 27 août 2014
27 août 2014 à 15:46
c'est fait , ça donne le même résultat --'
0
borntobealive Messages postés 138 Date d'inscription jeudi 17 juillet 2014 Statut Membre Dernière intervention 25 février 2019 7
27 août 2014 à 15:52
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) ?
0
borntobealive Messages postés 138 Date d'inscription jeudi 17 juillet 2014 Statut Membre Dernière intervention 25 février 2019 7
27 août 2014 à 15:53
 Cells(i, 5).FormulaLocal = "=MOIS.DECALER((" & CDate(Cells(i, 4).Value) & ",4);" & UserForm2.TextBox2.Value & ")"



une parenthese en trop après le DECALER non ?
0
rutabagans Messages postés 15 Date d'inscription mardi 26 août 2014 Statut Membre Dernière intervention 27 août 2014
Modifié par rutabagans le 27/08/2014 à 16:14

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
0
borntobealive Messages postés 138 Date d'inscription jeudi 17 juillet 2014 Statut Membre Dernière intervention 25 février 2019 7
27 août 2014 à 16:14
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'
0
borntobealive Messages postés 138 Date d'inscription jeudi 17 juillet 2014 Statut Membre Dernière intervention 25 février 2019 7
27 août 2014 à 16:16
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)
0
pijaku Messages postés 12259 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 9 août 2022 2 709
27 août 2014 à 16:19
Salut,

Je ne fais que passer...

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

Cordialement,
Pijaku
0
rutabagans Messages postés 15 Date d'inscription mardi 26 août 2014 Statut Membre Dernière intervention 27 août 2014
27 août 2014 à 16:20
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 ?
0
borntobealive Messages postés 138 Date d'inscription jeudi 17 juillet 2014 Statut Membre Dernière intervention 25 février 2019 7
27 août 2014 à 16:26
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)
0