Tim có một số trang tính có hai phần riêng biệt (chúng ta hãy gọi chúng là phần trên và phần dưới) có tiêu đề cột hơi khác nhau. Anh ấy đã cố định hàng trên cùng để giữ cho tiêu đề phần trên hiển thị khi cuộn xuống, nhưng sau khi cuộn qua một điểm nhất định, Tim kết thúc việc xem xét dữ liệu phần dưới với tiêu đề phần trên vẫn ở trên cùng. Anh ấy muốn biết liệu có cách nào để chuyển hàng tiêu đề đã được cố định đó để hiển thị các tiêu đề của phần dưới khi anh ấy cuộn xuống điểm mà chỉ dữ liệu của phần dưới đang hiển thị hay không.

Có, có một cách để làm điều này, nhưng nó liên quan đến việc sử dụng macro.

Trước khi xem xét một giải pháp dựa trên vĩ mô, bạn có thể muốn xem xét cấu trúc lại dữ liệu của mình để mỗi phần của bạn nằm trên các trang tính khác nhau. (Từ quan điểm thiết kế, đây sẽ là giải pháp dễ dàng nhất.) Nếu điều này không thể thực hiện được, thì bạn cần phải xem xét macro.

Một cách tiếp cận dễ dàng là chỉ cần thay đổi những gì được lưu trữ trong hàng trên cùng (hàng 1) của trang tính của bạn, tùy thuộc vào hàng được chọn. Ví dụ: macro sau sẽ thực hiện các thay đổi ở hàng trên cùng dựa trên vị trí của ô hiện hoạt. Nếu nó ở trước hàng 40, thì một tập hợp các tiêu đề được nhồi vào hàng đầu tiên; nếu sau hàng 40 thì một tập hợp tiêu đề khác được nhồi.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim iBottomData As Integer

iBottomData = 40

If ActiveCell.Row < iBottomData Then         Cells(1, 1).Value = "Last Name"

Cells(1, 2).Value = "First Name"

Cells(1, 3).Value = "Address"

Cells(1, 4).Value = "Balance"

Else         Cells(1, 1).Value = "Account"

Cells(1, 2).Value = "Sales Rep"

Cells(1, 3).Value = "Status"

Cells(1, 4).Value = ""

End If End Sub

Để sử dụng macro, chỉ cần đảm bảo rằng bạn đặt nó vào cửa sổ mã cho trang tính có chứa hai phần dữ liệu. Bạn cũng nên thay đổi giá trị được gán cho biến iBottomData để phản ánh số hàng nơi phần dữ liệu dưới cùng của bạn bắt đầu.

Nếu bạn thực sự muốn thay đổi hàng cố định khi bạn di chuyển xuống trang tính, thì macro cần phải mạnh mẽ hơn một chút. Trên thực tế, có hai macro theo sau (cả hai đều đi, một lần nữa, trong cửa sổ mã cho trang tính) và chúng được khởi động khi bạn thay đổi ô đã chọn và khi bạn nhấp chuột phải vào trang tính.

Private Sub Worksheet_BeforeRightClick(ByVal _   Target As Range, Cancel As Boolean)

Application.ScreenUpdating = False     ActiveWindow.FreezePanes = False     ActiveWindow.Split = False     Application.EnableEvents = False     Application.Goto Cells(1, 1), scroll:=True     With ActiveWindow         .SplitColumn = 0         .SplitRow = 1     End With     ActiveWindow.FreezePanes = True     Application.Goto Cells(Target.Row - 1, _       Target.Column), scroll:=True     Application.EnableEvents = True     On Error Resume Next        'MUST reenable events     Application.EnableEvents = False     ActiveCell.Offset(-1, 1 - Target.Column).Select     ' so the right click menu doesn't popup     ' only if this is the second header row.

Cancel = True      Application.EnableEvents = True End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Application.ScreenUpdating = False     If Cells(Target.Row, 1).Value <> "title2" Then Exit Sub     ActiveWindow.FreezePanes = False     ActiveWindow.Split = False     Application.Goto Cells(Target.Row, 1), scroll:=True     With ActiveWindow         .SplitColumn = 0         .SplitRow = 1     End With     ActiveWindow.FreezePanes = True     On Error Resume Next        'MUST reenable events     Application.EnableEvents = False     ActiveCell.Offset(1, 1 - Target.Column).Select     Application.EnableEvents = True End Sub

Trình xử lý sự kiện Worksheet_SelectionChange tự động di chuyển phần tách cố định xuống dưới hàng thứ hai của tiêu đề khi con trỏ ô đang hoạt động của bạn chạm vào dòng đó. Dòng này được phát hiện trong câu lệnh If để kiểm tra xem ô đầu tiên trong hàng có chứa văn bản “title2” hay không.

(Rõ ràng, điều này nên được thay đổi để phản ánh những gì thực sự sẽ có trong ô đầu tiên đó.)

Trình xử lý sự kiện Worksheet_BeforeRightClick di chuyển phần tách đã được cố định trở lại tập hợp tiêu đề đầu tiên nhưng để lại ô hiện hoạt ở hàng phía trên tập hợp tiêu đề thứ hai.

Bạn nên hiểu rằng cả hai giải pháp macro được trình bày trong mẹo này đều giả định rằng bạn thực sự đang cuộn qua trang tính và thay đổi ô đã chọn khi bạn di chuyển. (Nói cách khác, bạn đang nhấn phím Mũi tên Xuống để thực hiện thao tác cuộn của mình.) Nếu bạn chỉ đang thay đổi những gì được hiển thị trong trang tính bằng cách sử dụng thanh cuộn dọc, thì các tiêu đề cố định sẽ không thay đổi vì bạn không thay đổi ô đã chọn và trình xử lý sự kiện không bao giờ kích hoạt.

Việc tạo ra một giải pháp mở rộng hơn sẽ nằm ngoài phạm vi của mẹo này vì nó sẽ liên quan đến việc giao tiếp với hệ điều hành thực tế.

Tuy nhiên, nếu bạn muốn đi theo tuyến đường này, thì một nơi khởi đầu tốt có thể là trang này tại Web site của Chip Pearson’s:

http://www.cpearson.com/excel/DetectScroll.htm

_Lưu ý: _

Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.

ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.

Mẹo này (3446) áp dụng cho Microsoft Excel 97, 2000, 2002 và 2003. Bạn có thể tìm thấy phiên bản của mẹo này cho giao diện ribbon của Excel (Excel 2007 trở lên) tại đây: