2010-07-12 29 views
32

Tôi đang tìm cách lập trình cố định hàng trên cùng của trang tính Excel từ VBA. Mục tiêu cuối cùng là tạo ra hiệu ứng tương tự như lệnh View > Freeze Panes > Freeze Top Row trong Excel 2007 để hàng trên cùng của trang tính bị đóng băng và người dùng có thể thấy hàng trên cùng của trang tính ngay cả khi họ cuộn qua dữ liệu.Làm cách nào tôi có thể lập trình cố định hàng trên cùng của trang tính Excel trong Excel 2007 VBA?

Trả lời

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

Chọn phạm vi khác cho hiệu ứng khác, giống như cách bạn làm theo cách thủ công. Các "Freeze Top Row" thực sự chỉ là một phím tắt mới trong Excel 2007 (và lên), nó không chứa chức năng bổ sung so với phiên bản trước của Excel.

+5

Có vẻ như ScreenUpdating phải được bật để hoạt động, nhưng tuyệt vời hơn. Cảm ơn! –

+2

Tôi không rõ ràng về cách bạn đang đóng băng hàng trên cùng bằng cách chọn hàng trên cùng. Để cố định hàng trên cùng, lựa chọn phải là 'Hàng (2)' hoặc 'Hàng (" 2: 2 ")'. Chọn kết quả 'Row (" 1: 1 ")' trong phần chia bốn góc của bảng tính. – Jeeped

+0

@Jeeped m) - tất nhiên! Tốt, cảm ơn! – Tomalak

12

Tomalak đã cung cấp cho bạn câu trả lời đúng, nhưng tôi muốn thêm rằng hầu hết các lần bạn muốn biết mã VBA cần thiết để thực hiện một hành động nhất định trong giao diện người dùng đó là một ý tưởng hay để ghi lại macro.

Trong trường hợp này, hãy bấm Ghi lại macro trên tab nhà phát triển của ruy-băng, cố định hàng trên cùng và sau đó dừng ghi. Excel sẽ có macro sau ghi lại cho bạn mà cũng không được công việc:

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

Có. Đây là câu trả lời đúng. Không cần phải chọn bất kỳ phần nào của bảng tính. – HuckIt

+0

Câu trả lời hay nhưng tôi tò mò tại sao câu cuối cùng không được đưa vào câu lệnh Với ... Kết thúc với. – Jeeped

+0

@Jeeped: Đây chỉ là đầu ra thô của máy ghi macro Excel. Tất nhiên, bạn có thể bao gồm các dòng trong khối 'With'. –

13

Vấn đề với các macro ghi lại là giống như các vấn đề với các hành động built-in: Excel chọn đóng băng phía trên nhìn thấy hàng, thay vì hàng trên cùng thực tế, nơi có thể tìm thấy thông tin tiêu đề.

Mục đích của macro trong trường hợp này là đóng băng hàng trên cùng thực tế. Khi tôi xem hàng # 405592 và tôi cần kiểm tra tiêu đề cho cột (vì tôi đã quên cố định hàng khi tôi mở tệp), tôi phải cuộn lên trên cùng, cố định hàng trên cùng, sau đó tìm đường quay lại hàng # 405592 một lần nữa. Vì tôi tin rằng đây là hành vi ngu ngốc, tôi muốn một macro để sửa nó, nhưng, như tôi đã nói, macro được ghi lại chỉ bắt chước hành vi ngu xuẩn tương tự.

Tôi đang sử dụng Office 2011 dành cho Mac OS X Lion

Cập nhật (2 phút sau):

Tôi tìm thấy một giải pháp ở đây: 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

Đối với bất kỳ người mới nào khác như tôi: Tôi có thể đóng băng 8 hàng đầu (nơi báo cáo "trang tổng quan" của tôi cư trú) bằng cách tạo Phạm vi ("A9") mà không thay đổi bất kỳ điều gì khác. – Sean

7

Chỉ cần nhấn cùng một vấn đề .. Vì lý do nào đó, lệnh freezepanes chỉ gây ra hiện tượng crosshairs xuất hiện ở giữa màn hình. Nó biến oout tôi đã chuyển ScreenUpdating off! Được giải quyết bằng mã sau:

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

Bây giờ nó hoạt động tốt.

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

Đây là cách dễ nhất để cố định hàng trên cùng. Quy tắc cho FreezePanes là quy tắc sẽ đóng băng số góc trên bên trái từ ô bạn đã chọn. Ví dụ, nếu bạn làm nổi bật C10, nó sẽ đóng băng giữa các cột B và C, các hàng 9 và 10. Vì vậy, khi bạn làm nổi bật Hàng 2, nó thực sự đóng băng giữa Hàng 1 và 2 là hàng trên cùng.

Ngoài ra, .SplitColumn hoặc .SplitRow sẽ chia cửa sổ của bạn sau khi bạn giải phóng cửa sổ mà không phải là cách tôi thích.

3

Để mở rộng câu hỏi này vào lĩnh vực sử dụng bên ngoài Excel của VBA, số ActiveWindow property phải được giải quyết là con của Excel.Application object.

Ví dụ để tạo một bảng tính Excel từ Access:

Sử dụng Excel.Application object trong dự án VBA khác ứng dụng Office sẽ yêu cầu bạn thêm Microsoft Excel 15.0 thư viện Object (hoặc tương đương đối với phiên bản riêng của bạn).

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 

Quá trình cốt lõi thực sự chỉ là một sự lặp lại các câu trả lời gửi trước đó nhưng tôi nghĩ điều quan trọng là để chứng minh làm thế nào để đối phó với ActiveWindow khi bạn không ở trong VBA riêng của Excel. Trong khi mã ở đây là VBA, nó phải được chuyển trực tiếp sang các ngôn ngữ và nền tảng khác.

+0

Bạn cũng có thể sử dụng 'Đặt xlApp = New Excel.Application', hoặc thậm chí' Dim xlApp As New Excel.Application'. –

Các vấn đề liên quan