Fonction à argument variable sur VBA (EXCEL)
Résolu
rutabagans
Messages postés
15
Statut
Membre
-
borntobealive Messages postés 167 Statut Membre -
borntobealive Messages postés 167 Statut Membre -
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.
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
-
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-
-
& 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 & ")" -
-
-
-
-
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-
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 -
-
-
-
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 -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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 :-) -
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)-
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 ... -
-
-
-
-
Cells(i, 5).FormulaLocal = "=MOIS.DECALER((" & CDate(Cells(i, 4).Value) & ",4);" & UserForm2.TextBox2.Value & ")"
une parenthese en trop après le DECALER non ? -

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 -
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'-
-
Salut,
Je ne fais que passer...
Le mode d'emploi pour les balises <code> (au cas ou) est ICI.
Cordialement,
Pijaku -
-
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)
-