Je cherche à geler par programme la ligne supérieure d'une feuille de calcul Excel à partir de VBA. L'objectif final est de produire le même effet que le View > Freeze Panes > Freeze Top Row
commande dans Excel 2007 afin que la ligne supérieure de la feuille de calcul soit figée et que les utilisateurs puissent voir la ligne supérieure de la feuille de calcul même lorsqu'ils font défiler les données.
Rows("2:2").Select
ActiveWindow.FreezePanes = True
Sélectionnez une plage différente pour un effet différent, de la même manière que vous le feriez manuellement. Le "Freeze Top Row" est vraiment juste un raccourci nouveau dans Excel 2007 (et plus), il ne contient aucune fonctionnalité supplémentaire par rapport aux versions antérieures d'Excel.
Tomalak vous a déjà donné une bonne réponse, mais je voudrais ajouter que la plupart du temps, lorsque vous souhaitez connaître le code VBA nécessaire pour effectuer une certaine action dans l'interface utilisateur, c'est une bonne idée d'enregistrer une macro.
Dans ce cas, cliquez sur Enregistrer la macro dans l'onglet développeur du ruban, figez la ligne supérieure, puis arrêtez l'enregistrement. Excel enregistrera pour vous la macro suivante qui fait également le travail:
With ActiveWindow
.SplitColumn = 0
.SplitRow = 1
End With
ActiveWindow.FreezePanes = True
Le problème avec la macro enregistrée est le même que le problème avec l'action intégrée: Excel choisit de geler la ligne supérieure visible , plutôt que la ligne réelle ligne supérieure où les informations d'en-tête peuvent être trouvées.
Le but d'une macro dans ce cas est de geler la ligne supérieure réelle. Lorsque je consulte la ligne # 405592 et que je dois vérifier l'en-tête de la colonne (car j'ai oublié de figer les lignes lorsque j'ai ouvert le fichier), je dois faire défiler vers le haut, geler la ligne du haut, puis retrouver mon chemin vers ligne # 405592 à nouveau. Comme je pense que c'est un comportement stupide, je veux qu'une macro le corrige, mais, comme je l'ai dit, la macro enregistrée imite simplement le même comportement stupide.
J'utilise Office 2011 pour Mac OS X Lion
Mise à jour (2 minutes plus tard):
J'ai trouvé une solution ici: http://www.ozgrid.com/forum/showthread.php?t=19692
Dim r As Range
Set r = ActiveCell
Range("A2").Select
With ActiveWindow
.FreezePanes = False
.ScrollRow = 1
.ScrollColumn = 1
.FreezePanes = True
.ScrollRow = r.Row
End With
r.Select
Frappez juste le même problème ... Pour une raison quelconque, la commande freezepanes a juste fait apparaître des réticules au centre de l'écran. Il s'avère que j'avais désactivé ScreenUpdating! Résolu avec le code suivant:
Application.ScreenUpdating = True
Cells(2, 1).Select
ActiveWindow.FreezePanes = True
Maintenant ça marche bien.
Pour développer cette question dans le domaine d'utilisation en dehors du propre VBA d'Excel, la propriété ActiveWindow doit être adressée en tant qu'enfant de objet Excel.Application .
Exemple de création d'un classeur Excel à partir d'Access:
L'utilisation de objet Excel.Application dans le projet VBA d'une autre application Office vous obligera à ajouter la bibliothèque d'objets Microsoft Excel 15.0 (ou l'équivalent pour votre propre version).
Option Explicit
Sub xls_Build__Report()
Dim xlApp As Excel.Application, ws As Worksheet, wb As Workbook
Dim fn As String
Set xlApp = CreateObject("Excel.Application")
xlApp.DisplayAlerts = False
xlApp.Visible = True
Set wb = xlApp.Workbooks.Add
With wb
.Sheets(1).Name = "Report"
With .Sheets("Report")
'report generation here
End With
'This is where the Freeze Pane is dealt with
'Freezes top row
With xlApp.ActiveWindow
.SplitColumn = 0
.SplitRow = 1
.FreezePanes = True
End With
fn = CurrentProject.Path & "\Reports\Report_" & Format(Date, "yyyymmdd") & ".xlsx"
If CBool(Len(Dir(fn, vbNormal))) Then Kill fn
.SaveAs FileName:=fn, FileFormat:=xlOpenXMLWorkbook
End With
Close_and_Quit:
wb.Close False
xlApp.Quit
End Sub
Le processus de base n'est en réalité qu'une réitération des réponses soumises précédemment, mais j'ai pensé qu'il était important de montrer comment gérer ActiveWindow lorsque vous n'êtes pas dans le propre VBA d'Excel. Bien que le code ici soit VBA, il devrait être directement transcriptible dans d'autres langues et plates-formes.
Rows("2:2").Select
ActiveWindow.FreezePanes = True
C'est le moyen le plus simple de geler la rangée du haut. La règle pour FreezePanes
est qu'elle gèle le coin supérieur gauche de la cellule que vous avez sélectionnée. Par exemple, si vous mettez en surbrillance C10, il se fige entre les colonnes B et C, les lignes 9 et 10. Ainsi, lorsque vous mettez en surbrillance la ligne 2, il se fige en fait entre les lignes 1 et 2, qui est la ligne supérieure.
Également .SplitColumn
ou .SplitRow
divisera votre fenêtre une fois que vous la dégelez, ce qui n'est pas comme j'aime.