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.

34
demandé sur ashleedawg 2010-07-13 02:56:16

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.

37
répondu Tomalak 2015-07-29 15:11:41

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
14
répondu Dirk Vollmar 2010-07-12 23:09:40

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 
13
répondu Dannid 2012-07-12 22:05:47

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.

8
répondu Tom M 2013-10-14 14:48:16

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.

5
répondu Jeeped 2015-07-29 15:04:34
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.

3
répondu ian0411 2017-08-23 17:40:59