Nhờ giúp bài toán tự động đánh dấu (bôi đỏ) những giá trị cột B không trùng GT cột A (1 người xem)

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

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

trungvdb

Thành viên thường trực
Tham gia
22/8/08
Bài viết
374
Được thích
171
Nghề nghiệp
Tài chính
Vấn đề đặt ra của bài là những giá trị cột B không có trong Cột A thì sẽ tự động được đánh dấu (bôi đỏ).
Bài toán này có thể làm theo cách thông thường trong Excel được không hả các bác? Nếu làm được, xin được nhờ các bác làm giúp cho bằng cả 2 cách:
- Làm bằng VBA
- Làm bằng định dạng có điều kiện (Excel).

Hình ảnh bài toán như sau
05-02-201211-25-04AM.png
 

File đính kèm

Vấn đề đặt ra của bài là những giá trị cột B không có trong Cột A thì sẽ tự động được đánh dấu (bôi đỏ).
Bài toán này có thể làm theo cách thông thường trong Excel được không hả các bác? Nếu làm được, xin được nhờ các bác làm giúp cho bằng cả 2 cách:
- Làm bằng VBA
- Làm bằng định dạng có điều kiện (Excel).

Hình ảnh bài toán như sau
Dùng Conditional Formating với điều kiện =COUNTIF($A$1:$A$8,$B1)=0 là được rồi

Capture.JPG
 
Upvote 0
Cảm ơn bác huongnghean về file của bác
Nguyên văn Code của bác là

PHP:
Sub kiemtra()
Dim endRA As Long
Dim endRB As Long
Dim X As Boolean
endRA = Sheets("sheet1").Cells(65000, 1).End(xlUp).Row
endRB = Sheets("sheet1").Cells(65000, 2).End(xlUp).Row
For i = 1 To endRB Step 1
 X = False
  For j = 1 To endRA Step 1
   If Range("B" & i).Value = Range("A" & j).Value Then X = True
  Next
  If X = False Then Range("B" & i).Font.ColorIndex = 3
Next

End Sub

Tôi xin hỏi liệu có thể rút gọn được Code trên không? Vì tôi có cảm giác hình như thuật toán liên quan đến X có vẻ hơi dài (tuy vậy tôi thực hành sửa nhưng chưa được)
 
Upvote 0
Hjc, tớ không phải là bác. Cái bài toán của bạn nó đơn giản quá, với code trên, chạy vèo một cái là xong.
.
Thử tưởng tượng dữ liệu 2 cột 1000 dòng, 2 vòng lập chạy xong sẽ mất 1000*1000 = 1000000 lần lập
Hic... 10000 dữ liệu chắc.. đói luôn
-----------
Bài toán xác định sự tồn tại của các phần tử trong 2 nhóm không phải đơn giản như bạn nghĩ đâu ---> Tóm lại cũng phải dùng Dictionary + Array thì mới nhanh được
 
Upvote 0
Tôi chưa thành thạo trong vụ Dictionary + Array lắm, rất cần sự trợ giúp của mọi người làm mẫu giúp bài toán này bằng Dictionary + Array để tôi có thể hiểu thêm về nó.
 
Upvote 0
Vấn đề đặt ra của bài là những giá trị cột B không có trong Cột A thì sẽ tự động được đánh dấu (bôi đỏ).
Bài toán này có thể làm theo cách thông thường trong Excel được không hả các bác? Nếu làm được, xin được nhờ các bác làm giúp cho bằng cả 2 cách:
- Làm bằng VBA
- Làm bằng định dạng có điều kiện (Excel).

Hình ảnh bài toán như sau
05-02-201211-25-04AM.png
Tôi làm thử bt trên = Dic và có chú thích code, có gì chưa thông bạn cứ hỏi.
Trong file tôi để dư 1 ArrKq và biến s nếu triển khai thêm nhiều thì mới dùng.
Nôm na code trên như sau
1/ Đưa hết cột A vào Dic. (giống như 1 tập hợp X gồm những phần tử có giá trị duy nhất - Key)
2/ Xét từng cell của cột B
3/ Nếu đã có trong Dic thì tô màu.
PHP:
Sub KiemTra()
Dim endR&, i&, s&
Dim Arr01, Arr02 ', ArrKq(1 To 1000)
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
Sheet1.Select
Columns("B:B").Font.ColorIndex = 0
'Xac dinh cac Array
endR = Cells(65000, 1).End(xlUp).Row
Arr01 = Range("A1:A" & endR).Value
endR = Cells(65000, 1).End(xlUp).Row
Arr02 = Range("B1:B" & endR).Value
'Dua Arr01 - nguon - vao Dic
For i = 1 To UBound(Arr01)
  If Arr01(i, 1) <> "" Then 'i neu cells <>""
    If Not Dic.Exists(Arr01(i, 1)) Then ' neu chua co trong Dic
      Dic.Add Arr01(i, 1), Nothing
    End If
  End If
Next i
'Kiem tra cot B (arr02) co trong Dic (Arr01)
For i = 1 To UBound(Arr02)
  If Arr02(i, 1) <> "" Then 'i neu cells <>""
    If Not Dic.Exists(Arr02(i, 1)) Then ' neu chua co trong Dic
      Cells(i, 2).Font.ColorIndex = 3
'      s = s + 1
'      ArrKq(s) = i
    End If
  End If
Next i
End Sub
 
Upvote 0
Em thấy nhanh mà bác. đúng là theo bác tính là như vậy nhưng chạy nhoằng cái là xong.
Vậy bác thử dùng dict với cái này xem sao
http://www.mediafire.com/?rm7lhci66rudik4

Nhiệm vụ chương trình là tìm ra các phần tử có tính chất giống nhau và bôi màu đỏ vào phần tử ấy.
Hai phần tử giống nhau nếu nó có số hiệu giống nhau và môn học giống nhau.

Vd phần tử A1 của lớp 1 gồm có toán và văn
Phần tử A1 của lớp 2 gồm có văn và toán

tên phần tử giống nhau, môn học giống nhau, nên sẽ được tô đỏ ở dòng 2 và dòng 6

Tương tự phần tử A2 của lớp 1 và phần tử của A2 của lớp 4 cũng được tô đỏ.
 
Upvote 0
Em thấy nhanh mà bác. đúng là theo bác tính là như vậy nhưng chạy nhoằng cái là xong.
Vậy bác thử dùng dict với cái này xem sao
http://www.mediafire.com/?rm7lhci66rudik4

Nhiệm vụ chương trình là tìm ra các phần tử có tính chất giống nhau và bôi màu đỏ vào phần tử ấy.
Hai phần tử giống nhau nếu nó có số hiệu giống nhau và môn học giống nhau.

Vd phần tử A1 của lớp 1 gồm có toán và văn
Phần tử A1 của lớp 2 gồm có văn và toán

tên phần tử giống nhau, môn học giống nhau, nên sẽ được tô đỏ ở dòng 2 và dòng 6

Tương tự phần tử A2 của lớp 1 và phần tử của A2 của lớp 4 cũng được tô đỏ.
Bài của bạn cũng chẳng khó khăn gì... nhưng nếu yêu cầu TRÍCH LỌC RA NHỮNG PHẦN TỬ GIỐNG NHAU CHỈ LẤY MỘT thì không có vấn đề, còn TÔ MÀU là công việc xử lý trực tiếp trên bảng tính, dù làm cách gì cũng chậm mà thôi
------------
Tóm lại: Mọi bài toán liên quan đến xử lý dữ liệu đều có thể làm trên mảng, còn việc format cell thì có làm bằng mảng cũng bằng thừa
 
Lần chỉnh sửa cuối:
Upvote 0
Bac trích lọc giúp em, có hai phần tử A1 giống nhau như thế thì xóa một cái đi cũng được.
Nếu có ba cái giống nhau thì xóa luôn hai cái đi cũng được.

Điều kiện giống nhau:
Tên phần tử giống nhau, môn học giống nhau.

Ví du:

A1 Toan Van
A1 Van Toan

sẽ được coi là giống nhau


và đương nhiên

A2 Ly Su
A2 Ly Su

thì được coi là giống nhau.
 
Upvote 0
Bac trích lọc giúp em, có hai phần tử A1 giống nhau như thế thì xóa một cái đi cũng được.
Nếu có ba cái giống nhau thì xóa luôn hai cái đi cũng được.

Điều kiện giống nhau:
Tên phần tử giống nhau, môn học giống nhau.

Ví du:

A1 Toan Van
A1 Van Toan

sẽ được coi là giống nhau


và đương nhiên

A2 Ly Su
A2 Ly Su

thì được coi là giống nhau.
Trong file của bạn còn cột LOP nữa... Ví dụ:
A1 Toan Van Lop 1
A1 Van Toan Lop 2

Cái này tính sao đây? Xem là "giống" hay "khác"? Nếu xem là "giống" thì khi trích ra nơi khác ta lấy "Lớp 1" hay "Lớp 2"?
 
Upvote 0
Trong file của bạn còn cột LOP nữa... Ví dụ:
A1 Toan Van Lop 1
A1 Van Toan Lop 2

Cái này tính sao đây? Xem là "giống" hay "khác"? Nếu xem là "giống" thì khi trích ra nơi khác ta lấy "Lớp 1" hay "Lớp 2"?
Thì Thầy .....lấy cả 2 hoặc 3,4 thằng nếu trùng Tên & Môn bỏ vào một cục Lớp cho ....gọn
Chắc bạn í muốn như thế này quá
Mã:
Public Sub ToTiTe()
    Dim d, Vung, I, Gom, Mg(), K, kK
    Set d = CreateObject("scripting.dictionary")
    Vung = Range([A2], [A50000].End(xlUp)).Resize(, 4).Value
    ReDim Mg(1 To UBound(Vung), 1 To 4)
        For I = 1 To UBound(Vung)
            If Vung(I, 1) <> vbNullString Then
                If Not d.exists(Vung(I, 1) & Vung(I, 2) & Vung(I, 3)) And Not d.exists(Vung(I, 1) & Vung(I, 3) & Vung(I, 2)) Then
                    K = K + 1
                    d.Add Vung(I, 1) & Vung(I, 2) & Vung(I, 3), K
                    d.Add Vung(I, 1) & Vung(I, 3) & Vung(I, 2), K
                    Mg(K, 1) = Vung(I, 1): Mg(K, 2) = Vung(I, 2): Mg(K, 3) = Vung(I, 3): Mg(K, 4) = Vung(I, 4)
                Else
                    kK = IIf(d.Item(Vung(I, 1) & Vung(I, 2) & Vung(I, 3)) > 0, d.Item(Vung(I, 1) & Vung(I, 2) & Vung(I, 3)), d.Item(Vung(I, 1) & Vung(I, 3) & Vung(I, 2)))
                    Mg(kK, 4) = Mg(kK, 4) & "; " & Vung(I, 4)
                End If
            End If
        Next I
    [F2:I10000].ClearContents
    [F2].Resize(UBound(Mg), 4) = Mg
End Sub
 

File đính kèm

Upvote 0
Thì Thầy .....lấy cả 2 hoặc 3,4 thằng nếu trùng Tên & Môn bỏ vào một cục Lớp cho ....gọn
Chắc bạn í muốn như thế này quá
Mã:
Public Sub ToTiTe()
    Dim d, Vung, I, Gom, Mg(), K, kK
    Set d = CreateObject("scripting.dictionary")
    Vung = Range([A2], [A50000].End(xlUp)).Resize(, 4).Value
    ReDim Mg(1 To UBound(Vung), 1 To 4)
        For I = 1 To UBound(Vung)
            If Vung(I, 1) <> vbNullString Then
                If Not d.exists(Vung(I, 1) & Vung(I, 2) & Vung(I, 3)) And Not d.exists(Vung(I, 1) & Vung(I, 3) & Vung(I, 2)) Then
                    K = K + 1
                    d.Add Vung(I, 1) & Vung(I, 2) & Vung(I, 3), K
                    d.Add Vung(I, 1) & Vung(I, 3) & Vung(I, 2), K
                    Mg(K, 1) = Vung(I, 1): Mg(K, 2) = Vung(I, 2): Mg(K, 3) = Vung(I, 3): Mg(K, 4) = Vung(I, 4)
                Else
                    kK = IIf(d.Item(Vung(I, 1) & Vung(I, 2) & Vung(I, 3)) > 0, d.Item(Vung(I, 1) & Vung(I, 2) & Vung(I, 3)), d.Item(Vung(I, 1) & Vung(I, 3) & Vung(I, 2)))
                    Mg(kK, 4) = Mg(kK, 4) & "; " & Vung(I, 4)
                End If
            End If
        Next I
    [F2:I10000].ClearContents
    [F2].Resize(UBound(Mg), 4) = Mg
End Sub
Cũng may dữ liệu chỉ cần đảo cột B và C (đảo 2 phần tử) nên chẳng có gì đáng nói
Nếu phải "đảo" 10 cột trở lên thì... Ẹc... Ẹc... hổng biết anh sẽ "đảo" cách nào đây?
Nói chung em đã có phương án để làm bài này trong trường hợp tổng quát nhất, có điều phải hỏi cho chắc ---> Mất công làm mà chẳng được gì
 
Upvote 0
re

hì hì
Lớp không cần quan tâm đâu anh NDU ơi.
Cứ thấy trùng nhau theo dữ kiện trên thì xoá đi một thằng :P
Bác concogia làm đúng rồi, giỏi ghê. Để em bê vào data khủng xem thế nào hihi
 
Upvote 0
Con&ditional Formatting đánh dấu tất cả các giá trị xuất hiện trên tất cả các Sheet?

Nếu giá trị trong cột A của Sheet nào tồn tại trong cột A của tất cả các Sheet khác, thì toàn bộ dòng chứa giá trị của cột ấy tại tất cả các Sheet được bôi màu vàng.

(Em xin gửi file dữ liệu lên gồm 3 Sheet, dữ liệu thực tế của em có khoảng 20 Sheet).
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom