Highlight đơn giản (cải tiến mới)

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,912
Lần trước tôi có đưa lên 1 file về Highlight, nhưng còn bị trục trặc là ko copy, cut dc... Sau đó bạn Soibien có cải tiến lại nhưng code còn phức tạp quá...
Lần này xin đưa 1 giãi pháp mới với code vô cùng đơn giãn, tin chắc ai cũng làm dc...
Về phần tô màu thì nằm trong Conditional Formating:
Condition1: =ROW()=CELL("ROW")
Condition2: =COLUMN()=CELL("COL")
Phần code dc cải tiến như sau:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
   Application.ScreenUpdating = True
End Sub
Mời các bạn xem file... Ở đây ta có thể copy, cut bình thường
ANH TUẤN
 

File đính kèm

Cải tiến file của bác anhtuan1066

Việc kích hoạt Highlight cho một khu vực nhưng khi con trỏ nằm ngoài ở khu vực có công thức Highlight thì màn hình vẫn bị "rung". Vấn đề nữa là nếu như các sheet khác em cũng tạo công thức Highlight thì mỗi sheet em lại phải soạn đoạn code như trong sheet "Highlight".

Để cho chạy "mịn" hơn và áp dụng chung cho cả Workbook, em sửa đoạn code như dưới đây:
+ Xóa thủ tục "Worksheet_SelectionChange" trong sheet "Highlight"
+ Tạo thủ tục (sự kiện) "Workbook_SheetSelectionChange" trong ThisWorkbook

Hoạt động của code:
+ Kiểm tra có FormatConditions không (FormatConditions.Count>0) ?
+ Có công thức Highlight không ("=ROW()=CELL(""ROW"")") ?
+ Nếu thỏa mãn các điều kiện trên thì thực hiện tính toán lại cho vùng đang hoạt động.

Mã:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim cond As FormatCondition
   If Target.Cells(1, 1).FormatConditions.Count > 0 Then
    Set cond = Target.Cells(1, 1).FormatConditions(1)
    If cond.Formula1 = "=ROW()=CELL(""ROW"")" Then
        Target.Calculate
    End If
    Set cond = Nothing
   End If
End Sub
 

File đính kèm

Upvote 0
Ối ? Thế này thì chức năng Tools --->Highlight Changes...làm nổi bật sự thay đổi của Excel không còn tác dụng gì nữa hay là sao ?
 
Upvote 0
kongcom đã viết:
Ối ? Thế này thì chức năng Tools --->Highlight Changes...làm nổi bật sự thay đổi của Excel không còn tác dụng gì nữa hay là sao ?

Hai cái này tác dụng khác nhau hoàn toàn mà bạn.
"Highlight Changes" <> "Highlight Selection"
 
Upvote 0
Với bạn TuanVNUNI: Thật ra lúc trước Soibien cũng đã làm 1 code gần tương tự như bạn vậy và đã chạy rất hoàn hão... Vấn đề ở đây là người dùng tầm thấp với tay ko tới (đại khái nếu kêu tự tay làm sẽ ko nhớ code đễ làm)... Chính vì lẽ đó là tôi đề xuất giãi pháp đơn giãn hơn... Nó phù hợp với nhóm bình dân ấy mà... dù có "giật giật" tí cũng tạm chấp nhận dc giống như ta đã từng chấp nhận xe TQ... hi.. hi...
Cùng còn 1 giãi pháp đơn giãn nữa, đó là:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If Application.CutCopyMode = False Then Calculate
End Sub
Tôi tin chắc vẫn còn nhiều giãi pháp đơn giãn khác nữa đấy... Đễ xem...
ANH TUẤN
 
Lần chỉnh sửa cuối:
Upvote 0
anhtuan1066 đã viết:
Cùng còn 1 giãi pháp đơn giãn nữa, đó là:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If Application.CutCopyMode = False Then Calculate
End Sub
Tôi tin chắc vẫn còn nhiều giãi pháp đơn giãn khác nữa đấy... Đễ xem...
ANH TUẤN

Nếu không phải vừa Copy hay Cut (CTRL+C/X) thì Application.CutCopyMode luôn luôn bằng False . Như vậy, thật không công bằng khi cứ di con trỏ ô thì toàn bộ công thức trong bảng tính lại phải tính lại;;;;;;;;;;;
Đoạn code trên của bác tương đương với lệnh dưới đây
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   [COLOR="SeaGreen"]'MsgBox Application.CutCopyMode  'False (0) [/COLOR]
   Calculate
End Sub
Không cần phải dùng If vì Application.CutCopyMode luôn là False.

Bác thật có thiện ý cho những người mới tiếp cận Excel! Đơn giản hóa mọi thứ em nghĩ là tốt nhưng với điều kiện nó phải "an toàn" chung. Em thấy trong Tin học (lập trình) những thứ tuyệt vời thường không đơn giản.
 
Lần chỉnh sửa cuối:
Upvote 0
Tuân nói rất đúng... nhưng nếu ko đi từ đơn giãn nhất thì làm sao các bạn mới học có cơ hội tiếp cận dc với những code cao cấp... Tôi thì cứ nghĩ đơn giãn: Khi các bạn ấy xài 1 code đơn giãn, đến lúc nào đó phát hiện nhược điễm tự nhiên sẽ có yêu cầu mới xuất hiện... Như thế mới gọi là từ thấp lên cao... Một bước lên mây e rằng rât khó đấy Tuân à...
Mến
ANH TUẤN
 
Upvote 0
Việc kích hoạt Highlight cho một khu vực nhưng khi con trỏ nằm ngoài ở khu vực có công thức Highlight thì màn hình vẫn bị "rung". Vấn đề nữa là nếu như các sheet khác em cũng tạo công thức Highlight thì mỗi sheet em lại phải soạn đoạn code như trong sheet "Highlight".

Để cho chạy "mịn" hơn và áp dụng chung cho cả Workbook, em sửa đoạn code như dưới đây:
+ Xóa thủ tục "Worksheet_SelectionChange" trong sheet "Highlight"
+ Tạo thủ tục (sự kiện) "Workbook_SheetSelectionChange" trong ThisWorkbook

Hoạt động của code:
+ Kiểm tra có FormatConditions không (FormatConditions.Count>0) ?
+ Có công thức Highlight không ("=ROW()=CELL(""ROW"")") ?
+ Nếu thỏa mãn các điều kiện trên thì thực hiện tính toán lại cho vùng đang hoạt động.

Mã:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim cond As FormatCondition
   If Target.Cells(1, 1).FormatConditions.Count > 0 Then
    Set cond = Target.Cells(1, 1).FormatConditions(1)
    If cond.Formula1 = "=ROW()=CELL(""ROW"")" Then
        Target.Calculate
    End If
    Set cond = Nothing
   End If
End Sub
Bạn có thể hướng dẫn chi tiết hơn để người mới bắt đầu cùng có thể làm được không ?? Mình đã làm đi làm lại mà vẫn không được.
+ Xóa thủ tục "Worksheet_SelectionChange" trong sheet "Highlight"
+ Tạo thủ tục (sự kiện) "Workbook_SheetSelectionChange" trong ThisWorkbook
Hai thủ tục trên phải làm như thế nào ???
Mình đã xem file đính kèm của bản rồi nó rất tuyệt. Còn một vấn đền nữa là trong đoạn code trên:
If Target.Cells(1, 1).FormatConditions.Count > 0 Then
Set cond = Target.Cells(1, 1).FormatConditions(1)
Phần mà mình đánh đậm và tô đỏ có phải là số dòng trong cell không ???
Giúp mình với nhé, mình mới làm quen với VBA được vài ngày.
Chân trọng cảm ơn !
 
Upvote 0
Mình nghĩ, không nhất thiết phải tô màu cả dòng hay cả cột đâu, như thế phí màu lắm!
Đoạn Code này chỉ tô những ô có dữ liệu trong dòng & cột ta đụng chuột vô mà thôi:
PHP:
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 
 If Not Intersect(Target, [a1].CurrentRegion) Is Nothing Then
    Dim bCol As Byte, tCol As Byte, tRow As Long, lRow As Long
    
    [a1].CurrentRegion.Interior.ColorIndex = 2
    tRow = Target.Row:          lRow = Target.End(xlDown).Row
5    tCol = Target.Column     
    bCol = [a1].CurrentRegion.Columns.Count
    
    Range(Cells(tRow, 1), Cells(tRow, bCol)).Interior.ColorIndex = 35
8    Range(Cells(1, tCol), Cells(lRow, tCol)).Interior.ColorIndex = 35
    
 End If
 
End Sub
Nếu bạn không thích tô màu cột thì vô hiệu hóa các dòng lệnh có đánh số í đi.

Có thấy gì sảy ra đâu bạn, Bạn hướng dẫn chi tiết hơn một chút được không
Với 1 sheet có dữ liệu ở tất cả các ô từ 'A1' đến Z99;
Bạn phải chuột vô SheetNames ( thanh dưới, phải nhất) & chép đoạn Code mình đưa ra vô CS VBE vừa xuất hiện;
Sau đó, nếu bạn dí chuột vô ô nào bất kỳ trong vùng sử dụng sẽ thấy kết quả
 
Upvote 0
Mình nghĩ, không nhất thiết phải tô màu cả dòng hay cả cột đâu, như thế phí màu lắm!
Đoạn Code này chỉ tô những ô có dữ liệu trong dòng & cột ta đụng chuột vô mà thôi:
PHP:
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 
 If Not Intersect(Target, [a1].CurrentRegion) Is Nothing Then
    Dim bCol As Byte, tCol As Byte, tRow As Long, lRow As Long
    
    [a1].CurrentRegion.Interior.ColorIndex = 2
    tRow = Target.Row:          lRow = Target.End(xlDown).Row
5    tCol = Target.Column     
    bCol = [a1].CurrentRegion.Columns.Count
    Có thấy gì xảy ra đâu bạn, bạn hướng dẫn chi tiết hơn được không
    Range(Cells(tRow, 1), Cells(tRow, bCol)).Interior.ColorIndex = 35
8    Range(Cells(1, tCol), Cells(lRow, tCol)).Interior.ColorIndex = 35
    
 End If
 
End Sub
Nếu bạn không thích tô màu cột thì vô hiệu hóa các dòng lệnh có đánh số í đi.
Có thấy gì sảy ra đâu bạn, Bạn hướng dẫn chi tiết hơn một chút được không

Với 1 sheet có dữ liệu ở tất cả các ô từ 'A1' đến Z99;
Bạn phải chuột vô SheetNames ( thanh dưới, phải nhất) & chép đoạn Code mình đưa ra vô CS VBE vừa xuất hiện;
Sau đó, nếu bạn dí chuột vô ô nào bất kỳ trong vùng sử dụng sẽ thấy kết quả
Bạn cho cái ví dụ đi mình thực hiện nhiều lần rồi mà chẳng thấy có cái gì sảy ra cả ???
 
Upvote 0
Mã:
                      Bạn cho cái ví dụ đi mình thực hiện nhiều lần rồi mà chẳng thấy có cái gì sảy ra cả ???
 

File đính kèm

Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom