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?
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
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.
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
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
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
@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'. –
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
Đố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
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.
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.
Để 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.
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ó vẻ như ScreenUpdating phải được bật để hoạt động, nhưng tuyệt vời hơn. Cảm ơn! –
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
@Jeeped m) - tất nhiên! Tốt, cảm ơn! – Tomalak