Comment puis-je geler par programme la ligne supérieure d'une feuille de calcul Excel dans Excel 2007 VBA?
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 la commande View > Freeze Panes > Freeze Top Row
dans Excel 2007 afin que la ligne supérieure de la feuille de calcul soit gelé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.
6 réponses
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 un raccourci nouveau dans Excel 2007 (et plus), il ne contient aucune fonctionnalité ajoutée par rapport aux versions antérieures d'Excel.
Tomalak vous ai déjà donné une réponse correcte, mais je voudrais ajouter que la plupart du temps quand vous voudrais savoir le code VBA besoin de faire 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 aura la macro suivante enregistrée pour vous 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 supérieure réelle 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. Quand je regarde la ligne # 405592 et que je dois vérifier l'en-tête de la colonne (parce que j'ai oublié de geler les lignes quand j'ai ouvert le fichier), je dois faire défiler vers le haut, geler la ligne du haut, puis trouver mon chemin de retour à la ligne # 405592 à nouveau. Puisque je crois 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
Il suffit de frapper le même problème... Pour une raison quelconque, la commande freezepanes vient de faire apparaître le réticule au centre de l'écran. Il se oout j'avais commuté ScreenUpdating off! Résolu avec le code suivant:
Application.ScreenUpdating = True
Cells(2, 1).Select
ActiveWindow.FreezePanes = True
Maintenant, cela fonctionne bien.
Pour étendre cette question dans le domaine de L'utilisation en dehors D'Excel s propre VBA, la propriété ActiveWindow doit être adressée en tant qu'enfant de Excel.Objet d'Application .
Exemple de création D'un classeur Excel à partir D'Access:
En utilisant le Excel.Application object dans le projet VBA D'une autre application Office, vous devrez ajouter une 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 noyau le processus est vraiment juste une répétition des réponses précédemment soumises, mais j'ai pensé qu'il était important de démontrer comment faire face à ActiveWindow lorsque vous n'êtes pas dans le propre VBA D'Excel. Alors que le code ici est VBA, il devrait être directement transcriptible à 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'il va geler le coin supérieur gauche de la cellule que vous avez sélectionnée. Par exemple, si vous mettez en surbrillance C10, il se figera entre les colonnes B et C, les lignes 9 et 10. Donc, lorsque vous mettez en surbrillance la ligne 2, elle gèle entre les lignes 1 et 2 qui est la rangée du haut.
En outre, le .SplitColumn
ou {[3] } divisera votre fenêtre une fois que vous la dégelerez, ce qui n'est pas ce que j'aime.