2010-07-12 71 views

回答

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

爲不同的效果選擇不同的範圍,這與您手動操作的方式非常相似。 「Freeze Top Row」實際上是Excel 2007(及更高版本)中的一項新增功能,與早期版本的Excel相比,它不包含任何附加功能。

+5

似乎像ScreenUpdating必須在此工作,但否則很好。謝謝! – 2010-07-12 23:25:20

+2

我不清楚如何通過選擇頂行來凍結最上面的一行。要凍結最上一行,選擇應該是'行(2)'或'行(「2:2」)'。選擇「行」(「1:1」)會導致工作表的四象限分割。 – Jeeped 2015-07-29 15:10:26

+0

@Jeeped m) - 當然!好的發現,謝謝! – Tomalak 2015-07-29 15:12:07

12

Tomalak已經給了你一個正確的答案,但是我想補充一點,當你想知道在用戶界面中做某個動作所需的VBA代碼時,最好記錄一個宏。

在這種情況下,請在功能區的開發人員選項卡上單擊記錄宏,凍結最上一行然後停止記錄。 Excel將有記錄,你下面的宏也不會工作:

With ActiveWindow 
    .SplitColumn = 0 
    .SplitRow = 1 
End With 
ActiveWindow.FreezePanes = True 
+0

是的。這是正確的答案。無需選擇工作表的任何部分。 – HuckIt 2015-02-03 16:58:33

+0

好的答案,但我很好奇爲什麼最後的聲明沒有塞進With ... End With語句。 – Jeeped 2015-07-29 14:32:07

+0

@Jeeped:這只是Excel宏記錄器的原始輸出。當然,你可以在「With」塊中包含該行。 – 2015-07-29 15:51:56

13

與錄製宏的問題是相同的,與內置的動作問題:Excel中選擇凍頂可見行,而不是可以找到標題信息的實際頂行。

在這種情況下宏的目的是凍結實際的頂行。當我正在查看第405592行時,我需要檢查列的標題(因爲我在打開文件時忘記凍結行),所以我必須滾動到頂部,凍結第一行,然後找到返回的路再次行#405592。既然我認爲這是愚蠢的行爲,我想要一個宏來糾正它,但正如我所說,錄製的宏只是模仿了同樣愚蠢的行爲。

我使用Office 2011的Mac OS X Lion的

更新(2分鐘後):

我發現這裏的解決方案: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 
+2

對於像我這樣的其他新手:我可以通過設置範圍(「A9」)而不改變其他任何東西來凍結前8行(我的報告「儀表板」所在的位置)。 – Sean 2013-10-24 23:30:54

7

只要按同樣的問題.. 。 出於某種原因,freezepanes命令只是導致十字線出現在屏幕的中心。它變成了我關掉ScreenUpdating的功能! 用以下代碼解決:

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

現在它工作正常。

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

這是凍結第一行的最簡單方法。 FreezePanes的規則是凍結您選擇的單元格中的左上角。例如,如果突出顯示C10,它將在列B和C之間的第9行和第10行之間凍結。因此,當突出顯示第2行時,它實際上會凍結在第1行和第2行之間,即第一行。

而且,.SplitColumn.SplitRow會在您解凍窗口後拆分窗口,這不是我喜歡的方式。

3

要將此問題擴展到Excel 自己的VBA之外的使用領域,ActiveWindow property必須作爲Excel.Application object的子代來處理。

從Access中創建一個Excel工作簿

例子:

在其他Office應用程序的VBA項目使用Excel.Application object會要求你添加的Microsoft Excel 15.0對象庫(或等同於你自己的版本)。

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 

製造過程的核心其實就是一個先前提交答案的重申,但我想證明如何處理的ActiveWindow時,你是不是Excel的VBA本身內是很重要的。雖然這裏的代碼是VBA,但它應該可以直接轉錄到其他語言和平臺。

+0

你也可以使用'Set xlApp = New Excel.Application',甚至可以使用Dim xlApp As New Excel.Application'。 – 2016-10-10 15:28:00

相關問題