web-dev-qa-db-fra.com

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 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.

37
LJ.
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.

39
Tomalak

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
17
Dirk Vollmar

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 
13
Dannid

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.

8
Tom M

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.

6
user4039065
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.

3
ian0411