XL 2010 Faire apparaitre USF à l'endroit ou je clique

creolia

XLDnaute Impliqué
Bonjour à tous je viens vous poser 2 questions et avoir un peu d'aide svp

je sais pas si c'est possible

1er question
es ce possible afficher mon userform1 à l'endroit ou je clique sur ma feuille
2eme question
comment faire pour fermer un userform juste en sortant la sourie de l'userform1(sans clic)

merci d'avance de votre aide
 

Lone-wolf

XLDnaute Barbatruc
Bonjour Creolia :)

Ceci pour la 1ère question

VB:
Private Sub Worksheet_SelectionChange(ByVal c As Range)
UserForm1.Show
UserForm1.Top = ActiveCell.Top + 70
UserForm1.Left = ActiveCell.Left + 90
End Sub

Quand à la 2ème, il faudrait qu'on en sache plus. Qu'est-ce que tu veux faire au juste?
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour le fil, bonjour le forum,

Il te faut modifier, au préalable, la propriété [StartUpPosition] de l'Userform avec la valeur : 0 - Manuel. Ensuite il te faudra ajuster les valeurs indiquées par Lone-Wolf car elles dépendent de ce que tu affiches dans l'application (bandeaux, menus, etc) et de la résolution de ton écran (ça je suis moins sûr)...
 

Jacky67

XLDnaute Barbatruc
Bonjour à tous
C'est comme avec le tango:p
Il faudra une piste de dance avant de lancer la musique.
Code:
Private Sub Worksheet_SelectionChange(ByVal c As Range)
    UserForm1.StartUpPosition = 0
    UserForm1.Top = ActiveCell.Top + 70
    UserForm1.Left = ActiveCell.Left + 90
    UserForm1.Show
End Sub
:)
 

Jacky67

XLDnaute Barbatruc

Pièces jointes

  • position_userform.xlsm
    17.2 KB · Affichages: 75
Dernière édition:

Si...

XLDnaute Barbatruc
Salut

En voilà un problème, d'apparence simple :oops: !

Le formulaire peut se placer n’importe où mais pour qu’il soit toujours visible entièrement cela demande une programmation très pointue (Api dans l’air) car il faut tenir compte des dimensions de l’écran, des largeurs des colonnes, des hauteurs des lignes, de l’emplacement de la cellule sélectionnée …

Si la plage d’appel est réduite (contenue dans le haut d'un écran), on peut y arriver assez simplement comme dans le fichier exemple *.

La position du formulaire est programmée à son initialisation en vertu de mon principe : regrouper au maximum tout ce qui le concerne dans sa page de codes.

*Il ne sera plus fonctionnel en changeant des constantes (hauteurs des lignes, largeurs des colonnes …)

édition : Jacky67, ton exemple nous montre des bouts de formulaire sur les bords (droit, bas)
 

Pièces jointes

  • Position UsF.xlsm
    17.8 KB · Affichages: 48
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Cette méthode de mon UFmCalend utilise les mêmes API mais tient compte du zoom de la feuille.
Il réagit bien sur fenêtre d'application réduite et quels que soient sa position et les menus présents mais garde des failles sur le mode d'affichage Mise en page.
VB:
Public Sub Posit(ByVal O As Object, Optional ByVal X As Double, Optional ByVal Y As Double)
Rem. ——— Vous pouvez au préalable positionner l'UserForm par rapport à quelque chose.
'  O: Ce par rapport à quoi vous voulez le positionner. X et Y indiqueront comment :
'  X: -1: Collé au coté gauche, 0: Centré horizontalement, 1: Collé au coté droit.
'  Y: -1: Collé au bord supérieur, 0: Centré verticalement, 1: Collé juste en dessous.
'  D'autres valeurs entraineront un recouvrement partiel ou un certain éloignement.
'  Mais rien ne vous empêche de rectifier encore ensuite la propriétés Left ou Top
'  de l'UFmCalend pour ajouter un interstice en points au bord de l'objet.
Dim U As Object, G As Double, D As Double, H As Double, B As Double, K As Double, Z As Double
If TypeOf O Is MSForms.Control Then
  G = O.Left: H = O.Top: Set U = O.Parent
  Do: K = (U.Width - U.InsideWidth) / 2
  G = G + U.Left + K: H = H + U.Top + U.Height - U.InsideHeight - K
  If Not TypeOf U Is MSForms.Frame Then Exit Do
  Set U = U.Parent: Loop
  D = G + O.Width: B = H + O.Height
Else
  Z = ActiveWindow.Zoom / 100
  K = GetDeviceCaps(GetDC(0), 88) / 72
  G = ActiveWindow.PointsToScreenPixelsX(O.Left * K * Z) / K
  D = ActiveWindow.PointsToScreenPixelsX((O.Left + O.Width) * K * Z) / K
  K = GetDeviceCaps(GetDC(0), 90) / 72
  H = ActiveWindow.PointsToScreenPixelsY(O.Top * K * Z) / K
  B = ActiveWindow.PointsToScreenPixelsY((O.Top + O.Height) * K * Z) / K
  End If
Me.Left = (X * (D - G + Me.Width + 6) + G + D - Me.Width - 6) / 2 + 3
Me.Top = (Y * (B - H + Me.Height + 6) + H + B - Me.Height - 6) / 2 + 3
End Sub
 

Lone-wolf

XLDnaute Barbatruc
Bonsoir tout le monde :)

Comme cela à été dit, tout dépend de la grandeur de l'écran et la taille du formulaire. Sur mon portable, la dernière ligne visible est la n°34 avec zoom par défaut. Avec le formulaire d'une hauteur et largeur de 283, la dernière cellule est I13 où je peux voir complètement l'userform; ensuite il sort de l'écran.

@creolia: tu peux aussi écrire comme ceci

VB:
Private Sub astreinte_Click()
ActiveCell.Interior.Color = astreinte.BackColor
Unload Me
End Sub

Private Sub effacer_Click()
ActiveCell.Interior.Color = effacer.BackColor
Unload Me
End Sub

Private Sub Garde_Click()
ActiveCell.Interior.Color = Garde.BackColor
Unload Me
End Sub

Private Sub groupe_Click()
ActiveCell.Interior.Color = groupe.BackColor
Unload Me
End Sub
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re

et voici les codes au complets

VB:
'A mettre dans ThisWorkbook
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
UserForm1.Show
End Sub

'------------------------------------------------------------
Private Sub garde_Click()
ActiveCell.Interior.Color = garde.BackColor
Unload Me
End Sub

Private Sub astreinte_Click()
ActiveCell.Interior.Color = astreinte.BackColor
Unload Me
End Sub

Private Sub groupe_Click()
ActiveCell.Interior.Color = groupe.BackColor
Unload Me
End Sub

Private Sub effacer_Click()
ActiveCell.Interior.Color = xlNone
Unload Me
End Sub

Private Sub creer_Click()
Dim Num&, Sh As Worksheet
Num = Feuil1.Range("z1").Value 'mettre le chiffre que tu veux
Num = Num + 1
Feuil1.Range("z1").Value = Num
Sheets.Add After:=Worksheets(Sheets.Count)
ActiveSheet.Name = "Feuille de Garde " & Num
End Sub

Private Sub imprimer_Click()
Unload Me
ActiveSheet.PageSetup.PrintArea = "$A$1:$G$33"   ' A modifier
ActiveSheet.PrintPreview
End Sub

Pour l'impression de pas oublier la mise en page et les sauts de pages.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
moi je souhaite qu'il me le met sur la cellule que j'ai cliquez
Avec toute méthode empirique, pour peu qu'on fige le ruban, réduise et déplace la fenêtre, ou change le scroll ou le zoom, et ça ne coïncidera plus avec la cellule ou la plage rectangulaire décidée. Alors qu'avec le code tout fait avec les API proposé par Jacky67 et moi même (dans ma 2ième partie, quand ce n'est pas pour un contrôle), si. Et sans avoir besoin de réglages au pif. Mais je vous avouerai que je l'applique en aveugle, du moins les 7 instructions fondamentales. C'est un des rares codes accessibles, sinon le seul, dont je n'ai rien réussi à comprendre de son fonctionnement.
 

creolia

XLDnaute Impliqué
Bonjour à tous et merci pour votre aide mais je doit être un peut bête je comprend pas du tout ou je doit mettre quoi j'ai tenter depuis une heure en mettant les différente macro dans userform puis la feuil1 ect mais rien ne ce passe ni la localisation du clic par apport à userform et ni la fermeture de ce dernier quand on en sort ou dois je mettre les différent élément
 

Discussions similaires

Statistiques des forums

Discussions
312 109
Messages
2 085 384
Membres
102 878
dernier inscrit
asmaa