Voir tout le temps une image, (avec scroll) [Résolu]

- - Dernière réponse : ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 4 mai 2013 à 08:13
Re bonjour! :)

Voila un petit truc que j'aimerai bien réalisé. Le but est de pouvoir scroller (ça ce dit comme ça non?) vers le bas de la feuille est de voir toujours sur la gauche un menu.
Ce n'est pas l'option "Ne pas déplacer ou redimensionner... etc." qu'il me faut,
J'ai essayé aussi avec figer les volet mais je ne peux pas puisque j'ai les titres des colonnes, ce qui me fige uniquement l'image "Menu" qui est au même niveau que les titres de colonnes!

Voici une image pour expliquer un peu mieux :



Quand je scroll j'aimerais que "le menu" en entier soit tout le temps visible même quand on est en bas du tableau!
Afficher la suite 

20/38 réponses

Meilleure réponse
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
3
Merci
>Bon.
Pour que je sois bien certain d'avoir compris, dis-moi si c'est bien ceci que tu veux (mets ce code sur une feuille neuve) :
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

'les fonctions sui suivent ne sont là que si l'on veut supprimer la barre de titre
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" Alias _
"GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long


Private F As Object

 
Private Sub Worksheet_Activate()
With ActiveWindow
    .SplitColumn = 2
    .SplitRow = 2
    .Panes(1).ScrollRow = 1
    .Panes(1).ScrollColumn = 1
    ActiveWindow.FreezePanes = True
End With
   Set F UserForm1 '>> mets ici le nom de TON userform (celui à afficher sur la feuille Excel)
   coucou
End Sub

Private Sub Worksheet_Deactivate()
On Error Resume Next
  F.Hide
End Sub

Private Sub coucou()
   Dim bordv As Integer, bordh As Integer
   Range("A1").Activate
   cacher_barre_titre  '=====>>>> uniquement si l'on veut cacher la barre de titre
   bordv = GetSystemMetrics(15) - (GetSystemMetrics(5) * 5)
   bordh = GetSystemMetrics(5) * 3
   If ActiveWindow.DisplayHeadings = False Then
     bordv = GetSystemMetrics(5) * -4
     bordh = GetSystemMetrics(15)
   End If
   With F
     .Show
     .Top = ActiveWindow.Panes(1).VisibleRange.Top + Application.Top + Application.Height - Application.UsableHeight - bordh
     .Left = ActiveWindow.Panes(1).VisibleRange.Left + Application.Left + Application.Width - Application.UsableWidth + bordv 'Columns(ActiveWindow.ScrollColumn).Left + Range("A1").Left + bordv
   End With
End Sub

Private Sub cacher_barre_titre()
   Dim hWnd As Long, Style As Long
   hWnd = FindWindow(vbNullString, F.Caption)
   Style = GetWindowLong(hWnd, -16) And Not &HC00000
   SetWindowLong hWnd, -16, Style
   DrawMenuBar hWnd
   DoEvents
End Sub





________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 191 internautes nous ont dit merci ce mois-ci

Commenter la réponse de ucfoutu
Commenter la réponse de BIOoOAG123
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Bonjour,
Ouvre ton aide VBA à la rubrique Window.Split, propriété
fais des petits tests
Intéresse-toi ensuite à toutes les rubriques concernant les objets Panes, ainsi qu'à la rubrique FreezePanes
Rien de complexe.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
ucfoutu j'ai essayé ce que tu m'as dit, mais en fait je veux ni fractionner, ni figer les volets (donc ni split ni panes) :) je veux faire ça :


With Worksheets("Database")
.Database.Visible = True
.Database.Left = .Columns(Windows(1).VisibleRange.Column).Left + 30 'modifie la position
.Database.Top = .Rows(Windows(1).VisibleRange.Row).Top + 2
End with


Mais non pas avec un bouton ici Database mais avec une image. Impossible de trouver la solution.
Commenter la réponse de BIOoOAG123
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Je ne comprends pas alors vraiment ce que tu veux faire !
Te reste la possibilité d'afficher en permanence un userform avec ce que tu veux dedans !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
Ce que je veux faire c'est que les image reste en haut a gauche peut importe ou va l'utilisateur dans la feuille. qu'il puisse toujours y accéder.
Commenter la réponse de BIOoOAG123
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Avec un userform, ta difficulté sera de le placer exactement où tu veux sur ta feuille de calcul.
Il te faudra alors inévitablement passer par au moins une fonction de l'Api de Windows (GetSystemMetrics). Et d'autre encore si tu veux cacher la barre de titre de ce userform. Il te faudra par ailleurs bûcher d'autres propriétés VBA, dont UsableHeight et UsableWidth et faire des calculs conditionnels suyr la base de ActiveWindow.DisplayHeadings (selon que True ou False)
On sait faire tout cela, bien sûr (je l'ai mis en oeuvre au moins deux fois dans mes applis)
Rien de cela ne me parait à la portée réelle d'un débutant.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Ce que je veux faire c'est que les image reste en haut a gauche peut importe ou va l'utilisateur dans la feuille. qu'il puisse toujours y accéder.

Je l'avais bien compris !
Et ce que tu appelles "une image" n'en est pas une (puisque des boutons sont là) !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
Si c'est une image que j'ai créé, c'est juste qu'il y a une macro associé, quand je dis bouton je parle de l'objet "bouton" d'excel.
Je vais essayer avec l'userform, mais ça me parait beaucoup de travail pour peu de chose :(
Commenter la réponse de BIOoOAG123
0
Merci
Bon bé j'ai trouvé mais c'était relativement dur! Je vous met le code, peut être que ça vous sera utile un jour ou l'autre. A mettre dans la feuille concernée :

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

Dim cell As Range

Application.ScreenUpdating = False
With Worksheets(2)
.Shapes("Image 5").Visible = True
.Shapes("Image 5").Top = .Rows(Windows(1).VisibleRange.Row).Top + 2
.Shapes("Image 5").Left = .Columns(Windows(1).VisibleRange.Column).Left + 30
End With
Application.ScreenUpdating = True

End Sub


Comme ça les boutons sont toujours à la portée de l'utilisateur!
Commenter la réponse de BIOoOAG123
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
0
Merci
Quand tu dis "Les boutons", est-ce que ça veut dire que tu as plusieurs images qui servent chacune à activer une macro ou c'est une seule image avec plusieurs boutons dans cette même image ?


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Commenter la réponse de cs_MPi
0
Merci
nop des images avec chacune une seule macro dessus
Commenter la réponse de BIOoOAG123
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Finalement ce que tu appelais UNE "image" s'avère être PLUSIEURS images Excel insérées sur ta feuille et auxquelles tu as affecté une macro par image.
Ouais... Tu gagnerais alors vraiment à utiliser plutôt, comme je l'ai dit plus haut, un userform. Les avantages seraient nombreux, à commencer par celui de ne pas mobiliser toute une colonne inutilement.
Tu pourrais alors : soit toujours afficher ce userform au même endroit (le moins gênant) de ta feuille de calcul, soit même carrément juste à côté de la cellule que tu sélectionnes (Target, dans ton évènement Selection_Change !)

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
0
Merci
Ou encore créer des menus sur click droit, ce qui n'empêche jamais de voir tout ce qu'il y a sur la feuille...


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Commenter la réponse de cs_MPi
0
Merci
ça me parait un peu compliqué avec l'UserForm et comme je suis tout sauf informaticien! à moins que tu ais un tuto ou quelque chose, forum autres? qui l'explique un minimum comment faire?
Et pour le clique droit j'y ai pensé, mais ça n'enlève pas justement le menu déjà présent (de base), ou l'on peut rajouter dans celui déjà présent des lignes etc..? ps: j'ai trouvé un totu, je l'ai au travail, mais lui ça enlevé tout ce qui été déjà présent dans le "menu" du clique droit.
Commenter la réponse de BIOoOAG123
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
0
Merci
Dans le click droit, tu peux soit tout enlever soit ajouter tes menus.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Commenter la réponse de cs_MPi
0
Merci
Je regarderai un peu plus sur le click droit demain matin au boulot! :) Et pour l'UserForm ucfoutu?

Bonne soirée ! :)
Commenter la réponse de BIOoOAG123
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Et pour l'UserForm ucfoutu?

Je veux bien t'écrire cela, mais tu risqueras de ne pas y comprendre grand-chose (il va y avoir des "petits" calculs conditionnels)

Bon. Il va me falloir environ 20 minutes pour écrire cette chose.

Pendant ce temps : ajoute à ton appli un userform avec sa propriété showmodal = false et mets-lui dedans des boutons (peu importe lesquels. Juste pour que tu constates le placement).

A dans environ 25 minutes , donc


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Cà y est ? Tu es prêt (tu as fait ce userform, comme demandé ?)

Alors voilà :

Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

'les fonctions sui suivent ne sont là que si l'on veut supprimer la barre de titre
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" Alias _
"GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long


Private F As Object

 
Private Sub Worksheet_Activate()
   Set F UserForm1 '>> mets ici le nom de TON userform (celui à afficher sur la feuille Excel)
   coucou
End Sub

Private Sub Worksheet_Deactivate()
  F.Hide
End Sub

Private Sub coucou()
   Dim bordv As Integer, bordh As Integer
   Range("A1").Activate
   cacher_barre_titre  '=====>>>> uniquement si l'on veut cacher la barre de titre
   bordv = GetSystemMetrics(15) - (GetSystemMetrics(5) * 5)
   bordh = GetSystemMetrics(5) * 3
   If ActiveWindow.DisplayHeadings = False Then
     bordv = GetSystemMetrics(5) * -4
     bordh = GetSystemMetrics(15)
   End If
   With F
     .Show
     .Top = Application.Top + Application.Height - Application.UsableHeight - Rows(ActiveWindow.ScrollRow).Top + Range("A1").Top - bordh
     .Left = Application.Left + Application.Width - Application.UsableWidth - Columns(ActiveWindow.ScrollColumn).Left + Range("A1").Left + bordv
   End With
End Sub

Private Sub cacher_barre_titre()
   Dim hWnd As Long, Style As Long
   hWnd = FindWindow(vbNullString, F.Caption)
   Style =  GetWindowLong(hWnd, -16) And Not &HC00000
   SetWindowLong hWnd, -16, Style
   DrawMenuBar hWnd
   DoEvents
End Sub


Ce code un peu bâclé est à mettre sur la feuille sur laquelle tu veux afficher ton userform en haut et à gauche et d'où il ne bougera pas en "scrollant".





________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
Trop fort ucfoutu! :)

Alors plusieurs truc,

Private Sub Worksheet_Deactivate()
  F.Hide
End Sub


Il me dit que F n'est pas une variable déclarée, donc je lui met P4_Menu (le nom de mon UserForm, pour qu'il ne m'embête plus!


Bon du coup ça marche, mais l'UserForm se met en plein milieu (Ps : J'ai deux volet donc ma 1ere cellule de active window est C3)

J'essayerai de modifier
.Top = Application.Top + Application.Height - Application.UsableHeight - Rows(ActiveWindow.ScrollRow).Top + Range("A1").Top - bordh
.Left = Application.Left + Application.Width - Application.UsableWidth - Columns(ActiveWindow.ScrollColumn).Left + Range("A1").Left + bordv


En le mettant comme ça je pense que ça devrait fonctionner non?
.Top = Application.Top + Application.Height - Application.UsableHeight - Rows(ActiveWindow.ScrollRow).Top + Range("A1").Top - bordh
.Left = Application.Left + Application.Width - Application.UsableWidth - Columns("A:A").Left + Range("A1").Left + bordv



Par contre le plus gros problème est que ça freeze le classeur et que rien n'est accessible sur le classeur à part l'UserForm.


Enfin en tout cas chapeau l'artiste! :)
Commenter la réponse de BIOoOAG123