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,
 
Solution
Bonjour albatore78,
J'ai l'impression que la position du résultat se fait en mode "graphique" et que l'on ne définit pas cette dernière de manière habituelle (ex : E14) . Et du coup je ne vois pas comment on fait pour dire que le résultat doit être dans une case précise.

Il n'y a pas grand chose à faire mais quand même, un minimum ! (Voir le fichier)

2020-09-24_080232.jpg

albatore78

XLDnaute Nouveau
Ah tu es sûrement en Office 64 bits et ça a détecté de mauvaises déclarations des fonctions API.
J'ai corrigé. Essaie à nouveau avec le fichier modifié du message #28.
J'ai aussi rendu la recherche et le highlight multi-mots.

Dis-moi si ça marche.. ou pas. Je suis en 32 bits et suis intéressé de savoir si les déclarations des fonctions de l'API sont OK ou pas.
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.
 

albatore78

XLDnaute Nouveau
Dans le code du UserForm:
Regarde la pièce jointe 1079169

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.
Au temps pour moi, c'était pourtant super lisible :) . J'essaie d'insérer tout ça dans mon fichier.
 

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.

Agenda6.gif
 

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.

Agenda7.gif
 
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

Statistiques des forums

Discussions
294 211
Messages
1 936 900
Membres
188 102
dernier inscrit
benefaballe