Nhờ hỗ trợ code tô màu những ô không phải số nguyên dương hay số lớn hơn 20

Liên hệ QC

LanAnh19

Thành viên chính thức
Tham gia
1/5/22
Bài viết
76
Được thích
8
Giới tính
Nữ
Các bạn giúp code tô những ô không phải là số nguyên dương
hoặc số lớn hơn 20
Sau khi mình nhập liệu xong thì cho chạy code, nếu từ G9 trở xuống mà ô nào không thỏa điều kiện trên thì tô đỏ. Xin cảm ơn nhiều.
 

File đính kèm

  • Nguyenduong.xlsx
    7.9 KB · Đọc: 18
PHP:
Sub ToMauDuLieuTheoDieuKien()
 Dim Rng As Range, Cls As Range:    Dim Num As Double
 
 Set Rng = Range([G9], [G65500].End(xlUp))
 Rng.Interior.ColorIndex = 2
 For Each Cls In Rng
    If IsNumeric(Cls.Value) Then
        Num = Cls.Value
        If Num > 20 Or Num < 0 Then
            Cls.Interior.ColorIndex = 35
        ElseIf Num / 1 <> Num \ 1 Then
            Cls.Interior.ColorIndex = 36
        End If
    Else
        Cls.Interior.ColorIndex = 38
    End If
 Next Cls
End Sub
 
Upvote 0
Các bạn giúp code tô những ô không phải là số nguyên dương
hoặc số lớn hơn 20
Sau khi mình nhập liệu xong thì cho chạy code, nếu từ G9 trở xuống mà ô nào không thỏa điều kiện trên thì tô đỏ. Xin cảm ơn nhiều.
Góp vui 1 cách củ chuối
Mã:
Option Explicit

Sub ToMauSoNguyen()
Dim I As Long, j As Long, Rng As Range
With Sheets("DATA")
For I = 9 To .Cells(10000, 7).End(xlUp).Row
    If IsNumeric(.Cells(I, 7)) = False Then
        .Cells(I, 7).Interior.ColorIndex = 6
    Else
        If .Cells(I, 7) < 0 Or Int(.Cells(I, 7)) <> .Cells(I, 7) Or .Cells(I, 7) > 20 Then
            .Cells(I, 7).Interior.ColorIndex = 6
        End If
    End If
Next I
End With
End Sub
Gửi đăng mới thấy bài của anh @SA_DQ. chót đăng rồi không xóa nữa.
 
Lần chỉnh sửa cuối:
Upvote 0
@SA_DQ

"ElseIf Num / 1 <> Num \ 1 Then"

Anh ơi, anh cho em hỏi: Dấu "/" thì để chia, còn dấu "\" trường hợp này có chức năng gì ạ. (Em cũng tìm hiểu nhưng chưa rõ ạ)
 
Lần chỉnh sửa cuối:
Upvote 0
"ElseIf Num / 1 <> Num \ 1 Then"

Anh ơi, anh cho em hỏi: Dấu "/" thì để chia, còn dấu "\" trường hợp này có chức năng gì ạ. (Em cũng tìm hiểu nhưng chưa rõ ạ)
Bạn vô cửa sồ Immediate sẽ tìm hiểu cũng được; Nó là toán tử chia lấy phần nguyên
 
Lần chỉnh sửa cuối:
Upvote 0
Code không an toàn.
Nếu Num lớn hơn 2 tỷ mọt chút (giới hạn của Long) thì sẽ bị lỗi tràn số.
Nếu tham biến Num >20 hay < 0 thì có câu lệnh trên nó lo rồi mà; Mình tưởng như vậy đã đạt rồi
Mong bạn phân tích thêm, xin cảm ơn!

Vậy lả giống như hàm Quotient anh nhỉ, em cảm ơn anh.
& giống hàm Int() trong VBA
 
Upvote 0
Nếu tham biến Num >20 hay < 0 thì có câu lệnh trên nó lo rồi mà; Mình tưởng như vậy đã đạt rồi
Mong bạn phân tích thêm, xin cảm ơn!
Tôi chỉ nói là không an toàn.
Nếu bạn sửa dòng IF Num > 20... thì bạn phải dò hết tất cả các ElseIf xem có khả năng gì hay không?

& giống hàm Int() trong VBA
Không giống.
Hàm Int nhận tham số là Double. Nếu nạp Long nó sẽ tự nâng cấp lên.
Trong khi đó, toán tử \ chỉ nhận vế Long. Đưa cho nó số lớn hơn giới hạn của Long sẽ bị lỗi tràn số.

1666545833734.png

Vậy lả giống như hàm Quotient anh nhỉ, em cảm ơn anh.
Không giống luôn.
Toán tử \ bản thân là phép chia số nguyên cho nên nó có làm tròn trước khi chia.
Hàm Quotient của bảng tính là phép lấy thương số giữa hai số thực cho nên nó không làm tròn trước khi chia.

1666546790122.png

Chú thích 1: Toán tử \ là toán tử chia số nguyên. Hai vế của nó (số chia và số bị chia) phải là số nguyên. Trước khi nhận biểu thức ở hai vế bên trái và bên phải, nó ép kiểu các biểu thức này về số nguyên. Tuy nhiên, cách ép kiểu của nó hơi rắc rối. Vì vậy, lúc dùng nó để chia số thực bạn phải cẩn thận.

1666547935614.png

Chú thích 2: Hàm chính thống để chặt bỏ phần thập phân của một số thực là hàm FIX. Hàm này tương đương với hàm TRUNC của bảng tính.

1666546884908.png
 
Lần chỉnh sửa cuối:
Upvote 0
Không giống.
Hàm Int nhận tham số là Double. Nếu nạp Long nó sẽ tự nâng cấp lên.
Trong khi đó, toán tử \ chỉ nhận vế Long. Đưa cho nó số lớn hơn giới hạn của Long sẽ bị lỗi tràn số.

View attachment 282411


Không giống luôn.
Toán tử \ bản thân là phép chia số nguyên cho nên nó có làm tròn trước khi chia.
Hàm Quotient của bảng tính là phép lấy thương số giữa hai số thực cho nên nó không làm tròn trước khi chia.

View attachment 282412

Chú thích 1: Toán tử \ là toán tử chia số nguyên. Hai vế của nó (số chia và số bị chia) phải là số nguyên. Trước khi nhận biểu thức ở hai vế bên trái và bên phải, nó ép kiểu các biểu thức này về số nguyên. Tuy nhiên, cách ép kiểu của nó hơi rắc rối. Vì vậy, lúc dùng nó để chia số thực bạn phải cẩn thận.

View attachment 282414

Chú thích 2: Hàm chính thống để chặt bỏ phần thập phân của một số thực là hàm FIX. Hàm này tương đương với hàm TRUNC của bảng tính.

View attachment 282413
Khi thử lúc trước em cũng thấy như vậy nhưng chưa hiểu vì sao, cảm ơn anh nhiều ạ.
 
Upvote 0
Các bạn cho hỏi thêm, mình muốn nó thông báo địa chỉ Ô nào bị lỗi luôn, thì cách thêm code như thế nào
Ví dụ: lỗi ở G10 ...
Mình có thêm Msgbox nhưng chưa biết cú pháp như thế nào
Cũng không khó gì. Ngay dưới dòng bôi màu, bạn thêm:
PHP:
MsgBox "Loi tai o : " & .Cells(I, 7).Address
nhưng mà hông lẽ cứ lỗi lại bấm ?
 
Upvote 0
Các bạn cho hỏi thêm, mình muốn nó thông báo địa chỉ Ô nào bị lỗi luôn, thì cách thêm code như thế nào
Ví dụ: lỗi ở G10 ...
Mình có thêm Msgbox nhưng chưa biết cú pháp như thế nào
Thì sửa lại thành
Mã:
If .Cells(I, 7) < 0 Or Int(.Cells(I, 7)) <> .Cells(I, 7) Or .Cells(I, 7) > 20 Then
            .Cells(I, 7).Interior.ColorIndex = 6
else 
loi= loi &  ", " & i
End If
End If
Next I
End With
if len( loi)>0 then 
msgbox " đa có lôi ơ các dòng "  &  loi
end  if
end sub 
·
thử lại xem tôi chưa test.
Chúc thành công.
 
Upvote 0
Mình gom chỉ thông báo sau khi chạy xong hết toàn bộ.

PHP:
Option Explicit
Sub ToMauSoNguyen()
    Dim I           As Long, j As Long, Rng As Range
    Dim str         As String
    With Sheets("DATA")
        For I = 9 To .Cells(10000, 7).End(xlUp).Row
            If IsNumeric(.Cells(I, 7)) = FALSE Then
                .Cells(I, 7).Interior.ColorIndex = 6
                If str = "" Then str = .Cells(I, 7).Address Else: str = str & ", " & .Cells(I, 7).Address
            Else
                If .Cells(I, 7) < 0 Or Int(.Cells(I, 7)) <> .Cells(I, 7) Or .Cells(I, 7) > 20 Then
                    .Cells(I, 7).Interior.ColorIndex = 6
                    If str = "" Then str = .Cells(I, 7).Address Else: str = str & ", " & .Cells(I, 7).Address
                End If
            End If
        Next I
    End With
    Application.Assistant.DoAlert "Thông báo !!!", "L" & ChrW(7895) & "i t" & ChrW(7841) & "i các ô sau: " & str , msoAlertButtonOK, msoAlertIconInfo, 0, 0, 0
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Mình chân đất mắt toét nên làm đơn giản thế này;
PHP:
Option Explicit
Sub tomau()
Dim cell As Range
For Each cell In Range("G9:G" & Cells(Rows.Count, "G").End(xlUp).Row)
    If Not IsNumeric(Evaluate("=Match(" & cell.Value & ", Row(1:20), 0)")) Then cell.Interior.Color = vbRed
Next
End Sub
Với Row(1:20) biểu thị dãy số nguyên từ 1-20
 
Upvote 0
Web KT

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

Back
Top Bottom