Tableau selectionné après tri sur colonne / Scroll vers fin du tableau
Bonsoir à tous,
Encore une nuit dans le VBA, du coup j'ai deux questions pour vous ce soir
1) J'ai un "bug" anodin mais perturbant et j'aimerai comprendre ce que j'ai loupé dans mon code. A l'ouverture de mon fichier, je vire les filtres laissés par les utilisateurs et remet la table d'équerre en triant sur une colonne, ceci pour la "Table_SP" sur la Feuille "Spécial" et la "Table_STD" sur la Feuille "Standard", ensuite je fais un petit username test pour la lecture seule et j'active la feuille "Gestion". Rien de bien méchant. J'ai remarqué que mes deux tables étaient complètement sélectionnées après cette ouverture, est-ce normal ?
2) Je voulais scroller vers la fin de la "Table_STD" pour éviter aux utilisateurs de devoir le faire, j'ai voulu ajouter un mais Application.Goto Reference:=Range("A" & .ListRows.Count), Scroll:=True à la fin de mon With [Table_STD].ListObject Cela fonctionne mais cela semble également s'appliquer à ma feuille "Gestion" que j'active en fin de macro, car je me retrouve tout en bas de cette page, j'ai encore raté quelque chose ?
Voici le code utilisé :
Option Explicit
Private Sub Workbook_Open()
'Déclaration des variables
Dim User As Byte
Application.ScreenUpdating = False
With Spécial
.Unprotect "****"
With [Table_SP].ListObject
If Not .AutoFilter Is Nothing Then .AutoFilter.ShowAllData
With [Table_SP].ListObject.Sort
.SortFields.Clear
.SortFields.Add Key:=[Table_SP].ListObject.ListColumns("Numéro d'offre").Range, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
.Range.AutoFilter Field:=.ListColumns("Statut de l'offre").Index, Criteria1:="En cours"
End With
.Protect "****", AllowFiltering:=True
End With
With Standard
.Unprotect "****"
With [Table_STD].ListObject
If Not .AutoFilter Is Nothing Then .AutoFilter.ShowAllData
With [Table_STD].ListObject.Sort
.SortFields.Clear
.SortFields.Add Key:=[Table_STD].ListObject.ListColumns("Numéro d'AR").Range, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
.Protect "****", AllowFiltering:=True
End With
With Données
.Unprotect "****"
With [Table_Employés].ListObject.Sort
.SortFields.Clear
.SortFields.Add Key:=[Table_Employés].ListObject.ListColumns("Prénom").Range, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
With [Table_Planification].ListObject.Sort
.SortFields.Clear
.SortFields.Add Key:=[Table_Planification].ListObject.ListColumns("Catégorie").Range, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
With [Table_Client].ListObject.Sort
.SortFields.Clear
.SortFields.Add Key:=[Table_Client].ListObject.ListColumns("Client").Range, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
.Protect "****", AllowFiltering:=True
End With
Gestion.Activate
Gestion.Range("A1").Select
Application.ScreenUpdating = True
'Lecture seule selon utilisateur
Application.DisplayAlerts = False
User = Application.IfError(Application.Match(Environ("username"), [Table_Utilisateurs].ListObject.DataBodyRange, 0), 0)
If User = 0 Then User = Application.IfError(Application.Match(Environ("username"), [Table_Administrateurs].ListObject.DataBodyRange, 0), 0)
If User = 0 Then
ThisWorkbook.ChangeFileAccess xlReadOnly
Else
If MsgBox("Voulez-vous ouvrir le fichier en lecture seule ?", vbQuestion + vbYesNo + vbDefaultButton2, "Lecture seule") = vbYes Then ThisWorkbook.ChangeFileAccess xlReadOnly
End If
Application.DisplayAlerts = True
End SubMerci à tous.
Bonjour Heelflip, le forum,
Sans fichier, difficile de t'apporter une réponse précise...
Application.Goto Reference:=Range("A" & .ListRows.Count), Scroll:=TrueIl faut préciser sur quelle feuille tu souhaite cette instruction..
A tester:
Dim Standart As Worksheet
Set Standart = Sheets("Standart")
With Standart
Application.Goto Reference:=.Range("A" & .[Table_STD].ListObject.ListRows.Count + 1), Scroll:=True
End WithTu noteras le . (point) devant Range qui lie l'instruction à la feuille grâce au With....
Cordialement,
Bonjour Heelflip, xorsankukai,
si le TS ne commence pas dans la cellule A1
Sub test2()
'ce n'est pas nécessaire que le TS commence sur la première ligne et/ou colonne de la feuille
With Range("Table_STD").ListObject 'dans un module normal = sans préciser la feuille
Application.Goto .Range.Cells(.Range.Rows.Count, 1), 1
End With
End SubBonsoir à vous deux.
En effet le "." devant le range arrange tout...
J'ai utilisé un peu des deux Application.Goto Reference:=.Range.Cells(.Range.Rows.Count - 20, 1), Scroll:=True
Cela permet d'afficher les 20 dernière lignes pour bosser dessus. Problème N°2 réglé merci.
Pour le premier soucis, j'ai ajouté un Range("A1").Select sur les deux tables et comme cela plus de soucis
Sub test2()
'ce n'est pas nécessaire que le TS commence sur la première ligne et/ou colonne de la feuille
With Range("Table_STD").ListObject 'dans un module normal = sans préciser la feuille
Application.Goto .Range.Cells(application.max(1,.Range.Rows.Count-20), 1), 1
End With
End Subproblème 1
Application.CutCopyMode = False ?????En effet j'aurais pu utiliser CutCopyMode