HỎI HIỆN Msgbox: ĐẾM SỐ LẦN "KÝ HIỆN" KHI XUẤT HIỆN DẤU "!!" (1 người xem)

  • Thread starter Thread starter nad582
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

nad582

Thành viên thường trực
Tham gia
7/6/11
Bài viết
317
Được thích
48
Chào các a trong GPE, e có một bảng dữ liệu. Vấn đề là như vầy:
Xét cột "Ky Hieu" có tên là C1, C10, C11....(còn nhiều tên nữa), ứng với cột "Q" nếu có dấu "!!" xuất hiện thì Msgbox hiện lên thông báo: "có 3 ký hiệu không thỏa"
(Nếu cột "Ky Hieu" có tên là C1, ứng với cột "Q" nếu không dấu "!!" xuất hiện thì Msgbox hiện lên thông báo: "có 2 ký hiệu không thỏa")....
Xin chân thành cảm ơn...
 
Thử code này thử xem có đúng ý bạn không:
[gpecode=vb]
Sub Ktra()
Dim iR As Integer, Clls As Range, Rng As Range
Set Rng = Sheets("tinhtoan").Range("Q15:Q" & Range("Q65535").End(xlUp).Row)
For Each Clls In Rng
If Clls = "!!" Then
iR = iR + 1
End If
Next Clls
MsgBox "Co " & iR & " ky hieu khong thoa"
End Sub
[/gpecode]
 
Upvote 0
Chào các a trong GPE, e có một bảng dữ liệu. Vấn đề là như vầy:
Xét cột "Ky Hieu" có tên là C1, C10, C11....(còn nhiều tên nữa), ứng với cột "Q" nếu có dấu "!!" xuất hiện thì Msgbox hiện lên thông báo: "có 3 ký hiệu không thỏa"
(Nếu cột "Ky Hieu" có tên là C1, ứng với cột "Q" nếu không dấu "!!" xuất hiện thì Msgbox hiện lên thông báo: "có 2 ký hiệu không thỏa")....
Xin chân thành cảm ơn...

Theo mình hiểu thì yêu cầu của bạn chẳng cần code mà dùng chức năng Remove Duplicates lọc duy nhất và SUMPRODUCT để đếm 2 điều kiện (Hoặc Countifs nếu là excel 2007 trở lên).

Bạn xem file đính kèm nhé.
 

File đính kèm

Upvote 0
Thử code này thử xem có đúng ý bạn không:
[gpecode=vb]
Sub Ktra()
Dim iR As Integer, Clls As Range, Rng As Range
Set Rng = Sheets("tinhtoan").Range("Q15:Q" & Range("Q65535").End(xlUp).Row)
For Each Clls In Rng
If Clls = "!!" Then
iR = iR + 1
End If
Next Clls
MsgBox "Co " & iR & " ky hieu khong thoa"
End Sub
[/gpecode]
Cảm ơn anh, nó gần đúng một chút; Msgbox hiện lên là: " có 3 ký hiệu không thỏa"
(Ký hiệu ở đây không phải là số dấu "!!" xuất hiện mà là số tên cột "KY HIEU" (C1, C10,C11):ở đây là 3; ứng với nếu cột "Q" xuất hiện dấu "!!").
VD:
Cột "Ky Hieu" có tên là C1, ứng với cột "Q" nếu dấu "!!" xuất hiện thì Msgbox hiện lên thông báo: "có 1 ký hiệu không thỏa")
Vậy cột "Ky Hieu" có tên là C1 và C10, ứng với cột "Q" đều xuất hiện dấu "!!" ở 2 cột C1 và C10 thì Msgbox hiện lên thông báo: "có 2 ký hiệu không thỏa")
tương tự như vậy...
Anh hiệu chình lại dùm e...
 
Upvote 0
Hình minh họa:
Nếu cột Q đều xuất hiện dấu "!!" ứng với các tên ký hiệu (C1, C10, C11...) ở cột "KY HIEU"


View attachment 113315

Em bổ sung thêm là nếu như cột Q không xuất hiện thì Msgbox không hiện lên...
 
Upvote 0
Hình minh họa:
Nếu cột Q đều xuất hiện dấu "!!" ứng với các tên ký hiệu (C1, C10, C11...) ở cột "KY HIEU"


View attachment 113315

Em bổ sung thêm là nếu như cột Q không xuất hiện thì Msgbox không hiện lên...

Code cũng đơn giản thế này:

Mã:
Private Sub CommandButton2_Click()
    Dim FindRange As Range, MyRange As Range
    Set MyRange = Range(Range("Q14"), Range("Q65536").End(xlUp))
    Set FindRange = MyRange.Find(What:="!!", LookIn:=xlValues, LookAt:=xlWhole)
    If FindRange Is Nothing Then
[COLOR=#0000ff]        MsgBox "Tat ca cac ky hieu deu thoa cot Q."[/COLOR]
    Else
        Dim ArrKiHieu(), FirstRange As String, n As Long
        FirstRange = FindRange.Address
        Do
            n = n + 1
            ReDim Preserve ArrKiHieu(1 To n)
            ArrKiHieu(n) = FindRange.Offset(, -16)
            Set FindRange = MyRange.FindNext(FindRange)
        Loop Until FindRange.Address = FirstRange
[COLOR=#0000ff]        MsgBox "Co " & n & " ky hieu khong thoa, do la:" & vbLf & _[/COLOR]
[COLOR=#0000ff]        Join(ArrKiHieu, ", ")[/COLOR]
    End If
End Sub
 
Upvote 0
Code cũng đơn giản thế này:

Mã:
Private Sub CommandButton2_Click()
    Dim FindRange As Range, MyRange As Range
    Set MyRange = Range(Range("Q14"), Range("Q65536").End(xlUp))
    Set FindRange = MyRange.Find(What:="!!", LookIn:=xlValues, LookAt:=xlWhole)
    If FindRange Is Nothing Then
[COLOR=#0000ff]        MsgBox "Tat ca cac ky hieu deu thoa cot Q."[/COLOR]
    Else
        Dim ArrKiHieu(), FirstRange As String, n As Long
        FirstRange = FindRange.Address
        Do
            n = n + 1
            ReDim Preserve ArrKiHieu(1 To n)
            ArrKiHieu(n) = FindRange.Offset(, -16)
            Set FindRange = MyRange.FindNext(FindRange)
        Loop Until FindRange.Address = FirstRange
[COLOR=#0000ff]        MsgBox "Co " & n & " ky hieu khong thoa, do la:" & vbLf & _[/COLOR]
[COLOR=#0000ff]        Join(ArrKiHieu, ", ")[/COLOR]
    End If
End Sub
Hình như chưa đúng anh ơi, Lọc các ký hiệu trùng nhau nữa, có 3 ký hiệu thôi.
 
Upvote 0
Hình như chưa đúng anh ơi, Lọc các ký hiệu trùng nhau nữa, có 3 ký hiệu thôi.
Đọc từ đầu đến đuôi, có thấy tác giả nói là lọc trùng với không lọc trùng gì đâu? Mà với bài toán này nếu lọc không trùng thì không hợp lý, bởi mỗi mục mỗi khác nhau (đều tính toán bằng công thức) và người ta muốn có bao nhiêu mục chưa thỏa, nếu dùng lọc trùng thì giả sử 10 mục không thỏa trùng nhau, nó chỉ thông báo 1 mục không thỏa thì hình như chưa phải cái mà tác giả muốn như thế, nó chủ quan quá!
 
Lần chỉnh sửa cuối:
Upvote 0
Code cũng đơn giản thế này:
CHÂN THÀNH CẢM ƠN ANH, CHẮC CÓ LẼ EM DIỄN ĐẠT HƠI KHÓ HIỂU NÊN CÁC ANH HIỂU LẦM Ý E MỘT CHÚT...
KẾT QUẢ CỦA ANH GIỐNG NHƯ BÀI #2 LÀ Msgbox hiện lên là: " có 15 ký hiệu không thỏa"
NHƯNG KẾT QUẢ CỦA E Msgbox hiện lên là: " có 3 ký hiệu không thỏa"
(3 KÝ HIỆU LÀ VÌ DẤU "!!" ĐỀU XUẤT HIỆN Ở 3 TÊN CỘT LÀ C1, C10, C11)
CÂU HỎI E KHÔNG PHẢI LÀ ĐẾM SỐ LẦN DẤU "!!" NÀY XUẤT HIỆN MÀ ĐẾM SỐ LẦN TÊN KÝ HIỆU..NẾU DẤU "!!" XUẤT HIỆN ỨNG VỚI TÊN KÝ HIỆU ĐÓ.
ĐÂY LÀ ẢNH KẾT QUẢ: View attachment 113323 (3 KÝ HIỆU LÀ C1, C10, C11)

ĐÂY LÀ ẢNH BỔ SUNG Ý: View attachment 113325

MONG CÁC ANH GIÚP DÙM E...

(NẾU NHƯ KO RÕ ĐƯỢC Ý CỦA E THÌ....anh giúp e code đơn giản hơn: nếu như cột Q xuất hiện dấu "!!" thì Msgbox là:"có ký hiệu không thỏa"; nếu cột Q không xuất hiện dấu "!!" thì Msgbox không hiện lên)..

Chân thành cảm ơn.
 
Upvote 0
CHÂN THÀNH CẢM ƠN ANH, CHẮC CÓ LẼ EM DIỄN ĐẠT HƠI KHÓ HIỂU NÊN CÁC ANH HIỂU LẦM Ý E MỘT CHÚT...
KẾT QUẢ CỦA ANH GIỐNG NHƯ BÀI #2 LÀ Msgbox hiện lên là: " có 15 ký hiệu không thỏa"
NHƯNG KẾT QUẢ CỦA E Msgbox hiện lên là: " có 3 ký hiệu không thỏa"
(3 KÝ HIỆU LÀ VÌ DẤU "!!" ĐỀU XUẤT HIỆN Ở 3 TÊN CỘT LÀ C1, C10, C11)
CÂU HỎI E KHÔNG PHẢI LÀ ĐẾM SỐ LẦN DẤU "!!" NÀY XUẤT HIỆN MÀ ĐẾM SỐ LẦN TÊN KÝ HIỆU..NẾU DẤU "!!" XUẤT HIỆN ỨNG VỚI TÊN KÝ HIỆU ĐÓ.
ĐÂY LÀ ẢNH KẾT QUẢ: View attachment 113323 (3 KÝ HIỆU LÀ C1, C10, C11)

ĐÂY LÀ ẢNH BỔ SUNG Ý: View attachment 113325

MONG CÁC ANH GIÚP DÙM E...

(NẾU NHƯ KO RÕ ĐƯỢC Ý CỦA E THÌ....anh giúp e code đơn giản hơn: nếu như cột Q xuất hiện dấu "!!" thì Msgbox là:"có ký hiệu không thỏa"; nếu cột Q không xuất hiện dấu "!!" thì Msgbox không hiện lên)..

Chân thành cảm ơn.

Khi nói đến lọc không trùng, ta nghĩ ngay đến "bạn" Scripting.Dictionary!

Và chúng ta sửa lại như sau:

Mã:
Private Sub CommandButton2_Click()
    Dim FindRange As Range, MyRange As Range
    Set MyRange = Range(Range("Q14"), Range("Q65536").End(xlUp))
    Set FindRange = MyRange.Find(What:="!!", LookIn:=xlValues, LookAt:=xlWhole)
    If FindRange Is Nothing Then
        MsgBox "Tat ca cac ky hieu deu thoa cot Q."
    Else
        Dim FirstRange As String, KiHieu As String, Dict As Object
        Set Dict = CreateObject("Scripting.Dictionary")
        FirstRange = FindRange.Address
        Do
            KiHieu = Trim(FindRange.Offset(, -16))
            If Not Dict.Exists(KiHieu) Then Dict.Add KiHieu, ""
            Set FindRange = MyRange.FindNext(FindRange)
        Loop Until FindRange.Address = FirstRange
        MsgBox "Co " & Dict.Count & " ky hieu khong thoa, do la: " & Join(Dict.Keys, ", ")
        Set Dict = Nothing
    End If
    Set MyRange = Nothing
    Set FindRange = Nothing
End Sub
 
Upvote 0
Khi nói đến lọc không trùng, ta nghĩ ngay đến "bạn" Scripting.Dictionary!
Rất đúng với ý của e, cảm ơn anh rất nhiêu...
nếu trường hợp vầy thì làm thế nào anh, a chỉ em luôn:
Nếu như cột Q xuất hiện dấu "!!" thì Msgbox là:"có ký hiệu không thỏa"; nếu cột Q không xuất hiện dấu "!!" thì Msgbox không hiện lên./.
 
Upvote 0
Rất đúng với ý của e, cảm ơn anh rất nhiêu...
nếu trường hợp vầy thì làm thế nào anh, a chỉ em luôn:
Nếu như cột Q xuất hiện dấu "!!" thì Msgbox là:"có ký hiệu không thỏa"; nếu cột Q không xuất hiện dấu "!!" thì Msgbox không hiện lên./.

Trời ơi, tôi đã có cảnh báo:

Nếu đã thỏa hết thì:

MsgBox "Tat ca cac ky hieu deu thoa cot Q."

Còn không thỏa thì:

MsgBox "Co " & Dict.Count & " ky hieu khong thoa, do la: " & Join(Dict.Keys, ", ")

Nếu không muốn hiện lên thì làm như thế này thôi:

Mã:
Private Sub CommandButton2_Click()
    Dim FindRange As Range, MyRange As Range
    Set MyRange = Range(Range("Q14"), Range("Q65536").End(xlUp))
    Set FindRange = MyRange.Find(What:="!!", LookIn:=xlValues, LookAt:=xlWhole)
[B]    If [COLOR=#ff0000]Not [/COLOR]FindRange Is Nothing Then[/B]
        Dim FirstRange As String, KiHieu As String, Dict As Object
        Set Dict = CreateObject("Scripting.Dictionary")
        FirstRange = FindRange.Address
        Do
            KiHieu = Trim(FindRange.Offset(, -16))
            If Not Dict.Exists(KiHieu) Then Dict.Add KiHieu, ""
            Set FindRange = MyRange.FindNext(FindRange)
        Loop Until FindRange.Address = FirstRange
        MsgBox "Co " & Dict.Count & " ky hieu khong thoa, do la: " & Join(Dict.Keys, ", ")
        Set Dict = Nothing
    End If
    Set MyRange = Nothing
    Set FindRange = Nothing
End Sub
 
Upvote 0

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

Back
Top Bottom