VBA probleme de target adress
Bonjour,
Je vous présente une macro que j'ai rédigé mais qui me pose problème avec une erreur 424 (objet requis). Le débogage bloque sur la déclaration de "cellule" (cellule=target.address)
Sub Macro1()
lig_fin = Cells(Cells.Rows.Count, "B").End(xlUp).Row + 1
Range("F8:F" & lig_fin).Select
cellule = Target.Address
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:= _
"=IF(" & cellule & "<>"""",OFFSET(d_client,MATCH(" & cellule & "&""*"",l_client,0)-1,,SUMPRODUCT((MID(l_client,1,LEN(" & cellule & "))=TEXT(" & cellule & ",""0""))*1)),l_client)"
.IgnoreBlank = True
.InCellDropdown = True
.ShowInput = False
.ShowError = False
End With
End SubLe projet est de dupliquer une liste déroulante à saisie semi automatique sur une plage de cellule qui varie selon les nombre d'enregistrement (F8:F&ling_fin)
Je déclare ma plage de cellule à considérer (lig_fin suivi du range.select), jusque la pas de problème
je dois définir cellule pour pouvoir dupliquer cette liste déroulante,, mais la VBA ne veut plus. Pourtant target.adress defini bien l'adresse d'une cellule, non ? et dans la mesure ou j'ai demander avant de suivre la plage (F8 --> F&lig_fin) ceci met parait suivre la logique...
Du coup moi aussi je bloque et ne comprend pas : besoin d'aide et d'un regard plus aguerri que le mien
En vous remerciant par avance de l'interêt que vous porterez à mon probleme
Cordialement,
Ju.
Bonjour,
Outre que tes variables ne sont pas déclarées (il est conseillé de les déclarer en tête de procédure), tu appelles une variable non initialisée, donc reconnue comme type Variant vide...
Par ailleurs utiliser un nom qui est utilisé par VBA pour renvoyer un objet Range lorsque tu utilises des évènements, peut créer des confusions. En fait il y a bien eu confusion mais c'est toi qui l'a faite en pensant que Target avait une existence permanente, il n'en a que lorsque VBA le renvoie comme élément de localisation d'un évènement.
Cordialement.
Mferrand bonjour et merci pour ton retour.
Du coup, je suis un peu embêté dans ma formule pour indiquer la référence de la cellule.
1/ declaration, je suis ok ; donc lig_fin as integer et cellule as string
2/ si j'initialise ma variable cellule ; je la rédigerait de la manière suivante : cellule = cell (i;6) (correspond à cellule i et colonne f
Ce qui induit que je passe sur une redaction de type for i=8 to lig_fin
Pourtant la macro bloque sur la declaration de l'initialisation de cellule. Comment faire ?
(je vous joins ci dessous, la macro corrigé suite à votre commentaire)
Sub Macro1()
Dim cellule As String
Dim lig_fin As Integer
lig_fin = Cells(Cells.Rows.Count, "B").End(xlUp).Row + 1
cellule = Target.Address
cellule = cell(i, 6)
For i = 8 To lig_fin
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:= _
"=IF(" & cellule & "<>"""",OFFSET(d_client,MATCH(" & cellule & "&""*"",s_client,0)-1,,SUMPRODUCT((MID(s_client,1,LEN(" & cellule & "))=TEXT(" & cellule & ",""0""))*1)),s_client)"
.IgnoreBlank = True
.InCellDropdown = True
.ShowInput = False
.ShowError = False
End With
Next
End SubMon souci étant de pouvoir dupliquer cette liste deroulante sur une plage correspondant à une colonne de F8 à la derniere ligne renseignée + 1. c'est un vrai casse tête pour moi.
Cordialement,
Ju.
PS / j'ai déclaré cellule as string car la liste renvoie à une chaine de caractère (mais je pense qu'il y a une erreur sur cette declaration, sans savoir la corriger)
cellule = Target.Address
cellule = cell(i, 6)Tu as toujours Target.Address, il faut le supprimer.
Et remplacer par Cells(i, 6).Address.
Et Cells et non cell !
Cordialement.
J'ai corrigé ma variable cellule selon vos indications, néanmoins je bascule sur l'erreur 1004. sur cellule = cells(i, 6).address
Sub Macro1()
Dim cellule As String
Dim lig_fin As Integer
lig_fin = Cells(Cells.Rows.Count, "B").End(xlUp).Row + 1
cellule = Cells(i, 6).Address
For i = 8 To lig_fin
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:= _
"=IF(" & cellule & "<>"""",OFFSET(d_client,MATCH(" & cellule & "&""*"",s_client,0)-1,,SUMPRODUCT((MID(s_client,1,LEN(" & cellule & "))=TEXT(" & cellule & ",""0""))*1)),s_client)"
.IgnoreBlank = True
.InCellDropdown = True
.ShowInput = False
.ShowError = False
End With
Next
End SubJe suis désolé d'insister mais j'arrive pas à comprendre C'est le string qui gène ? j'ai essayé avec un variant à la place mais même résultat. (erreur 1004)
Cordialement,
Cells sans qualificateur d'objet réfère à la feuille active. Est-ce que tu es sur cette feuille lorsque tu lances ?
Et accessoirement, est-ce que Lig_fin est sur la même feuille ?
Bonjour,
Oui, les deux font références à la feuille active.
cells (sur la colonne F) et lig_fin (sur la colonne B) de la feuille active
Pour le test, je passe par une macro que j'actionne via un bouton, mais au final la macro sera intégrée dans un Private Sub Worksheet_Change(ByVal Target As Range)
Cordialement,
Ju.
Oh ! C'était trop gros ! On finit par ne plus rien voir !!
i variable non déclarée et non initialisé.. Tu veux donc l'adresse de la cellule F0, cherche-la sur la feuille, tu verras pourquoi Excel ne veux pas la fournir !
Bonjour,
Je suis désolé mais je ne sais pas comment rédiger ce que vous me demandez.
Si j'initialise I = 8 (f8) alors je lui fixe la valeur f8 en permanence.
Hors je veux que i change de valeur entre F8 et F& lig_fin (F8 pour la validation de données en F8, F9 pour la validation de données en F9, etc...jusqu'à la dernière ligne du tableau +1).
Savez vous comment faire ?
J'ai un peu de mal à suivre...! mais si le i se confond avec ton compteur de boucle, c'est à l'intérieur de la boucle que tu dois définir cellule. Elle variera à chaque tour de boucle.
Maintenant faut que je mange un peu !!!!
Ok, j'ai contourné le probleme en donnant un nom à la formule. ainsi j'evite ce probleme de reference dans la boucle.
Merci quand même (je m'en suis sorti finalement bien que je n'ai pas reussi,à passer par la gestion des cells)
Sujet clos.