Highlight hàng khi di chuyển chuột

Liên hệ QC
Highlight hàng khi di chuyển chuột


Cách thứ nhất: là dùng Conditional Formatting.
Các bạn thực hiện các bước như hình:
Bước 1: Chọn vùng bạn muốn highlight (tô màu) khi di chuyển.
Bước 2: Chọn Conditional Formatting > Use a formula to determine which cells to format và nhập vào công thức
Mã:
=ROW()=CELL("ROW")
(Bạn chú ý hai hàm ROW và CELL ở trong công thức - Các bạn có thể tìm hiểu thêm về 2 hàm này tại đây với hàm ROW và đây với hàm CELL)
Các bạn cũng có thể phối hợp các hàng khác, để khi bạn di chuyển phải bảo đảm rằng giá trị công thức trả về khi bạn chọn hàng hiện hành là TRUE.

Sau đó chọn định dạng như: Bold, màu nền, màu chữ,... theo ý của bạn. Cuối cùng chọn nút "OK" để áp dụng.

24134026579_9fb5a7582d_o.jpg


Bước cuối cùng là đưa vào thủ tục sự kiện
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.ScreenUpdating = True
End Sub

Như vậy bạn khi di chuyển ô chọn bạn sẽ thấy định dạng theo như bạn muốn.
Các bạn có thể download tập tin tại đây.

Cách trên được đưa ra bởi bạn hoangminhtien.

Cách thứ hai: là kết hợp giữa các hàm Window API.
Cách này của thành viên rollover79.
Ở cách này tác giả có hai nút để các bạn quyết định bắt đầu hay không bắt đầu Highlight.

Để thực hiện, các bạn hãy tạo một module và đưa đoạn mã sau vào:

Mã:
Private Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long

Public curCell As Range

Public Type POINTAPI
    X          As Long
    Y          As Long
End Type

Private CursorPos As POINTAPI
Private CursorCell As Range
Public bActive As Boolean

' Thủ tục này sẽ được gọi khi bạn muốn bắt đầu quá trình Highlight hàng
Sub Active()
    On Error Resume Next
    If bActive Then Exit Sub
    SetTimer Application.hWnd, 1, 250, AddressOf RowAlternative
    bActive = True
End Sub

' Thủ tục này sẽ được gọi khi bạn muốn kết thúc quá trình Highlight hàng
Sub DeActive()
    On Error Resume Next
    bActive = False
    KillTimer Application.hWnd, 1
    ActiveSheet.Rows(curCell.Row).FormatConditions(1).Delete
End Sub

' Thủ tục chính để tô màu hàng tại vị trí con trỏ
Private Function RowAlternative()
    On Error Resume Next

    Dim RetVal As Long
    RetVal = GetCursorPos(CursorPos)
    RetVal = WindowFromPoint(CursorPos.X, CursorPos.Y)
   
    ' Sẽ không thực hiện nếu ứng dụng không phải là Excel
    If (Application.Name <> "Microsoft Excel") Then Exit Function
    Set CursorCell = Application.Windows(1).RangeFromPoint(CursorPos.X, CursorPos.Y)

    If Err.Number = 0 Then
        ' Thực hiện xóa tô màu ở hàng cũ, và tô màu ở hàng mới
        If CursorCell.Address <> curCell.Address Then
            ActiveSheet.Rows(curCell.Row).FormatConditions(1).Delete
            Set curCell = CursorCell
            ActiveSheet.Rows(curCell.Row).FormatConditions.Add xlExpression, , "=true"
            ActiveSheet.Rows(curCell.Row).FormatConditions(1).Interior.ColorIndex = 24
        End If
    End If
End Function

Nguyên tắc của cách hai là, dùng các hàm API để xác định vị trí của chuột và tô màu ở hàng này. Đây là một cách làm sáng tạo.
Như vậy với cách làm này thì khi bạn di chuyển bằng các phím mủi tên thì cách này không thể áp dụng được.

24419403271_51e36c0261_o.jpg


Các bạn có thể tải tập tin tại đây.

Link của topic nói về vấn đề này tại đây.

Cách thứ ba: là dựa vào thủ tục sự kiện Worksheet_SelectionChange.

Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    Const cnNUMCOLS As Long = 256
   ' Màu mặc định là màu vàng
    Const cnHIGHLIGHTCOLOR As Long = 36               '
    Static rOld As Range
    Static nColorIndices(1 To cnNUMCOLS) As Long
    Dim i      As Long
    If Not rOld Is Nothing Then                      ' Phục hồi lại màu nền của ô cũ
        With rOld.Cells
            If .Row = ActiveCell.Row Then Exit Sub    ' Cùng một hàng không phục hồi
            For i = 1 To cnNUMCOLS
                .Item(i).Interior.ColorIndex = nColorIndices(i)
            Next i
        End With
    End If
    Set rOld = Cells(ActiveCell.Row, 1).Resize(1, cnNUMCOLS)
    With rOld
        For i = 1 To cnNUMCOLS
            nColorIndices(i) = .Item(i).Interior.ColorIndex
        Next i
        .Interior.ColorIndex = cnHIGHLIGHTCOLOR
    End With
End Sub
Với đoạn mã ở trên, việc thực thi sẽ chậm nếu có nhiều ô trong cùng một hàng phải phục hồi màu nền.

Hoặc đơn giản hơn ta có thể dùng đoạn mã sau:
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
        Cells.Interior.ColorIndex = xlColorIndexNone
        ActiveCell.EntireRow.Interior.ColorIndex = 36
End Sub
Nguồn: http://www.mcgimpsey.com/excel/highlightrow.html

Lê Văn Duyệt

Một số bài viết có liên quan:
1/ Spreadsheet Design: TRÌNH BÀY BẢNG TÍNH
2/ Chiêu số 23: Bật, tắt chức năng Conditional Formatting bằng 1 checkbox
3/ Chiêu thứ 21: Tô màu dòng xen kẽ
4/ Chiêu số 19: Đánh dấu những ô chứa công thức bằng Conditional Formatting
5/ Sử dụng định dạng có điều kiện (Conditional Formatting) để làm nổi bật ngày tháng trong Excel
6/ Chiêu số 18: Điều khiển Conditional Formating bằng checkbox
7/ Chiêu số 11: Tìm dữ liệu xuất hiện 2 hoặc nhiều lần bằng công cụ Conditional Formating
8/ Chiêu thứ 8: Giới hạn vùng cuộn của bảng tính
9/ Ebook: Dữ liệu & Báo cáo trong Excel 2013
10/ Phân tích tồn kho theo phương pháp ABC
 
Chỉnh sửa lần cuối bởi điều hành viên:
Ad giải thích giúp e Bước cuối cùng đưa thủ tục vào vào sự kiện là gì ạ?
Đoạn code bên dưới thì insert vào đâu ạ? Chỉ cần Copy và paste vào thôi ah?
Thanks
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn vào cửa sổ VBE torng Excel bằng Alt + F11, rồi chọn vào Sheet bạn cần, sau đó chọn sự kiện và copy đoạn code vào là được nha bạn.
 
Upvote 0
các bạn cho mình hỏi, cũng như cách ở trên, nhưng giờ mình muốn, ô có con trỏ chuộc thì màu xám, còn hàng có con trỏ chuộc thì màu vàng (ý mình muốn là ô có con trỏ chuột thì khác màu với hàng của nó, để mình có thể biết con trỏ chuột nó đang nằm ở ô nào) mình phải làm sao ạh.
 
Upvote 0
các bạn cho mình hỏi, cũng như cách ở trên, nhưng giờ mình muốn, ô có con trỏ chuộc thì màu xám, còn hàng có con trỏ chuộc thì màu vàng (ý mình muốn là ô có con trỏ chuột thì khác màu với hàng của nó, để mình có thể biết con trỏ chuột nó đang nằm ở ô nào) mình phải làm sao ạh.

Bạn thêm 1 điều kiện định dạng có điều kiện nữa là xong.

Cách trên được đưa ra bởi bạn hoangminhtien.
Ngại quá, hình như cách này mình cũng học được của ai đó trên diễn đàn thôi, không phải mình đưa ra.
 

File đính kèm

  • Highlight.xls
    40.5 KB · Đọc: 100
Upvote 0
bạn ơi cho mình hỏi,Mình làm theo cách thứ 3 thì tại sao khi mình lưu file excel lại thì màu nền tại dòng đó vẫn còn mà không bị mất đi vậy ạ. Như thế khi mình lưu lại file và mở lại khoảng 10 lần thì có 10 dòng bị bôi màu. @@. có cách nào làm cho nó hết không vậy ?
https://goo.gl/photos/5a7uNeQV82GNstcR6
 
Lần chỉnh sửa cuối:
Upvote 0
Có bác nào chỉ giúp e cách tắt bật HighLight được ko.
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Const cnNUMCOLS As Long = 256
' Màu mặc định là màu vàng
Const cnHIGHLIGHTCOLOR As Long = 36 '
Static rOld As Range
Static nColorIndices(1 To cnNUMCOLS) As Long
Dim i As Long
If Not rOld Is Nothing Then ' Phục hồi lại màu nền của ô cũ
With rOld.Cells
If .Row = ActiveCell.Row Then Exit Sub ' Cùng một hàng không phục hồi
For i = 1 To cnNUMCOLS
.Item(i).Interior.ColorIndex = nColorIndices(i)
Next i
End With
End If
Set rOld = Cells(ActiveCell.Row, 1).Resize(1, cnNUMCOLS)
With rOld
For i = 1 To cnNUMCOLS
nColorIndices(i) = .Item(i).Interior.ColorIndex
Next i
.Interior.ColorIndex = cnHIGHLIGHTCOLOR
End With
End Sub
Code này rất hay nhưng mà chạy luôn thì ko hay. Khi cần dùng mới bật, ví dụ code sau (nhưng khổ nỗi e lại không dùng được màu nền khác)
<sheet can highlight>

Public HighlightActiveColumnAndRow As Boolean
Public Sub Worksheet_SelectionChange(ByVal Target As Range)
With Me
.Cells.Interior.ColorIndex = xlNone
If .HighlightActiveColumnAndRow Then
Target.EntireColumn.Interior.ColorIndex = 7
Target.EntireRow.Interior.ColorIndex = 7
End If
End With
End Sub
<module>
Sub ToggleRCHighlight()
With Sheet1
.HighlightActiveColumnAndRow = Not Sheet1.HighlightActiveColumnAndRow
If ActiveSheet.Name = .Name Then .Worksheet_SelectionChange Selection
End With
End Sub
=> Nhờ các bác chỉ giáo !!!
 
Upvote 0
Web KT
Back
Top Bottom