Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Saisie semi-automatique (VBA ou formule mais pas en insérant des objets)

albatore78

XLDnaute Nouveau
Bonjour @tous,

Après avoir consulté plusieurs site, je n'arrive pas à trouver ce que je veux. En effet, je souhaite avoir dans une cellule un menu déroulant, dont la liste provient d'une autre feuille, avec une saisie semi-automatique. Seul hic, il faut que la personne ne puisse pas saisir autre chose que ce qui se trouve dans le menu déroulant.

J'ai trouvé plusieurs méthodes mais à chaque fois il y a quelque chose qui ne me convient pas. En effet, en utilisant "Validations de données", on est obligé de retirer le message d'alerte bloquant. J'i essayé également avec la formule DECALER mais même constat.

Auriez-vous une solution qu'elle soit en VB ou avec une formule ?

En vous remerciant par avance,

Bonne journée,
 

albatore78

XLDnaute Nouveau
Ca fonctionne. Impeccable. Mais du coup si je ne suis pas sur la même version à mon boulot, il faut que je change le code VBA ?
 

Dudu2

XLDnaute Barbatruc
Mais du coup si je ne suis pas sur la même version à mon boulot, il faut que je change le code VBA ?
Non, le code marchait pour Office 32 bits (chez moi) et maintenant marche pour Office 64 bits (Chez toi). Donc, sauf surprise qu'il ne fait jamais exclure tant que ça n'est pas vérifié, ça devrait marcher pour toutes les versions d'Office.

A noter que cette version est plus complexe car le double-clic de la sélection doit être intercepté dans les évènements de la feuille. Donc il y a du code dans le UserForm et du code dans la feuille.
 

Dudu2

XLDnaute Barbatruc
Dans le code du UserForm:


Prévoir la hauteur du UserForm qui vient au-dessus.
Prévoir que la largeur de la colonne concernée (dans l'exemple la colonne K) sera adaptée en largeur à l'élément le plus long de la liste affichée.
 

patricktoulon

XLDnaute Barbatruc
re
je me pose une question là
ne manque t il pas quelque chose ici
Me.Top = PixelsToPointsY(ActiveWindow.PointsToScreenPixelsY(0)) _
+ ActiveSheet.Range(CelluleTableauListe).Top * (ActiveWindow.zoom / 100) _
- Me.Height
Me.Left = PixelsToPointsX(ActiveWindow.PointsToScreenPixelsX(0)) _
+ ActiveSheet.Range(CelluleTableauListe).Left * (ActiveWindow.zoom / 100)

chez moi ce serait plutôt
PixelsToPointsY(ActiveWindow.Activepane.PointsToScreenPixelsY(0))


c'est quoi le but en fait c'est positionner le userform au niveau d'une certaine cellule?
 

Dudu2

XLDnaute Barbatruc
Bonjour patricktoulon,
c'est normal ce positionnement userform au click sur bouton de la feuille ?
En tous cas c'est le positionnement cherché, c'est à dire juste au-dessus de la cellule qui doit contenir le haut du tableau structuré (il aurait ne pas être structuré d'ailleurs).
Ça suppose que la cellule choisie pour ça (constante CelluleTableauListe) soit visible ce qui ne semble pas être le cas dans ton 1er screenshot.
Ce serait d'ailleurs possible d'en imposer la présence dans le .VisibleRange si nécessaire.

le hightlight ne fonctionne pas chez moi W7 2013 32 bits
Le highlight n'est pas sur la TextBox (d'ailleurs ça me semble impossible de coloriser le texte d'une TextBox) mais sur la liste présentée dans le tableau dont les éléments sont sélectionnés par rapport aux mots contenus dans la TextBox.

PixelsToPointsY(ActiveWindow.Activepane.PointsToScreenPixelsY(0))
Je ne connais pas cette propriété de la fenêtre. Le positionnement se fait au dessus du tableau.

 

Dudu2

XLDnaute Barbatruc
@albatore78,

Tu peux reprendre le fichier en message #28 que j'ai simplifié en virant un module grâce à une instruction de patricktoulon pour récupérer les correspondances Pixels / Points.

le positionnement ne fonctionne qu'avec excel plein écran
Pas chez moi, ça fonctionne en fenêtre réduite.
Encore une fois si la cellule cible du tableau est visible.
A ce stade je n'ai pas forcé sa présence dans le .VisibleRange.
Ni géré les déplacements de fenêtre. Tant que ce n'est pas utile.

 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
oui c'est pas tout a fait ca le reste de la formule
c'est ça
VB:
'-----------------------
'Initialisation UserForm
'-----------------------
Private Sub UserForm_Initialize()
    Dim i As Integer
    Dim Z As Double
    Dim ptopx As Double
   Dim cel As Range
   Me.StartUpPosition = 0
   Set cel = ActiveSheet.Range(CelluleTableauListe)
    With ActiveWindow.ActivePane
        Z = .Parent.Zoom / 100
        ptopx = (.PointsToScreenPixelsX(72) - .PointsToScreenPixelsX(0)) / 72  'coeff point to pixel

        'Positionnement du UserForm au dessus de la cellule du tableau de la liste des évènements à sélectionner

        Me.Top = .PointsToScreenPixelsY(0) / ptopx + cel.Top * (Z) - Me.Height
        Me.Left = .PointsToScreenPixelsX(0) / ptopx + cel.Left * (Z)
    End With

    'Charge les évènements en table
    TabÉvènements = Range("Tableau1").Value

    'Charge la table des évènements épurés
    ReDim TabÉvènementsÉpurés(1 To UBound(TabÉvènements, 1))
    For i = 1 To UBound(TabÉvènements, 1)
        TabÉvènementsÉpurés(i) = ÉpurerChaine(CStr(TabÉvènements(i, 1)))
    Next i

    'Créer le tableau de la liste des évènements à sélectionner
    Call CréerTableauListe

    'Valorise tableau de la liste des évènements à sélectionner
    Call ValoriserTableauListe

    'Place le curseur en TextBox
    Me.TextBox1.Text = ""
End Sub
 

patricktoulon

XLDnaute Barbatruc
re
ici
VB:
ReDim TabÉvènementsSélection(1 To UBound(TabÉvènements, 1))
        For i = 1 To UBound(TabÉvènements, 1)
            TabÉvènementsSélection(i) = TabÉvènements(i, 1)
        Next i

c'est pas la meme chose que
VB:
TabÉvènementsSélection=application.transpose(TabÉvènements)

ici
VB:
Do While 1
            If Len(TexteÉpuré) = Len(Replace(TexteÉpuré, "  ", " ")) Then Exit Do
            TexteÉpuré = Replace(TexteÉpuré, "  ", " ")
        Loop
cela fait la même chose je crois
VB:
       Do While Len(TexteÉpuré) <> Len(Replace(TexteÉpuré, "  ", " "))
            TexteÉpuré = Replace(TexteÉpuré, "  ", " ")
        Loop
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…