Xin được giúp đỡ Code kiểm tra vùng dữ liệu

Liên hệ QC

Bùi Thúy Thúy

Thành viên thường trực
Tham gia
2/7/18
Bài viết
289
Được thích
38
Trong vùng kẻ khung cho E xin code để kiểm tra vùng từ cột D đến cột I với điều kiện :
Nếu ô nào không có giá trị ngày tháng và không phải là ô trống thì tô màu
(Kết quả: Trên vùng là các ô tô màu sau khi đã kiểm tra)
Chup.jpg
Mong sự giúp đỡ của Anh Chị và các Bạn
 

File đính kèm

Anh @ befaint ới em đã viết được cái Code kinh khủng này. Nhìn thấy khiếp quá đi

PHP:
Option Explicit
Sub Kiemtra()
    Dim Arr, J As Long, Dongcuoi As Long
    Dim SRng As Range, eRng As Range, Cll As Range
Arr = Array(15, 16, 18, 19, 21, 22, 24, 25)
Dongcuoi = Range("A" & Rows.Count).End(xlUp).Row
For J = LBound(Arr) To UBound(Arr)
    Set SRng = Range(Cells(9, Arr(J)), Cells(Dongcuoi, Arr(J)))
    Select Case Arr(J)
        Case 15, 18, 21, 24 To 25
            Kiemtrangay SRng
        Case 16, 19, 22
            Kiemtragio SRng
    End Select
Next J
End Sub
Sub Kiemtrangay(ByVal SRng As Range)
    Dim Rng As Range, Cll As Range
    Dim fYear As Long, eYear As Long
    fYear = Year(Now()) - 4:  eYear = Year(Now()) + 1
    SRng.Interior.Pattern = xlNone
    SRng.Font.Strikethrough = False
    For Each Cll In SRng
        If IsError(Cll) Then GoTo Tiep
        If Cll <> Empty And Not IsDate(Cll) Then GoTo Tiep
        If Cll <> Empty Then
            If Year(Cll) <= fYear Then
                If Year(Cll) <= eYear Then
Tiep:
                    If Rng Is Nothing Then
                        Set Rng = Cll
                    Else
                        Set Rng = Union(Rng, Cll)
                    End If
                End If
            End If
        End If
    Next
    If Not Rng Is Nothing Then
        Rng.Interior.Color = 7988676
        Rng.Font.Strikethrough = True
    End If
End Sub
Sub Kiemtragio(ByVal SRng As Range)
    Dim Rng As Range, Cll As Range, DK As Boolean
    Dim aTmp, TmpBD, TmpKT, J As Long
    Dim GioBD As Double, GioKT As Double, FGio As Double, EGio As Double
    Dim sTimeAm As Double, eTimeAM As Double, sTimePM As Double, eTimePM As Double
    sTimeAm = 7 + 30 / 60: eTimeAM = 11 + 30 / 60
    sTimePM = 13 + 30 / 60: eTimePM = 17
    SRng.Interior.Pattern = xlNone
    SRng.Font.Strikethrough = False
    For Each Cll In SRng
        DK = False
        If IsError(Cll) Then
            DK = True: GoTo Tiep
        End If
        If Cll <> Empty Then
            aTmp = Split(Cll, "-")
            If UBound(aTmp) < 1 Then
                DK = True: GoTo Tiep
            Else
                TmpBD = Split(aTmp(0), "h")
                TmpKT = Split(aTmp(1), "h")
                '-----------------------------------------------
                If UBound(TmpBD) >= 1 Then
                    GioBD = CLng(TmpBD(0)) + CLng(TmpBD(1)) / 60
                    '++++++++++++++++++++++++
                    If GioBD < eTimeAM Then
                        FGio = sTimeAm: EGio = eTimeAM
                    Else
                        FGio = sTimePM: EGio = eTimePM
                    End If
                    '+++++++++++++++++++++++++
                    If GioBD < FGio Then
                        DK = True: GoTo Tiep
                    End If
                Else
                    DK = True: GoTo Tiep
                End If
                '---------------------------------------------------
                If UBound(TmpKT) >= 1 Then
                    GioKT = CLng(TmpKT(0)) + CLng(TmpKT(1)) / 60
                    If GioKT > EGio Then
                        DK = True: GoTo Tiep
                    End If
                Else
                    DK = True: GoTo Tiep
                End If
                '------------------------------------------
                If GioKT - GioBD <= 0 Then
                    DK = True: GoTo Tiep
                End If
            End If
        End If
Tiep:
        If DK = True Then
            If Rng Is Nothing Then
                Set Rng = Cll
            Else
                Set Rng = Union(Rng, Cll)
            End If
        End If
    Next
    If Not Rng Is Nothing Then
        Rng.Interior.Color = 13434879
        Rng.Font.Strikethrough = True
    End If
End Sub

@Bùi Thúy Thúy Test thử xem có cái gì nó không ưng cái bụng không nha :p:p:p
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Anh @ befaint ới em đã viết được cái Code kinh khủng này. Nhìn thấy khiếp quá đi

PHP:
Option Explicit
Sub Kiemtra()
    Dim Arr, J As Long, Dongcuoi As Long
    Dim sRng As Range, eRng As Range, Cll As Range
Arr = Array(15, 16, 18, 19, 21, 22, 24, 25)
Dongcuoi = Range("A" & Rows.Count).End(xlUp).Row
For J = LBound(Arr) To UBound(Arr)
    Set sRng = Range(Cells(9, Arr(J)), Cells(Dongcuoi, Arr(J)))
    Select Case Arr(J)
        Case 15, 18, 21, 24 To 25
            Kiemtrangay sRng
        Case 16, 19, 22
            Kiemtragio sRng
    End Select
Next J
End Sub
Sub Kiemtrangay(ByVal sRng As Range)
    Dim Rng As Range, Cll As Range
    Dim fYear As Long, eYear As Long
    fYear = Year(Now()) - 4:  eYear = Year(Now()) + 1
    sRng.Interior.Pattern = xlNone
    sRng.Font.Strikethrough = False
    For Each Cll In sRng
        If IsError(Cll) Then GoTo Tiep
        If Cll <> Empty And Not IsDate(Cll) Then GoTo Tiep
        If Cll <> Empty Then
            If Year(Cll) <= fYear Then
                If Year(Cll) >= eYear Then
Tiep:
                    If Rng Is Nothing Then
                        Set Rng = Cll
                    Else
                        Set Rng = Union(Rng, Cll)
                    End If
                End If
            End If
        End If
    Next
    If Not Rng Is Nothing Then
        Rng.Interior.Color = 7988676
        Rng.Font.Strikethrough = True
    End If
End Sub
Sub Kiemtragio(ByVal sRng As Range)
    Dim Rng As Range, Cll As Range, DK As Boolean
    Dim aTmp, TmpBD, TmpKT, J As Long
    Dim GioBD As Double, GioKT As Double, FGio As Double, EGio As Double
    Dim sTimeAm As Double, eTimeAM As Double, sTimePM As Double, eTimePM As Double
    sTimeAm = 7 + 30 / 60: eTimeAM = 11 + 30 / 60
    sTimePM = 13 + 30 / 60: eTimePM = 17
    Set sRng = Range("P9:P18")
    sRng.Interior.Pattern = xlNone
    sRng.Font.Strikethrough = False
    For Each Cll In sRng
        DK = False
        If IsError(Cll) Then
            DK = True: GoTo Tiep
        End If
        If Cll <> Empty Then
            aTmp = Split(Cll, "-")
            If UBound(aTmp) < 1 Then
                DK = True: GoTo Tiep
            Else
                TmpBD = Split(aTmp(0), "h")
                TmpKT = Split(aTmp(1), "h")
                '-----------------------------------------------
                If UBound(TmpBD) >= 1 Then
                    GioBD = CLng(TmpBD(0)) + CLng(TmpBD(1)) / 60
                    '++++++++++++++++++++++++
                    If GioBD < eTimeAM Then
                        FGio = sTimeAm: EGio = eTimeAM
                    Else
                        FGio = sTimePM: EGio = eTimePM
                    End If
                    '+++++++++++++++++++++++++
                    If GioBD < FGio Then
                        DK = True: GoTo Tiep
                    End If
                Else
                    DK = True: GoTo Tiep
                End If
                '---------------------------------------------------
                If UBound(TmpKT) >= 1 Then
                    GioKT = CLng(TmpKT(0)) + CLng(TmpKT(1)) / 60
                    If GioKT > EGio Then
                        DK = True: GoTo Tiep
                    End If
                Else
                    DK = True: GoTo Tiep
                End If
                '------------------------------------------
                If GioKT - GioBD <= 0 Then
                    DK = True: GoTo Tiep
                End If
            End If
        End If
Tiep:
        If DK = True Then
            If Rng Is Nothing Then
                Set Rng = Cll
            Else
                Set Rng = Union(Rng, Cll)
            End If
        End If
    Next
    If Not Rng Is Nothing Then
        Rng.Interior.Color = 13434879
        Rng.Font.Strikethrough = True
    End If
End Sub


@Bùi Thúy Thúy Test thử xem có cái gì nó không ưng cái bụng không nha :p:p:p
hi dài nhưng mà vẫn ok, hi....là được bạn ạ!
 
Upvote 0
Trong vùng kẻ khung cho E xin code để kiểm tra vùng từ cột D đến cột I với điều kiện :
Nếu ô nào không có giá trị ngày tháng và không phải là ô trống thì tô màu
(Kết quả: Trên vùng là các ô tô màu sau khi đã kiểm tra)
View attachment 200518
Mong sự giúp đỡ của Anh Chị và các Bạn
Đây là code ngắn gọn (3 trong 1), nó xác định 3 kiểu định dạng (chọn vùng cần rồi nhấn nút).
- Nếu là số và ngày tháng tô màu xanh.
- Nếu là hàm tô màu vàng.
- Nếu là Text tô màu hường.
Mã:
Sub DanhDau()
Dim Vung As Range
Set Vung = Selection
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next 
    'Só, ngày
    Vung.SpecialCells(xlCellTypeConstants).Interior.ColorIndex = 33
    'Hàm
    Vung.SpecialCells(xlCellTypeFormulas).Interior.ColorIndex = 27
    'Text
    Vung.SpecialCells(xlCellTypeConstants, 2).Interior.ColorIndex = 40
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

A_DD.JPG
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Đây là code ngắn gọn (3 trong 1), nó xác định 3 kiểu định dạng (chọn vùng cần rồi nhấn nút).
- Nếu là số và ngày tháng tô màu xanh.
- Nếu là hàm tô màu vàng.
- Nếu là Text tô màu hường.
Mã:
Sub DanhDau()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next
    Dim Vung As Range
    Set Vung = Selection
    'Só, ngày
    Vung.SpecialCells(xlCellTypeConstants).Interior.ColorIndex = 33
    'Hàm
    Vung.SpecialCells(xlCellTypeFormulas).Interior.ColorIndex = 27
    'Text
    Vung.SpecialCells(xlCellTypeConstants, 2).Interior.ColorIndex = 40
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

View attachment 200612
Vâng E cám ơn Thầy, Thầy có thể chỉnh giúp Em một chút xíu nữa là có vùng chọn (tức là chỉ chọn trong vùng chọn đó)
Vùng dữ liệu của e nhìu, E chỉ muốn kiểm tra tròng vùng đó!hi
 
Upvote 0
Vâng E cám ơn Thầy, Thầy có thể chỉnh giúp Em một chút xíu nữa là có vùng chọn (tức là chỉ chọn trong vùng chọn đó)
Vùng dữ liệu của e nhìu, E chỉ muốn kiểm tra tròng vùng đó!hi
Mở Excel, nhấn Alt+F11 (vào VBE) rồi thay dòng này:
Set Vung = Selection

Thành dòng này:
Set Vung = Sheet1.Range("D4:I17")
 
Upvote 0
Mở Excel, nhấn Alt+F11 (vào VBE) rồi thay dòng này:
Set Vung = Selection

Thành dòng này:
Set Vung = Sheet1.Range("D4:I17")
Vâng Có thể như thế này và chọn vùng được không Thầy, thì mỗi lần chọn k phải sửa trong Code,
hi.jpg
Thầy cho E hỏi Thêm đoạn code trên có tác dụng đối với dòng bị ẩn không thưa Thầy?
 
Upvote 0
Muốn áp dụng cho vùng khác thì thay chỗ D4:I17, nếu khác sheet thì thay chỗ Sheet1.
Dạ vâng, E thấy code Chị PacificPR viết giúp E ở bài #4 có vùng chọn hi, E vừa thêm phần đoạn vùng chọn đó vào code của Thầy nhưng k được
E cám ơn Thầy nhiều, chúc Thầy buổi tối vui vẻ!
Bài đã được tự động gộp:

Ủa, sao mình nhanh quá vậy? Mình nhờ 'chị' ở trên ấy.
hi
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ vâng, E thấy code Chị PacificPR viết giúp E ở bài #4 có vùng chọn hi, E vừa thêm phần đoạn vùng chọn đó vào code của Thầy nhưng k được
E cám ơn Thầy nhiều, chúc Thầy buổi tối vui vẻ!
Thì code bài 30 là chọn vùng bất kỳ tôi có nêu rõ rồi mà (chọn vùng cần rồi nhấn nút).
 
Upvote 0
Thì code bài 30 là chọn vùng bất kỳ tôi có nêu rõ rồi mà (chọn vùng cần rồi nhấn nút).
À Vâng E hiểu, ý Em là có thể chọn kiểu như chọn vùng như vậy 55455.jpgđể có thể chọn được vùng linh hoạt hơn mà không phải chỉnh sửa trực tiếp code mỗi khi muốn chọn vùng kiểm tra thưa Thầy!
 
Upvote 0
À quên Theo 17025:2017 thì tài liệu lưu trữ là 5 năm. Nếu @Bùi Thúy Thúy có lấy Code bài 25 vào file nhớ sửa lại chỗ fYear = Year(Now()) - 4 thành fYear = Year(Now()) - 5 nha (Vì trong 5 năm mình vẫn sửa được HSQLCL í mà)
 
Upvote 0
Vâng E cám ơn Thầy, Thầy có thể chỉnh giúp Em một chút xíu nữa là có vùng chọn (tức là chỉ chọn trong vùng chọn đó)
Vùng dữ liệu của e nhìu, E chỉ muốn kiểm tra tròng vùng đó!hi
Đây là code ngắn gọn (3 trong 1), nó xác định 3 kiểu định dạng (chọn vùng cần rồi nhấn nút).
- Nếu là số và ngày tháng tô màu xanh.
- Nếu là hàm tô màu vàng.
- Nếu là Text tô màu hường.
Mã:
Sub DanhDau()
Dim Vung As Range
Set Vung = Selection
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next
    'Só, ngày
    Vung.SpecialCells(xlCellTypeConstants).Interior.ColorIndex = 33
    'Hàm
    Vung.SpecialCells(xlCellTypeFormulas).Interior.ColorIndex = 27
    'Text
    Vung.SpecialCells(xlCellTypeConstants, 2).Interior.ColorIndex = 40
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

View attachment 200612
E vừa test lại đoạn code của Thầy, Thầy có thể giúp E chút nữa là: Tô ngày tháng mà bị lỗi, và giá trị các ô bị lỗi còn các cái khác đều không tô màu Chup.jpg
Bài đã được tự động gộp:

Tiện nhất là Bạn dự file demo gần gần với file thực cho dễ. Mà hình như cái này là kiểm tra ngày trong HSQLCL thì phải
PHP:
Sub BoiMau()
    Dim sRng As Range, Rng As Range, Cll As Range
    Dim N As Long, Str As String, Str1 As String
Str = "Em da chon duoc ": Str1 = " o. Lam gi nua thi tuy y nha Chi nha"
On Error GoTo Thoat
Set sRng = Application.InputBox(Prompt:="Chon vung du lieu ", Title:="Du lieu dau vao", Type:=8)
sRng.Interior.Pattern = xlNone
For Each Cll In sRng
    If IsError(Cll) Then GoTo Tiep
    If Cll <> Empty And Not IsDate(Cll) Then GoTo Tiep
    If Cll <> Empty Then
        If Year(Cll) = 1900 Then
Tiep:
            N = N + 1
            If Rng Is Nothing Then
                Set Rng = Cll
            Else
                Set Rng = Union(Rng, Cll)
            End If
        End If
    End If
Next
Rng.Select
MsgBox Str & ": " & N & Str1
Thoat:
End Sub
Code của chị khá là ổn đúng ý E, giờ mà tô màu được các ô bị lỗi nữa thì tuyệt, chị có thể sửa lại giúp E đoạn code này để tô màu ô bị lỗi được K ạ!
E cám ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Bài đã được tự động gộp:


Code của chị khá là ổn đúng ý E, giờ mà tô màu được các ô bị lỗi nữa thì tuyệt, chị có thể sửa lại giúp E đoạn code này để tô màu ô bị lỗi được K ạ!
E cám ơn
Sao em hoang mang quá vậy. Đọc kỹ lại thì bài 25 không phải là yêu cầu của chủ Topic
 
Upvote 0
Web KT

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

Back
Top Bottom