wake-up-neo.net

Wie kann ich die oberste Zeile eines Excel-Arbeitsblatts in Excel 2007 VBA programmgesteuert einfrieren?

Ich versuche, die oberste Zeile eines Excel-Arbeitsblatts von VBA aus programmgesteuert einzufrieren. Das Endziel ist es, den gleichen Effekt zu erzielen wie der View > Freeze Panes > Freeze Top Row-Befehl in Excel 2007, sodass die oberste Zeile des Arbeitsblatts eingefroren wird und Benutzer die oberste Zeile des Arbeitsblatts sehen können, während sie durch die Daten scrollen.

37
LJ.
Rows("2:2").Select
ActiveWindow.FreezePanes = True

Wählen Sie einen anderen Bereich für einen anderen Effekt, ähnlich wie Sie es manuell tun würden. Die "Freeze Top Row" ist wirklich nur eine neue Verknüpfung in Excel 2007 (und höher), sie enthält keine zusätzlichen Funktionen im Vergleich zu früheren Versionen von Excel.

39
Tomalak

Tomalak hat Ihnen bereits eine richtige Antwort gegeben, aber ich möchte hinzufügen, dass es eine gute Idee ist, ein Makro aufzuzeichnen, wenn Sie häufig wissen möchten, welcher VBA-Code für eine bestimmte Aktion in der Benutzeroberfläche erforderlich ist.

Klicken Sie in diesem Fall auf der Entwicklerregisterkarte des Menübands auf Makro aufzeichnen, halten Sie die obere Reihe an und beenden Sie die Aufzeichnung. In Excel wird das folgende Makro für Sie aufgezeichnet, das auch die Aufgabe übernimmt:

With ActiveWindow
    .SplitColumn = 0
    .SplitRow = 1
End With
ActiveWindow.FreezePanes = True
17
Dirk Vollmar

Das Problem mit dem aufgezeichneten Makro ist dasselbe wie das Problem mit der integrierten Aktion: Excel friert die oberste sichtbare Zeile ein und nicht die eigentliche obere Zeile, in der die Header-Informationen zu finden sind.

In diesem Fall dient ein Makro zum Einfrieren der aktuellen oberen Zeile. Wenn ich die Zeile Nr. 405592 ansehe und die Überschrift der Spalte überprüfen muss (weil ich vergessen habe, die Zeilen einzufrieren, als ich die Datei geöffnet habe), muss ich nach oben scrollen, die obere Zeile einfrieren und dann den Weg zurück zu finden Zeile # 405592 erneut. Da ich glaube, dass dies ein dummes Verhalten ist, möchte ich, dass ein Makro es korrigiert, aber wie gesagt, das aufgezeichnete Makro ahmt nur dasselbe dumme Verhalten nach.

Ich verwende Office 2011 für Mac OS X Lion

Update (2 Minuten später):

Ich habe hier eine Lösung gefunden: 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

Drücken Sie einfach auf das gleiche Problem ... Aus irgendeinem Grund hat der Befehl freezepanes nur dazu geführt, dass ein Fadenkreuz in der Mitte des Bildschirms angezeigt wird. Es stellt sich heraus, dass ich ScreenUpdating ausgeschaltet hatte! Mit folgendem Code gelöst:

Application.ScreenUpdating = True
Cells(2, 1).Select
ActiveWindow.FreezePanes = True

Jetzt funktioniert es gut.

8
Tom M

Um diese Frage in den Bereich der Verwendung außerhalb von Excel-eigenen VBA zu erweitern, muss die ActiveWindow-Eigenschaft als untergeordnetes Element des Excel.Application-Objekt adressiert werden.

Beispiel für das Erstellen einer Excel-Arbeitsmappe aus Access:

Wenn Sie das Excel.Application-Objekt in einem VBA-Projekt einer anderen Office-Anwendung verwenden, müssen Sie die Microsoft Excel 15.0-Objektbibliothek (oder eine Entsprechung für Ihre eigene Version) hinzufügen.

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

Der Kernprozess ist eigentlich nur eine Wiederholung der zuvor übermittelten Antworten, aber ich fand es wichtig zu demonstrieren, wie man mit ActiveWindow umgeht, wenn man sich nicht in Excel's eigenem VBA befindet. Während der Code hier VBA ist, sollte er direkt auf andere Sprachen und Plattformen übertragbar sein.

6
user4039065
Rows("2:2").Select
ActiveWindow.FreezePanes = True

Dies ist der einfachste Weg, um die oberste Reihe einzufrieren. Die Regel für FreezePanes ist, dass das obere linke Ecke aus der ausgewählten Zelle eingefroren wird. Wenn Sie beispielsweise C10 markieren, wird es zwischen den Spalten B und C, den Zeilen 9 und 10 eingefroren. Wenn Sie also Zeile 2 markieren, wird es tatsächlich zwischen den Zeilen 1 und 2 eingefroren, die die oberste Zeile sind.

Auch der .SplitColumn oder .SplitRow wird dein Fenster teilen, wenn du es auftreibst, was nicht so ist, wie ich es mag.

3
ian0411