Rendre dynamique

Voilà j'avais ce petit code qui fonctionnait nickel et j'ai voulu le rendre dynamique...

Sub inserlist()

    With Wshebdo.Range("C2:AI366").Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=Alist" & CmbSect
        .IgnoreBlank = True
        .InCellDropdown = True
    End With

End Sub

Et j'ai pondu ceci pour ajuster la dernière colonne.

Sub inserlist()

NbColTot ' fonction comptant mes colonnes OK

i = WsCal.[A2:A367].Rows.Count ' Compte mes Lignes OK
j = NbColTot()
h = Cells(2, 3)
k = Cells(i, j)

   With Wshebdo.Range(h:k).Validation ' et la rien ne va plus il me se sélectionne que les colonnes H à K
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=Alist" & CmbSect
        .IgnoreBlank = True
        .InCellDropdown = True
    End With

End Sub

Je suis un peu fâché entre les différentes syntaxse, mon problème vient sans doute de là!

En résumé ma sélection va de la cellule "C2" à la cellules "derniere ligne,derniereColonnes"

Merci d'avance pour vos idées

Bonsoir,

With Wshebdo.Range(h & ":" & k).Validation

Je fais juste la correction syntaxique, sans regarder plus loin...

Note quand même que i va être égal à 366 (pas 367)

.Add xlValidateList, , , "=Alist" & CmbSect

Ça c'est pour ôter les éléments inutiles...

Bonne soirée.

Merci MFerrant mais ....Ban c'est pas que ca mon problème on dirait,

i et j sont bons

h et k sont vides.....

Je devrai sélectionner la plage ( C2 et XXXX366) théoriquement non? ou je sélectionne que leur contenue ?


MFerrand a écrit :

Bonsoir,

Note quand même que i va être égal à 366 (pas 367)

Bonne soirée.

pour 2016 c'est nickel 366 jours !de toute façon ça joue qu'a 1 ligne

N'aurais-tu pas voulu faire :

h = Cells(2, 3).Address
k = Cells(i, j).Address

Je commence à me perdre dans tes divers sujets...

peut etres je test

Merci

Perdue!

c'est pas ça non plus.

h et k sont tjs vides

Je postes mon fichier générateur de planning, il est un peu en chantier et va bientôt ressembler à une usine à gaz,

Au démarrage, dans le userform, seuls les deux champs du haut sont actifs.

ils permettent la sélection de l'année et du secteur. à partir de là elle ajoute le nom des agents et des postes dans les différents onglets, ajuste l’écriture des formules au nombre d'agents/postes, les différentes MFC,et l'impression mais ma sub insertlist initiale qui me permet d'ajouter ma liste d'agent en menu déroulant,ne s'ajustait pas à la taille réel de mon champs de données

Sub inserlist()
    With Wshebdo.Range("C2:AI366").Validation
    End With
End Sub

j'ai voulu rendre ça juste plus dynamique 8)

j'en suis là!

7p-rh-6-6.xlsm (262.40 Ko)

Si tes variables sont vides, tu remontes !

Tes Cells sont "nus" (pas de points devant, ni objet) donc quelle est la feuille active au moment de l'exécution ?

Cells(2, 3) c'est C2.... ?

L'autre dépend des calculs : revoir ce qui est calculé et tester le résultat...

Yes c est bien c2 l onglets concerné est wshebdo.

Mon calcul de ligne ne s ajuste encore pas il reste sur 366. Je trouve le bon nombre de colonnes. Mais je suis incapable de sélectionner la plage entre C2 et cette foutue cellules 366 de la Nième colonne.

Sans données => erreurs à répétition car l'absence de données obligatoires n'est pas gérée...

La fonction ne peut rien renvoyer, elle réfère à des plages vides...

(NB- les noms sont dans le classeur, les rattacher à la feuille ne sert à rien dans ce cas...)

Normalement à ce stade de la macro là colonne À est rempli. Et les entête de colonnes sont déjà copier également. Et ma macro compte nickel les ligne et les colonnes donc je devrai pouvoir déterminer l'ensemble de la plage

Les plages nommées (unicellulaires) utilisées par ta fonction étant vides, comment veux-tu qu'on sache ce qu'elles doivent contenir !

Re Bonjour,

Les plages unicellulaires sont forcément vides puisque je dois les remplir avec mes listes d agents. Mais je pensais pouvoir utiliser leur coordonnées pour définir la zone d insertion de ma liste de validation. Avec la cellule d origine plus le nombre de colonnes et le nombre de lignes je devrais déterminer l emplacement de ma dernière cellules du tableau. Et du coup avoir la plage d'insertion de ma liste de validation.

Je ne peux suivre tes cheminements, tu m'y ferais passer la journée... et j'ai pas mal d'autres occupations prévues !

Mais dans ta fonction, c'est la valeur de ces plages que tu utilises...

Il faut que tu décantes l'ensemble, pour redémarrer le raisonnement sur une base absolument sûre.

Voilà j'ai finalement réussi c'était beaucoup plus simple que je ne le pensais

If WsCal.[A367].Value = " " Then
i = 366
Else
i = 367
End If
j = NbColTot()

   With Wshebdo.Range(Cells(2, 3), Cells(i, j)).Validation '
       .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=Alist" & CmbSect
        .IgnoreBlank = True
        .InCellDropdown = True
    End With
End Sub

Si ça marche, tant mieux !

Mais je te fais remarquer que tu testes au départ si A367 contient le caractère espace (ou caractère 32 de la table).

Et pour ce qui est de Validation.Add, tu peux conserver les arguments Type et Formula1, et supprimer les autres qui sont à leur valeur par défaut ou n'interviennent pas.

C'est ainsi qu'on allège le code à écrire ! (et qu'on gagne du temps également).

Et en passant les arguments par position plutôt que par nom, on gagne encore en écriture !

Cordialement.

ok merci pour le conseil, je corrige ca

Rechercher des sujets similaires à "rendre dynamique"