Bonjour Sabrina, le Forum
Si j'interprète bien ce que ton UserForm doit faire, c'est tout simplement de préparer avant la sauvegarde la plage
Accessible (ScrollArea), la plage
Visible (ScrollRow , ScrollColumn ) et la plage
Sélectionée (Range('Z153').Select) pour la prochaine ouverture du classeur...
Pour les deux dernières possibilités 'No Soucy'... par contre pour l'Accessibilité des Cellules, la propriété ScrollArea est 'volatile' tout comme d'autres propriétés telle 'UserInterfaceOnly' par exemple...
Ce que j'entends par 'Volatile' c'est tout simplement que dans les propriétés des Feuilles, que ce soit en mode Design par VBE (Visual Basic Editor), soit en RunTime par VBA, la propriété 'ScrollArea' n'est pas conservée après fermeture du Classeur. Ton problème, si je l'interprète correctement est dû à tout simplement ce phénomène.
Une solution paliative consisterait en appliquant ce ScrollAreaau au moment de l'ouverture de ton Classeur; en s'appuyant sur l'évènementielle 'Workbook_Open' à placer dans le Private Module de 'ThisWorkBook', comme ceci :
Private Sub Workbook_Open()
With ActiveSheet
.ScrollArea = '$A$139:$AP$166'
.Range('Z153').Select
End With
With ActiveWindow
.ScrollRow = 139
.ScrollColumn = 1
End With
End Sub
Il est clair que si ce CommandButton2 doit agir pour une sauvegarde particulière sur un ScrollArea différent en fonction d'un besoin, et qu'un hypothétique 'CommandButton1' ou autre, pourrait quand à lui interférer pour une autre zone de ScrollArea...
Cette éventualité t'obligera à passer par une WorkSheet 'Settings' complètement transparante pour le User puisqu'elle peut être en mode Visible = xlSheetVeryHidden...
Pour obtenir ceci tes CommandButtons agiraient de la sorte pour paramétrer cette feuille 'Settings' :
Option Explicit
Private Sub CommandButton1_Click()
With Sheets('Settings')
.Range('A1') = '$A$150:$AP$178'
.Range('A2') = 150
.Range('A3') = 1
.Range('A4') = 'Z164'
End With
Unload Me
ThisWorkbook.Close SaveChanges:=True
End Sub
Private Sub CommandButton2_Click()
With Sheets('Settings')
.Range('A1') = '$A$139:$AP$166'
.Range('A2') = 139
.Range('A3') = 1
.Range('A4') = 'Z153'
End With
Unload Me
ThisWorkbook.Close SaveChanges:=True
End Sub
Private Sub UserForm_Click()
End Sub
Ensuite ton Code WorkBook_Open dans ThisWorkbook ressemblerait à ceci :
Option Explicit
Private Sub Workbook_Open()
Dim AdressScrollArea As String
Dim AdressScrollColumn As Integer
Dim AdressScrollRow As Integer
Dim AdressSelection As String
With Sheets('Settings')
AdressScrollArea = .Range('A1')
AdressScrollColumn = .Range('A2')
AdressScrollRow = .Range('A3')
AdressSelection = .Range('A4')
End With
With ActiveSheet
.ScrollArea = AdressScrollArea
.Range(AdressSelection).Select
End With
With ActiveWindow
.ScrollRow = AdressScrollColumn
.ScrollColumn = AdressScrollRow
End With
End Sub
Voilà, je pense que tu as les éléments dont tu as besoin, bonne journée fériée.
[ol]@+Thierry[/ol]
EDITION !!!
Bonjour Excalibur,
Désolé lors de la rédaction d'un long post comme celui-ci je ne t'avais pas vu venir. Mais hélas, comme j'ai précisé, la ScrollArea, même dans ta proposition ne persitera pas après une fermeture/ré-ouvertrure du classeur.
Par ailleurs je préconise de s'abstenir d'utiliser les crochets '[z153].Activate' en VBA.
Nous avons déjà fait différentes démonstrations dans le Forum 'First Generation' que les [Crochets] (qui sous-entendent 'Evaluate' en VBA), pour une simple référence à une adresse de range, ne sont pas du tout optimisés car ils s'accaparrent bien plus de mémoire et ralentissent l'exécution d'algo.
VBA dans toute sa splendeur permet à tout un chacun de développer selon ses aptitudes et connaissances, donc dans le cas présent celà n'aura pas vraiment d'influence, mais tant qu'à faire il est toujours de bon conseil d'appliquer des structures correctes dès ses premiers pas en programmation.
Bonne Journée Off à toi aussi
[ol]@+Thierry[/ol]
Message édité par: _Thierry, à: 01/11/2005 13:45