XL 2016 Sélection dernière ligne, création de liste déroulante X fois, macro vba

BARNS

XLDnaute Junior
Bonjour,

J'aurais besoin d'aide pour un projet qui m'oblige à utiliser une macro qui doit créer plusieurs liste en fonction des choix fait par l'utilisateur. Si vous pouvez m'aider ça serait fabuleux.

A l'aide d'un code VBA :

Quand l'utilisateur appui sur le bouton de contrôle "ok" de la feuille User après avoir renseigné les champs : type de travée, nombre de travée, PAF. J'aimerais qu'une macro se lance et qu'elle fasse les étapes suivantes :
– sélectionner la cellule de la colonne B de la dernière ligne utilisée, descendre de 5 ligne
– créer une liste dépendante du choix précédent de l'utilisateur sur cette dernière cellule. Par exemple : si Travee_ST sélectionné par l'utilisateur, afficher une liste avec les différentes longueur 62, 56, 50, 44, 38; si Travee_MS sélectionné afficher la liste 60, 55, 50, 45, 37 etc. cf feuille datas
– répéter ces deux première étapes autant de fois que renseigner dans la case C7 nombre de travée.

J'ai écris quelque chose mais c'est extrêmement boiteux

Code:
Sub nbrtravee()

'définir la cellule 7C pour le nombre de boucle for à faire

Range("c7").Name = nbrspans

Dim nbrtravee As Integer

For i = 1 To nbrspans

'dessendre de deux ligne

DerniereLigneUtilisee = Range("B" & Rows.Count).End(xlUp).Row


Cells(BDerniereLigneUtilisee).Select


Selection.End(xlDown).Offset(5, 0).Select
'créer une liste relatif au taille de travée du type sélectionner

  With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="='Datas'!C7" '--> renvoi à la valeur sélectionner par l'utilisateur qui définis un tableau sur la page datas
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With

'répeter cela avec autant de travée sélectionner

Next
'ajouter une liste des taille de paf si oui pour paf

if c 11= "oui"

DerniereLigneUtilisee = Range("B" & Rows.Count).End(xlUp).Row


Cells(BDerniereLigneUtilisee).Select


Selection.End(xlDown).Offset(5, 0).Select

  With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="='Datas'!PAF"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With



End Sub


Dans le fichier sur la première feuille il y a un exemple sur la partie droite de ce que j'aimerais avoir.


Merci de votre aide :)
 

Pièces jointes

  • CONFPARTAGE.xlsm
    49.3 KB · Affichages: 12
Dernière édition:
Solution
RE Jacky67,

En fait si tu veux l'objectif c'est d'assembler différentes longueurs de travées mais on ne sait pas à l'avance combien.
Donc le nombre de travée va déterminer le nombre de liste déroulante qui vont se générer automatiquement en appuyant sur le bouton "ok". Ces listes vont a chaque fois se générer à la suite de la feuille (en descendant de 5 lignes).
J'ai réussi à faire ces différentes étapes mais là je suis bloqué sur le fait que la liste créée doit être dépendante du choix fait par l'utilisateur en C7.

Effectivement il y avait un problème de "S" je les ai ajouté partout pour être en cohérence avec la feuille "cannes tailles".

Tout se passe ici dans le code :

< With Selection.Validation
.Delete
.Add...

Jacky67

XLDnaute Barbatruc
Bonjour,

Je souhaite sélectionner la cellule de la colonne B de la dernière ligne utilisée. Puis répéter la création d'une liste autant de fois que définis par l'utilisateur (nbr de travee)

J'ai écris quelque chose mais c'est extrêmement boiteux

Code:
Sub nbrtravee()

'définir la cellule 7C pour le nombre de boucle for à faire

Range("c7").Name = nbrspans

Dim nbrtravee As Integer

For i = 1 To nbrspans

'dessendre de deux ligne

DerniereLigneUtilisee = Range("B" & Rows.Count).End(xlUp).Row


Cells(BDerniereLigneUtilisee).Select


Selection.End(xlDown).Offset(2, 0).Select
'créer une liste relatif au taille de travée du type sélectionner

  With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="='Datas'!C7" '--> renvoi à la valeur sélectionner par l'utilisateur qui définis un tableau sur la page datas
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With

'répeter cela avec autant de travée sélectionner

Next
'ajouter une liste des taille de paf si oui pour paf

if c 11= "oui"

DerniereLigneUtilisee = Range("B" & Rows.Count).End(xlUp).Row


Cells(BDerniereLigneUtilisee).Select


Selection.End(xlDown).Offset(2, 0).Select

  With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="='Datas'!PAF"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With



End Sub


J'ai mis en rouge les choses qui manque de syntaxe après peut être qu'il ya des prob structuraux je ne sais pas.

Merci de votre aide :)
Bonsoir,
Si tu n'obtiens pas de réponse, c'est peut-être que la demande est absolument incompréhensible
 

BARNS

XLDnaute Junior
Bonsoir,
Si tu n'obtiens pas de réponse, c'est peut-être que la demande est absolument incompréhensible
Après mettre cassé la tête toute la journée, j’avoue que j'avais pas le recul nécessaire. Après ce qui me frustre c'est que j'ai pas la syntaxe. J'ai pensé que quelqu'un ayant l'habitude de coder verrait directement les erreurs dans mon code.
Mais je te l'accorde la forme était à revoir. J'ai modifié le message et rajouté un exemple dans le fichier.
Merci pour ta réponse.
 
Dernière édition:

Jacky67

XLDnaute Barbatruc
Après mettre cassé la tête toute la journée, j’avoue que j'avais pas le recul nécessaire. Après ce qui me frustre c'est que j'ai pas la syntaxe. J'ai pensé que quelqu'un ayant l'habitude de coder verrait directement les erreurs dans mon code.
Mais je te l'accorde la forme était à revoir. J'ai modifié le message et rajouté un exemple dans le fichier.
Merci pour ta réponse.
RE,
D'où vient ce 3 en nombre de travée ???
J'ai compris que:
Feuille User, le nombre de travées devait se modifier selon le type de travée

Pour ce faire
Il est inutile de coder cela en vba
J'ai enlevé les "s" du type de travées sur la feuille Datas
Jai nommé les type de travées "Type"
J'ai mis une liste de validation sur C7, C9, C11 de la feuille User
Pour All, il n'y a pas de série "All"
A voir en PJ si c'est bien cela que tu souhaites
 

Pièces jointes

  • CONFPARTAGE.xlsm
    54.9 KB · Affichages: 8
Dernière édition:

BARNS

XLDnaute Junior
RE Jacky67,

En fait si tu veux l'objectif c'est d'assembler différentes longueurs de travées mais on ne sait pas à l'avance combien.
Donc le nombre de travée va déterminer le nombre de liste déroulante qui vont se générer automatiquement en appuyant sur le bouton "ok". Ces listes vont a chaque fois se générer à la suite de la feuille (en descendant de 5 lignes).
J'ai réussi à faire ces différentes étapes mais là je suis bloqué sur le fait que la liste créée doit être dépendante du choix fait par l'utilisateur en C7.

Effectivement il y avait un problème de "S" je les ai ajouté partout pour être en cohérence avec la feuille "cannes tailles".

Tout se passe ici dans le code :

< With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="= travees_ST" 'ici en réalité je devrais mettre travees la variable que j'ai définis mais j'ai laissé travees_ST pour voir si du moins ca marchait avec les noms de tableaux

End With >

Si j'ai bien compris je dois déclarer la cellule C7 comme une variable "variable" correspondant bien au nom des tableaux de la feuille data.

si l'utilisateur choisi travees_st alors dans le code C7 --> travées_st --> tableau travées_st datas --> travee

pour pouvoir l'utiliser dans la boucle for.

La macro que j'ai commencé à écrire est dans les modules sous le nom de nbrtravee.

Si tu ouvres le fichier et click sur "ok" tu comprendras un peu mon objectif.

Merci beaucoup de ton aide,

PB
 

Pièces jointes

  • CONFPARTAGE.xlsm
    60.5 KB · Affichages: 7

Jacky67

XLDnaute Barbatruc
RE Jacky67,

En fait si tu veux l'objectif c'est d'assembler différentes longueurs de travées mais on ne sait pas à l'avance combien.
Donc le nombre de travée va déterminer le nombre de liste déroulante qui vont se générer automatiquement en appuyant sur le bouton "ok". Ces listes vont a chaque fois se générer à la suite de la feuille (en descendant de 5 lignes).
J'ai réussi à faire ces différentes étapes mais là je suis bloqué sur le fait que la liste créée doit être dépendante du choix fait par l'utilisateur en C7.

Effectivement il y avait un problème de "S" je les ai ajouté partout pour être en cohérence avec la feuille "cannes tailles".

Tout se passe ici dans le code :

< With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="= travees_ST" 'ici en réalité je devrais mettre travees la variable que j'ai définis mais j'ai laissé travees_ST pour voir si du moins ca marchait avec les noms de tableaux

End With >

Si j'ai bien compris je dois déclarer la cellule C7 comme une variable "variable" correspondant bien au nom des tableaux de la feuille data.

si l'utilisateur choisi travees_st alors dans le code C7 --> travées_st --> tableau travées_st datas --> travee

pour pouvoir l'utiliser dans la boucle for.

La macro que j'ai commencé à écrire est dans les modules sous le nom de nbrtravee.

Si tu ouvres le fichier et click sur "ok" tu comprendras un peu mon objectif.

Merci beaucoup de ton aide,

PB
Re..
La Procédure
VB:
Sub nbrtravee()
Dim dernierecellule_colonne&, i&
    Sheets("User").Activate
    Range("a18:B" & Rows.Count).Clear
    dernierecellule_colonne = 18   'debut ligne 18
    For i = 1 To [c9]
        Cells(dernierecellule_colonne, 1) = "Long travee"
        With Cells(dernierecellule_colonne, 2)
            .Borders.Weight = xlMedium    'Mise en forme
            With .Validation
                .Delete
                .Add Type:=xlValidateList, Formula1:="=" & [c7]
            End With
        End With
        dernierecellule_colonne = dernierecellule_colonne + 5
    Next i
    If Trim(UCase([c11])) = "OUI" Then
        Cells(dernierecellule_colonne, 1) = "Paf"
        With Cells(dernierecellule_colonne, 2)
            .Borders.Weight = xlMedium
            With .Validation
                .Delete
                .Add Type:=xlValidateList, Formula1:="=PAF"
            End With
        End With
    End If
End Sub
 

Pièces jointes

  • CONFPARTAGE V2.xlsm
    58.5 KB · Affichages: 7
Dernière édition:

BARNS

XLDnaute Junior
Merci beaucoup pour la solution au problèmes, ton code est quand même beaucoup plus propre, je n'en demandais pas tant.

J'ai l'impression que ça se corse un peu plus et je voulais savoir ton avis pour la structure générale.

Une fois que j'ai les listes déroulantes pour chaque travée, l'utilisateur doit choisir la longueur.

Avec la longueur choisi une représentation des piquages s'affiche sur la feuille excel comme ceci

Par exemple si l'utilisateur choisi travée standard puis 62 en longueur, en se rapportant au tableau Cannes, cela correspond à 21 piquages

1623418229689.png


Après l'utilisateur indique quels piquages sont fermés en supprimant les 1

1623418323035.png


Puis il obtient ses longueurs par piquage en fonction de sa config

Donc ici avec
– hauteur arroseur 3
– type de canne souple

Il a pour chaque piquage correspondants selon le tableaux cannes les longueurs (840, 1290 etc)

1623418751903.png


Il pourra ensuite savoir combien de chaque longueur il a besoin.

1623419057859.png


Et pour chaque piquage ouvert on pourra mettre le matériel correspondant en fonction de sa position sur la travée.

1623419545807.png




Donc j'ai plusieurs questions si tu veux bien y répondre :

Est-ce que finalement je serais peut être pas mieux de passer par une suite d'user Form?
Je m'étais dis que créer un bouton macro a chaque création d'étape pouvais gagner en simplicité et rapidité mais finalement je ne suis pas sûre ..

Puis je me pose la question si la manière dont j'ai trié les données est optimale, j'avais pensé que chercher les infs dans un tableaux multifactoriel serait mieux mais en fait ça semble plus compliqué.

Qu'en penses tu ?

Est-ce que tu connais des supports pour chercher de 'linf, comme un site avec le listing de toute les fonctions et abréviations ?

Par exemple

<
With Cells(dernierecellule_colonne, 2)
.Borders.Weight = xlMedium 'Mise en forme
With .Validation
.Delete
.Add Type:=xlValidateList, Formula1:="=" & [F7] 'liste déroulante
End With
End With >

Il y a pas un endroit ou on peut voir tout les types qu'on peut ajouter ?



Merci de ta réponse,

Bon Week End!
 

Pièces jointes

  • CONFPARTAGE v3.xlsm
    58.3 KB · Affichages: 9

Jacky67

XLDnaute Barbatruc
Merci beaucoup pour la solution au problèmes, ton code est quand même beaucoup plus propre, je n'en demandais pas tant.

J'ai l'impression que ça se corse un peu plus et je voulais savoir ton avis pour la structure générale.

Une fois que j'ai les listes déroulantes pour chaque travée, l'utilisateur doit choisir la longueur.

Avec la longueur choisi une représentation des piquages s'affiche sur la feuille excel comme ceci

Par exemple si l'utilisateur choisi travée standard puis 62 en longueur, en se rapportant au tableau Cannes, cela correspond à 21 piquages

Regarde la pièce jointe 1108236

Après l'utilisateur indique quels piquages sont fermés en supprimant les 1

Regarde la pièce jointe 1108237

Puis il obtient ses longueurs par piquage en fonction de sa config

Donc ici avec
– hauteur arroseur 3
– type de canne souple

Il a pour chaque piquage correspondants selon le tableaux cannes les longueurs (840, 1290 etc)

Regarde la pièce jointe 1108238

Il pourra ensuite savoir combien de chaque longueur il a besoin.

Regarde la pièce jointe 1108240

Et pour chaque piquage ouvert on pourra mettre le matériel correspondant en fonction de sa position sur la travée.

Regarde la pièce jointe 1108241



Donc j'ai plusieurs questions si tu veux bien y répondre :

Est-ce que finalement je serais peut être pas mieux de passer par une suite d'user Form?
Je m'étais dis que créer un bouton macro a chaque création d'étape pouvais gagner en simplicité et rapidité mais finalement je ne suis pas sûre ..

Puis je me pose la question si la manière dont j'ai trié les données est optimale, j'avais pensé que chercher les infs dans un tableaux multifactoriel serait mieux mais en fait ça semble plus compliqué.

Qu'en penses tu ?

Est-ce que tu connais des supports pour chercher de 'linf, comme un site avec le listing de toute les fonctions et abréviations ?

Par exemple

<
With Cells(dernierecellule_colonne, 2)
.Borders.Weight = xlMedium 'Mise en forme
With .Validation
.Delete
.Add Type:=xlValidateList, Formula1:="=" & [F7] 'liste déroulante
End With
End With >

Il y a pas un endroit ou on peut voir tout les types qu'on peut ajouter ?



Merci de ta réponse,

Bon Week End!
Re..
Il m'est très difficile de te donner une réponse concernant l'organisation de tes données cela est particulier au but que l'on souhaite atteindre.
En ce qui concerne les réductions de code (abréviation) cela dépend du niveau et de pratique dans le domaine Excel
Exemple en PJ concernant les validations.
Le but de la question initiale étant atteint, je te suggère d'ouvrir un nouveau post.
 

Pièces jointes

  • exemple pour validation.xlsm
    26.9 KB · Affichages: 15
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
311 724
Messages
2 081 937
Membres
101 844
dernier inscrit
pktla