Modifier une valeur selon positionnement dans la feuille

7 réponses
Avatar
Roland Miller
Bonjour,

Je me demande si cela est possible.

Dans une feuille j'ai plus de 6000 lignes. Et pour plus de 1250 "groupes de=
lignes" j'ai une ent=C3=AAte dont j'utilise le figer les volets dont seule=
ment une valeur change d'un groupe de lignes =C3=A0 un autre.

Est-il possible de modifier la valeur de cette cellule selon le positionnem=
ent dans la feuille =E2=80=A6 par exemple par le d=C3=A9roulement vers le b=
as ou vers le haut?

Merci =C3=A0 l'avance.

7 réponses

Avatar
Roland Miller
Bonjour à nouveau,
En cherchant davantage … je réussi à faire ce dont je sou haite (voir plus bas) mais … par un évènement SelectionCh ange. L'usager aurait donc à cliquer dans la feuille.
Serait-il possible de … créer … un évènement Scroll? À ce serait parfait. ???
Sub RememberWindowPosition()
If ActiveSheet.Name = Feuil54.Name Then
With ActiveWindow
aRow = .ScrollRow
aColumn = .ScrollColumn
End With
aRange = Selection.Address
'MsgBox (aRow)
If aRow > Feuil54.Range("CN_FMDetFilterSelectZone").Row And _
aRow < Feuil54.Range("CN_FMDetFilterSelectZone").Row + Feuil54.Range("C N_FMDetFilterSelectZone").Rows.Count - 1 Then
Feuil54.Unprotect Feuil7.Range("CN_ValidShPwd").Value
Feuil54.Range("B14").Value = Feuil54.Cells(aRow, Feuil54.Range("C N_FMDetFilterSelectZone").Column).Value
End If
End If
End Sub
Avatar
MichD
Le 15/07/19 à 12:10, Roland Miller a écrit :
Bonjour à nouveau,
En cherchant davantage … je réussi à faire ce dont je souhaite (voir plus bas) mais … par un évènement SelectionChange. L'usager aurait donc à cliquer dans la feuille.
Serait-il possible de … créer … un évènement Scroll? À ce serait parfait. ???
Sub RememberWindowPosition()
If ActiveSheet.Name = Feuil54.Name Then
With ActiveWindow
aRow = .ScrollRow
aColumn = .ScrollColumn
End With
aRange = Selection.Address
'MsgBox (aRow)
If aRow > Feuil54.Range("CN_FMDetFilterSelectZone").Row And _
aRow < Feuil54.Range("CN_FMDetFilterSelectZone").Row + Feuil54.Range("CN_FMDetFilterSelectZone").Rows.Count - 1 Then
Feuil54.Unprotect Feuil7.Range("CN_ValidShPwd").Value
Feuil54.Range("B14").Value = Feuil54.Cells(aRow, Feuil54.Range("CN_FMDetFilterSelectZone").Column).Value
End If
End If
End Sub

Bonjour,
Une petite explication pour débuter :
Si les volets ne sont pas figés dans la feuille, la procédure va figer
les volets à la ligne de la cellule que tu vas sélectionner.
Si les volets sont figés dans la feuille et que tu veux les déplacer
A ) un premier clic dans la toute première ligne affichée de la feuille,
cela va faire disparaître les volets.
B ) tu sélectionnes la nouvelle cellule où tu veux que les volets se
figent à nouveau.
Fais un clic droit sur l'onglet de la feuille
Choisis la commande "Visualiser le code"
Colle le code suivant dans la page blanche
'-------------------------------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Rg As Range
Application.EnableEvents = False
Set Rg = ActiveWindow.ActivePane.VisibleRange
With ActiveWindow
If Intersect(.ActiveCell, .ActivePane.VisibleRange) Is Nothing Then
.SplitColumn = 0
.SplitRow = 0
.FreezePanes = False
Application.EnableEvents = True
Exit Sub
End If
End With
If ActiveWindow.FreezePanes = True Then
Application.EnableEvents = True
Exit Sub
End If
Application.Goto Cells(ActiveCell.Row, Rg(1, 1).Column), True
ActiveWindow.FreezePanes = True
With ActiveWindow
.SplitColumn = 0
.SplitRow = 1
End With
ActiveWindow.FreezePanes = True
Application.EnableEvents = True
End Sub
'-------------------------------------------------------
MichD
Avatar
MichD
Le 15/07/19 à 13:37, Roland Miller a écrit :
Bonjour à nouveau,
Merci. Mais en me relisant … peut-être que j'ai mal exprimé le besoin? Désolé. Je ne crois pas que cela a un lien avec le figer les volets.
En déroulant vers le bas ou vers le haut … avec la souris ou par la barre de défilement … j'aimerais que la valeur de ma cellule B14 change selon la valeur de la colonne Z de la ligne du Scroll.
Je réussi à le faire avec le SelectionChange … mais je souhaiterais le faire selon la ligne du Scroll … sans … devoir faire un clic dans la feuille mais seulement par le scroll.
C'est pour cela que je me demandais si c'était possible de créer un évènement Scroll ou???

Tel qu'existe Excel, il n'y a aucun événement défini lorsqu'un
utilisateur utilise l'ascenseur horizontal ou vertical d'une feuille de
calcul.
Je ne crois pas que tu vas trouver quelque chose sur mesure pour ce que
tu cherches à faire.
Mais si la chose t'intéresse, tu as un bon début à cette adresse. Le
site est en anglais et c'est compliqué à souhait. Personnellement je
n'ai pas l'intention d'y mettre l'effort et le temps pour savoir ce que
l'on peut en tirer.
http://www.cpearson.com/excel/DetectScroll.htm
Tu as ce fichier ScrollEvents.xls que tu peux télécharger. Pour qu'il
fonctionne, tu devras aussi télécharger le fichier .dll puis le copier
dans la répertoire c:WindowsSystem32 et le parapher dans la base de
registre de Windows. Dans un second temps, tu dois ouvrir la fenêtre de
l'éditeur de code et à partir du menu / Outils / références / utilise le
bouton "parcourir" jusqu'à la location où tu as mis le fichier. Tu
l'ajoutes et le coches avant de fermer la fenêtre.
Maintenant, le fichier .xls devient fonctionnel. Mais je te le dis
d'avance, ceci s'adresse pour les grosses pointures d'Excel avant de
bonnes notions de programmation.
Si tu prenais le temps d'expliquer la nécessité d'obtenir le numéro de
la ligne d'Excel que tu "scroll", peut-être il y une autre manière
d'arriver à tes fins.
MichD
Avatar
Roland Miller
Un grand merci une fois de plus. J'utilise d'ailleurs le MSCOMCTL.ocx. Alor s je comprend bien les implications.
C'est certain que si je pouvais faire autrement ... Voici la situation.
Dans une feuille j'ai déjà plus de 6000 lignes et pour 1250 "grou pes de lignes". Pour chacun des groupes de lignes il doit y avoir une ent ête. C'est une entête de 9 lignes (donc 9 lignes x 1250). Chaque entête est la même sauf pour … une ... valeur.
Je tente évidemment d'éviter d'avoir les 9 lignes x 1250. Donc … je pourrais n'avoir qu'une entête avec un figer les volets j uste en dessous et que ces lignes soient des lignes à répéte r en haut pour l'impression et ça serait parfait.
Si je n'ai qu'une seule entête … je peux contrôler l'impr ession et diverses autres fonctions. Pas de problèmes. Mais à cet endroit … l'usager … veut … descendre et monter da ns la feuille pour visualiser etc.
Mais le problème est qu'alors sans un évènement Scroll ou un e autre solution … l'usager .. doit … soit cliquer à q uelque part ou faire une action quelconque pour déclencher le changeme nt de valeur en question.
Je peux informer l'usager, le former etc. Mais … il y aura un risqu e d'erreur trop grand. Merci à l'avance.
Avatar
MichD
J'utilise d'ailleurs le MSCOMCTL.ocx. Alors je comprend bien les
implications.
**** Cela est relativement simple vs le code du fichier à télécharger!
**** Désolé, mais je ne comprends pas le fond de ton problème!
**** Que vient faire l'impression dans la description de ton problème?
'---------------------
Mais le problème est qu'alors sans un évènement Scroll ou une autre
solution … l'usager .. doit … soit cliquer à quelque part ou faire une
action quelconque pour déclencher le changement de valeur en question.
'---------------------
**** Explique, quelles actions les usagers doivent réaliser? Qu'est-ce
qui t'empêche d'avoir seulement un tableau au lieu de petits tableaux de
9 lignes?
**** Si tu avais à refaire la présentation des données, qu'elles
devraient être la disposition de ces données? Qu'est-ce qui t'empêche de
modifier la présentation?
MichD
Avatar
MichD
Le 15/07/19 à 20:56, MichD a écrit :
 J'utilise d'ailleurs le MSCOMCTL.ocx. Alors je comprend bien les
implications.
**** Cela est relativement simple vs le code du fichier à télécharger!
**** Désolé, mais je ne comprends pas le fond de ton problème!
**** Que vient faire l'impression dans la description de ton problème?
'---------------------
 Mais le problème est qu'alors sans un évènement Scroll ou une autre
solution … l'usager .. doit … soit cliquer à quelque part ou faire une
action quelconque pour déclencher le changement de valeur en question.
'---------------------
**** Explique, quelles actions les usagers doivent réaliser? Qu'est-ce
qui t'empêche d'avoir seulement un tableau au lieu de petits tableaux de
9 lignes?
**** Si tu avais à refaire la présentation des données, qu'elles
devraient être la disposition de ces données? Qu'est-ce qui t'empêche de
modifier la présentation?
MichD

Exemple d'une macro qui fait ceci :
Plusieurs tableaux dans une feuille de calcul.
Chaque tableau a une ligne d'en-tête
Les tableaux ont le même nombre de lignes
Dans mon exemple, la première ligne à supprimer
est la ligne 9, soit celle du tableau 2
La procédure efface la ligne complète de chaque tableau à chaque 8
lignes (step 8), à adapter selon ton applications.
À la fin, elle supprime toutes les lignes dont les cellules de la
colonne A sont totalement vides.
Et tu n'auras plus qu'un tableau de données avec une ligne d'en-tête
Tu dois adapter le nom de la feuille dans la procédure.
'------------------------------
Sub test()
Dim LastRow As Long, A As Long
Application.ScreenUpdating = False
Application.EnableEvents = False
With Worksheets("Feuil1") 'nom de la feuille à adapter
LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
For A = 9 To LastRow Step 8
.Rows(A).Clear
Next
.Range("A1:A" &
LastRow).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End With
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'------------------------------
MichD
Avatar
MichD
Le 16/07/19 à 14:49, Roland Miller a écrit :
Encore merci.
C'est que … l'usager peut vouloir imprimer tous les tableaux … d'un clic.
J'ai alors un bouton qui active une macro qui gère le tout correctement. Dont qui vient ajuster l'entête. C'est pourquoi je parlais de l'impression.
Mais … lorsque l'usager ne veut seulement que descendre dans la feuille … si je n'ai qu'une seule entête … alors la valeur en question ne peut se modifier en conséquence à moins de déclencher une macro … ce que j'aurais souhaité éviter,
Par exemple disons que je n'ai qu'une seule entête qui est en haut totalement de la feuille et dont il y a un Figer les volets juste en dessous de celle-ci. Lorsque l'usager descend dans la feuille et qu'il est rendu à la section ZZ … dans l'entête il faut que ce soit inscrit ZZ dans la cellule en question. S'il remonte et qu'il est dans la section BB … la valeur doit être BB dans la cellule en question.
Un énorme merci. Je vais gérer la situation en informant bien l'usager je crois bien. Je ne crois pas que je vais risquer d'aller avec ce que vous m'avez expédié pour les raisons que vous m'avez gentiment mentionné.

A ) Sans clic dans une cellule, je n'ai pas d'autre solution que le lien
du site internet suggéré.
B ) Pour imprimer seulement une section (un tableau particulier parmi
les tableaux.
- L'usager sélectionne une cellule de la barre de titre
- Le code pour imprimer ce tableau, je suppose que chaque tableau
est séparé par une ligne entière vide
sub test()
Activecell.currentRegion.PrintOut
End Sub
C ) pour imprimer tous les tableaux
Pourquoi ne pas faire une copie du de la feuille dans un autre
fichier, utilisé le type de macro exemple pour faire disparaitre
les lignes vides et les lignes d'en-tête de chaque tableau
et lancer l'impression de ce fichier.
D ) Et si tu veux imprimer seulement UNE PAGE où l'usager a cliqué sur
une cellule d'un tableau , il y a cette fonction de Laurent Longre qui
fait ce travail. Quand tu lances l'impression, il s'agit de passer en
paramètre le numéro de la page à imprimer à la méthode "PrintOut".
'-------------------------------
Function NumeroPage(Cellule As Range) As Integer
'L Longre, mpfe
Dim VPC As Integer, HPC As Integer
Dim VPB As VPageBreak, HPB As HPageBreak
Dim Wksht As Worksheet
Dim Col As Integer, Ligne As Long
Set Wksht = Cellule.Worksheet
Ligne = Cellule.Row
Col = Cellule.Column
If Wksht.PageSetup.Order = xlDownThenOver Then
HPC = Wksht.HPageBreaks.Count + 1
VPC = 1
Else
VPC = Wksht.VPageBreaks.Count + 1
HPC = 1
End If
NumeroPage = 1
For Each VPB In Wksht.VPageBreaks
If VPB.Location.Column > Col Then Exit For
NumeroPage = NumeroPage + HPC
Next VPB
For Each HPB In Wksht.HPageBreaks
If HPB.Location.Row > Ligne Then Exit For
NumeroPage = NumeroPage + VPC
Next HPB
End Function
'-------------------------------
MichD