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

Signaler
-
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
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!

38 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
219
1)
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.

cela veut dire que tu as lu en diagonale mon message de 07:19:53 (relis-le donc ! j'y ai même SOULIGNE quelque-chose ! )
2)
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!

cela veut dire que :
- soit tu n'as pas copié mon code complètement
- soit tu n'as pas mis le nom de TON userform à toi, à cette ligne :
Set F UserForm1 '>> mets ici le nom de TON userform (celui à afficher sur la feuille Excel)

3)
mais l'UserForm se met en plein milieu

Je ne vois pas pourquoi ! ===>>> montre donc ton code
________________________
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.
Oui autant pour moi, j'avais pas mis showmodal en false.

2) Si si, j'ai fais tout ce que tu as dit il me sort toujours cette erreur.


3) avec
.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

l'UserForm n'apparait pas, enfin du moins s'il appariait, je sais pas ou.


Je remplace par ça :

.Top = Application.Top + Application.Height - Application.UsableHeight - Rows(ActiveWindow.ScrollRow).Top + 80 - bordh
.Left = Application.Left + Application.Width - Application.UsableWidth - Columns("A:A").Left + Range("A1").Left + bordv


Mais du coup il apparait pas forcément tout le temps?
Et pas forcément au même endroit?
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
BIOoOAG123, est-ce que tu travailles avec 1 ou 2 écrans ?
Dans le 2e cas, ça complique les choses...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Non non avec un seul! ^^ c'est déjà compliqué avec un alors avec deux!
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
Avant de jouer avec .Top, .Left et compagnie, mets
.StartUpPosition = 0
pour mettre en mode "Manuel"

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
219
Je voudrais bien voir la totalité de ce que tu as écrit !
Car je viens de tester et retester plusieurs fois ===W>> aucune faille chez moi !


________________________
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.
Je pense que c'est les volets qui mettent le bazar!




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 P4Menu '>> mets ici le nom de TON userform (celui à afficher sur la feuille Excel)
   coucou
End Sub

Private Sub Worksheet_Deactivate()
  P4Menu.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
     .StartUpPosition = 0
     .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


Sans volet le code est parfait :), avec ça met l'UserForm un peu n'importe ou..
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
219
Ah ! Je préfère cela !
Bon !
as-tu vraiment besoin de tes volets ?
Si non : supprime-les
Si oui :
- comment-sont-ils disposés ? (Code ?)
- sur quel volet veux-tu l'Userform ?
Et j'essaierais alors sur ces nouvelles bases, mais uniquement si volets vraiment nécessaires (car d'autres calculs à faire !)


________________________
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.
Oui j'en ai absolument besoin.. Vu que c'est des tableau assez grand et j'ai besoin d'avoir le titre des colonne en haut et le nom du client à gauche(sur les lignes)

Alors j'ai 2 volets, créés à la main.
Vertical : qui bloque les colonnes A et B. (nom client sur la B et emplacement du menu sur la A)
Et horizontal : qui bloque les 2 premières lignes. (Nom des colonne 2 et rien sur la 1, pour aérer un peu le tableau)

Je veux l'UserForm en haut à gauche donc en gros à la cellule "A1", donc c'est à la fois sur le volet horizontal et vertical :/
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
219
pas certain d'avoir compris ta configuration.
Est-ce celle-ci ? (sur un classeur neuf)
Private Sub Worksheet_Activate()
  With ActiveWindow
    .SplitColumn = 2
    .SplitRow = 2
  End With
End Sub

si oui : tu as 4 volets. Dans lequel souhaites-tu l'userform ?



________________________
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.
C'est pas fractionné, mais avec des volets

Private Sub Worksheet_Activate()
  With ActiveWindow
    .SplitColumn = 2
    .SplitRow = 2
    ActiveWindow.FreezePanes = True
  End With
End Sub
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
219
et la réponse à :
si oui : tu as 4 volets. Dans lequel souhaites-tu l'userform ?

?
________________________
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.
Celui en haut à gauche, (mais il dépassera sur celui en bas à gauche, car celui en haut à gauche est trop petit pour contenir l'userform)
Oui c'est exactement ça, un grand merci, je vais l'essayer sur mon classeur, faut juste que je finisse un truc avant. :)

Juste une petite question, ça veut dire quoi ces 2 lignes :

.Panes(1).ScrollRow = 1
.Panes(1).ScrollColumn = 1


Tu pourras m'expliquer un tout ptit peu après? que je puisse savoir à quoi les éléments de cette macro correspondent, mais aussi pouvoir la refaire un jour ou l'autre!

Je sais que user32 c'est un "élément" de windows qui permet d’interagir avec plein de chose( J'ai commencé rapidement le C++ et ils en parlaient) , mais après je ne comprend pas grand chose..
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
219
Je t'expliquerai plus tard. Je dois préparer une ligne légère pour mon petit-fils que je vais emmener avec moi à la pêche.


________________________
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.
Sur mon classeur de test ça marche parfaitement! :)
Donc un grand merci pour ton aide, sinon jamais je n'y serai arrivé!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
219
Content pour toi.
clos alors le sujet (tag réponse acceptée là où est la solution).


________________________
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.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
219
Bon. Je réponds maintenant à :
Tu pourras m'expliquer un tout ptit peu après? que je puisse savoir à quoi les éléments de cette macro correspondent, mais aussi pouvoir la refaire un jour ou l'autre!

Je sais que user32 c'est un "élément" de windows qui permet d’interagir avec plein de chose( J'ai commencé rapidement le C++ et ils en parlaient) , mais après je ne comprend pas grand chose.


Je n'ai utilisé ScrollRow et ScrollColumn que dans le but d'être certain d'afficher tout en hut du 1er volet la plage A1.
Pourquoi ? Parce qu'il était toujours possible qu'en mode création des gestes aient été accomplis avant de figer. Il ne s'agit donc là que d'une protection (d'un "garde-fou", quoi. Rien de plus).

User32 n'est pas un "élément" de Windows, mais une des librairies de l'Api de Windows. Cette librairie contient plusieurs fonctions qui, déclarées depuis VB, y deviennent utilisables.
Il serait par contre vain de tenter de t'y initier en quelques mots. Chaque fonction de l'Api de Windows a ses finalités, ses paramètres, ses structures, etc ... dont la connaissance est nécessaire (si on veut les utiliser valablement).
Il est absolument normal que l'utilisation des fonctions de l'Api de Windows t' "échappe". Ce ne sont pas des connaissance VBA, qui sont là nécessaires, mais d'autres (l'API de Windows).
Bon week-end


________________________
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.
1 2