Cần giúp: Di chuyển con trỏ đến những ô số liệu âm hoặc có định dạng đặc biệt

Liên hệ QC

tiniluu123

Có bao giờ bạn tự hỏi "Tôi là ai?"
Tham gia
25/1/19
Bài viết
190
Được thích
99
Giới tính
Nam
Nghề nghiệp
HR
Chào mọi người trong GPE !
Như tiêu đề tôi đã viết, trong file lương của tôi dữ liệu rất nhiều, quá trình nhập liệu và tính toán tôi hay note tô vàng ô (Fill) hoặc đổi màu dữ liệu. Nay tôi cần di chuyển con trỏ chuột đến ngay những ô số liệu âm hoặc có định dạng đặc biệt nhưng không biết cách. Nếu các ô đặc biệt chỉ nằm trên 1-2 cột hoặc 1-2 dòng thì tôi tìm dễ, còn các ô nó rải rác khắp Sheet thì tôi đang... chưa nghĩ ra cách.
Nhờ mọi người giúp ạ !
Xin cảm ơn. :)
 
À, với các ô định dạng đặc biệt thì tôi dùng chức năng tìm kiếm Ctrl+F rồi chọn Format cần tìm mà search thôi, hi.
Còn với các ô có số liệu âm thì làm sao mọi người ơi?!
 
Filter hoặc conditional formating
Tuy nhiên, nếu số liệu rải rác cả bảng thì nặng lắm.
 
Filter hoặc conditional formating
Tuy nhiên, nếu số liệu rải rác cả bảng thì nặng lắm.
@VetMini : thầy ơi tự nhiên em nghĩ ra cách luôn rồi.
Em conditional formattings chữ màu xanh lá cho những ô có giá trị <0. Xong em phủ khối vùng dữ liệu cần dò tìm, cái Ctrl+F find những ô có chữ màu xanh lá. => giải quyết được yêu cầu đầu bài. :D
Lỡ mà chưa phủ khối giới hạn vùng dữ liệu trước khi Find thì ngồi coi Excel nó chạy. :D
 
Chào mọi người trong GPE !
Như tiêu đề tôi đã viết, trong file lương của tôi dữ liệu rất nhiều, quá trình nhập liệu và tính toán tôi hay note tô vàng ô (Fill) hoặc đổi màu dữ liệu. Nay tôi cần di chuyển con trỏ chuột đến ngay những ô số liệu âm hoặc có định dạng đặc biệt nhưng không biết cách. Nếu các ô đặc biệt chỉ nằm trên 1-2 cột hoặc 1-2 dòng thì tôi tìm dễ, còn các ô nó rải rác khắp Sheet thì tôi đang... chưa nghĩ ra cách.
Nhờ mọi người giúp ạ !
Xin cảm ơn. :)
Nếu có file nêu mục đích cụ thể sẽ có cách hay đấy.
 
Nếu có file nêu mục đích cụ thể sẽ có cách hay đấy.
Dạ đây anh.

Đúng là em làm theo cách thủ công này lúc được lúc không, không hiểu. Nhiều khi em bấm Find All ngồi coi Excel nó search mãi thấy tội nó luôn, em ko biết khi nào nó search xong, 2-3 phút chưa xong em ESC interupt nó luôn:
"Em conditional formattings chữ màu xanh lá cho những ô có giá trị <0. Xong em phủ khối vùng dữ liệu cần dò tìm, cái Ctrl+F find những ô có chữ màu xanh lá."
 

File đính kèm

Dạ đây anh.

Đúng là em làm theo cách thủ công này lúc được lúc không, không hiểu. Nhiều khi em bấm Find All ngồi coi Excel nó search mãi thấy tội nó luôn, em ko biết khi nào nó search xong, 2-3 phút chưa xong em ESC interupt nó luôn:
"Em conditional formattings chữ màu xanh lá cho những ô có giá trị <0. Xong em phủ khối vùng dữ liệu cần dò tìm, cái Ctrl+F find những ô có chữ màu xanh lá."
Chọn vùng muốn kiểm tra số âm và nhấn vào cái biểu tượng PETROLIMEX.
Những số âm sẽ được tô nền màu vàng, chữ màu đỏ đậm.
(Chuyển File xuống bài 10).
 
Lần chỉnh sửa cuối:
Chọn vùng muốn kiểm tra số âm và nhấn vào cái biểu tượng PETROLIMEX.
Những số âm sẽ được tô nền màu vàng, chữ màu đỏ đậm.
Con chọn vùng nhỏ nó chạy đúng bình thường.
Con Ctrl A xong chạy thì nó hiện lỗi này nè bác.
Với cả mình kiu nó tô xong rồi nhảy tới ô đó luôn được không bác?

1590462856524.png

1590462803483.png
 
Con chọn vùng nhỏ nó chạy đúng bình thường.
Con Ctrl A xong chạy thì nó hiện lỗi này nè bác.
Với cả mình kiu nó tô xong rồi nhảy tới ô đó luôn được không bác?
1/ Code chọn vùng nhất định để sử dụng cho những chỗ cần thiết chứ không ai sử code cho cả Sheet làm gì khi những chỗ khác là trống (không có dữ liệu) và không có gì để tìm.
Tôi sửa code lại lấy vùng dữ liệu là A12:Z1930 (theo dữ liệu thực tế).

2/ Số thứ tự cột tôi định dạng lại là (#,##0)

3/ Để di chuyển đến số âm cần tìm thì thực hiện như sau:
Chọn cột A:Z rồi nhấn Ctrl + F để mở hộp thoại Find and Replace và nhấn nút Find Next tuần tự nó sẽ di chuyển đến từng số âm.

A_Tim.JPG
 

File đính kèm

Lần chỉnh sửa cuối:
Định dạng mẫu mã màu mè chỉ nên học qua 1 phần nhỏ trong phần cơ bản. Chủ yếu để ý thức chúng là gì.
Người muốn học lập trình VBA hiệu quả thì sau khi học qua định dạng phải tự cho mình câu châm ngôn sau: "tôi không lý gì đến mẫu mã màu mè nữa cho đến khì tôi đã thông qua phần nâng cao của VBA"
 
1/ Code chọn vùng nhất định để sử dụng cho những chỗ cần thiết chứ không ai sử code cho cả Sheet làm gì khi những chỗ khác là trống (không có dữ liệu) và không có gì để tìm.
Tôi sửa code lại lấy vùng dữ liệu là A12:Z1930 (theo dữ liệu thực tế).
...
3/ Để di chuyển đến số âm cần tìm thì thực hiện như sau:
Chọn cột A:Z rồi nhấn Ctrl + F để mở hộp thoại Find and Replace và nhấn nút Find Next tuần tự nó sẽ di chuyển đến từng số âm.

OK con dê luôn rồi. Rất đúng yêu cầu đề bài bác ơi.
Con thấy Macro này:
Mã:
Option Explicit
Sub KiemTra_SoAm()
    Dim c As Variant
    For Each c In Sheet1.Range("A12:Z1930")
        If c.Value < 0 Then c.Font.Bold = True 'To dâm
        If c.Value < 0 Then c.Font.ColorIndex = 3 'Màu Chu
        If c.Value < 0 Then c.Interior.ColorIndex = 6 'Màu nèn
    Next c
End Sub
Giờ con làm file lương khác chỉ cần cóp macro này vào file lương xong rồi assign nó vào cái hình logo Petro giống bác làm là được hén ! Cảm ơn bác. :)

@VetMini : dạ cảm ơn thầy.
 
Bạn thử cái này xem có tiện hơn không. Không cần phải tô màu, chạy code sẽ nhảy đến ô có số âm tiếp theo, nếu muốn áp dụng cho một vùng cụ thể thì chọn vùng trước khi chạy code (tương tự như Find).
Lưu ý: Code chỉ tìm thấy các số âm được định dạng kiểu có dấu trừ ở phía trước hoặc có cặp ngoặc đơn hai bên. Những kiểu định dạng khác (Ví dụ như 0;"Số âm") code sẽ không tìm ra.
Mã:
Sub GotoNegativeNumber()
Dim Cll As Range, Cll1 As Range, Cll2 As Range
Set Cll1 = FindCll("*(*)")
Set Cll2 = FindCll("-*")
If Cll1 Is Nothing Then
    Set Cll = Cll2
ElseIf Cll2 Is Nothing Then
    Set Cll = Cll1
Else
    If Cll1.Row = Cll2.Row Then
        If Cll1.Column < Cll2.Column Then
            If Cll1.Row = ActiveCell.Row Then
                If Cll1.Column > ActiveCell.Column Then
                    Set Cll = Cll1
                Else
                    Set Cll = Cll2
                End If
            Else
                Set Cll = Cll1
            End If
        Else
            If Cll1.Row = ActiveCell.Row Then
                If Cll2.Column > ActiveCell.Column Then
                    Set Cll = Cll2
                Else
                    Set Cll = Cll1
                End If
            Else
                Set Cll = Cll2
            End If
        End If
    Else
        If Cll1.Row < Cll2.Row Then
            If Cll1.Row > ActiveCell.Row Or (Cll1.Row = ActiveCell.Row And Cll1.Column > ActiveCell.Column) Then
                Set Cll = Cll1
            Else
                Set Cll = Cll2
            End If
        Else
            If Cll2.Row > ActiveCell.Row Or (Cll2.Row = ActiveCell.Row And Cll2.Column > ActiveCell.Column) Then
                Set Cll = Cll2
            Else
                Set Cll = Cll1
            End If
        End If
    End If
End If
If Not Cll Is Nothing Then
    Cll.Activate
End If
End Sub
Private Function FindCll(sStr As String) As Range
Dim ApplyRng As Range, Cll As Range, sFirstCll As String
If ActiveCell.MergeArea.Address = Selection.Address Then
    Set ApplyRng = Cells
Else
    Set ApplyRng = Selection
End If
Set Cll = ApplyRng.Find(What:=sStr, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext)
If Not Cll Is Nothing Then
    sFirstCll = Cll.Address
    Do
        If IsNegativeNumber(Cll.Value2) Then
            Set FindCll = Cll
            Exit Function
        End If
        Set Cll = ApplyRng.FindNext(After:=Cll)
    Loop Until Cll.Address = sFirstCll
End If
End Function
Private Function IsNegativeNumber(ByVal Val As Variant) As Boolean
If Application.WorksheetFunction.IsNumber(Val) Then
    IsNegativeNumber = (Val < 0)
End If
End Function
 
Bạn thử cái này xem có tiện hơn không. Không cần phải tô màu, chạy code sẽ nhảy đến ô có số âm tiếp theo, nếu muốn áp dụng cho một vùng cụ thể thì chọn vùng trước khi chạy code (tương tự như Find).
Lưu ý: Code chỉ tìm thấy các số âm được định dạng kiểu có dấu trừ ở phía trước hoặc có cặp ngoặc đơn hai bên. Những kiểu định dạng khác (Ví dụ như 0;"Số âm") code sẽ không tìm ra.
Mã:
Sub GotoNegativeNumber()
Dim Cll As Range, Cll1 As Range, Cll2 As Range
Set Cll1 = FindCll("*(*)")
Set Cll2 = FindCll("-*")
If Cll1 Is Nothing Then
    Set Cll = Cll2
ElseIf Cll2 Is Nothing Then
    Set Cll = Cll1
Else
    If Cll1.Row = Cll2.Row Then
        If Cll1.Column < Cll2.Column Then
            If Cll1.Row = ActiveCell.Row Then
                If Cll1.Column > ActiveCell.Column Then
                    Set Cll = Cll1
                Else
                    Set Cll = Cll2
                End If
            Else
                Set Cll = Cll1
            End If
        Else
            If Cll1.Row = ActiveCell.Row Then
                If Cll2.Column > ActiveCell.Column Then
                    Set Cll = Cll2
                Else
                    Set Cll = Cll1
                End If
            Else
                Set Cll = Cll2
            End If
        End If
    Else
        If Cll1.Row < Cll2.Row Then
            If Cll1.Row > ActiveCell.Row Or (Cll1.Row = ActiveCell.Row And Cll1.Column > ActiveCell.Column) Then
                Set Cll = Cll1
            Else
                Set Cll = Cll2
            End If
        Else
            If Cll2.Row > ActiveCell.Row Or (Cll2.Row = ActiveCell.Row And Cll2.Column > ActiveCell.Column) Then
                Set Cll = Cll2
            Else
                Set Cll = Cll1
            End If
        End If
    End If
End If
If Not Cll Is Nothing Then
    Cll.Activate
End If
End Sub
Private Function FindCll(sStr As String) As Range
Dim ApplyRng As Range, Cll As Range, sFirstCll As String
If ActiveCell.MergeArea.Address = Selection.Address Then
    Set ApplyRng = Cells
Else
    Set ApplyRng = Selection
End If
Set Cll = ApplyRng.Find(What:=sStr, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext)
If Not Cll Is Nothing Then
    sFirstCll = Cll.Address
    Do
        If IsNegativeNumber(Cll.Value2) Then
            Set FindCll = Cll
            Exit Function
        End If
        Set Cll = ApplyRng.FindNext(After:=Cll)
    Loop Until Cll.Address = sFirstCll
End If
End Function
Private Function IsNegativeNumber(ByVal Val As Variant) As Boolean
If Application.WorksheetFunction.IsNumber(Val) Then
    IsNegativeNumber = (Val < 0)
End If
End Function

Tôi gán Macro vào 1 tổ hợp phím tắt và hoạt động rất tốt luôn. Không chọn vùng nhất định cũng chạy rất nhanh, còn chọn vùng rõ ràng thì lại càng mượt.
Cảm ơn bạn đã giúp. Đáp ứng tốt yêu cầu đặt ra.
Chỉ có điều đoạn code của bạn làm tôi phải nghiên cứu nhiều, nhìn mà đầu váng mắt hoa luôn, hi. :D
 
Web KT

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

Back
Top Bottom