Hỏi cách so sánh 2 range bất kỳ trong VBA

Liên hệ QC

vanphu_ht91

Thành viên mới
Tham gia
6/4/17
Bài viết
20
Được thích
0
Xin chào mọi người.
Mình mới học thêm VBA do tính chất công việc. Nhờ mọi người chỉ bảo thêm
Bài toán của mình là làm thế nào để so sánh data ở 2 ô bất kỳ trong excel & Highlight các giá trị khác biệt đó
Code so sánh ở 2 cell cụ thể thì mình có làm được như thế này rồi.
Cảm ơn mọi người đã góp ý
Mã:
Sub Highlight_Different_Character()
Dim i As Integer
For i = 1 To Len(Range("B3"))
    If Mid(Range("B3"), i, 1) <> Mid(Range("C3"), i, 1) Then
        Range("B3").Select
        With ActiveCell.Characters(Start:=i, Length:=1).Font
        .Color = -16776961
        End With
         Range("C3").Select
        With ActiveCell.Characters(Start:=i, Length:=1).Font
        .Color = -16776961
        End With
    End If
Next i
End Sub
1663869333524.png
 

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia
8/6/06
Bài viết
13,271
Được thích
20,451
Nếu mình hiểu đúng ý đồ của bạn, thì bạn nên trãi qua các bước như sau:

B01: Sửa đứa con tinh thần của bạn thành vầy:
PHP:
Sub Highlight_Different_Character(Rng1 As Range, Rng2 As Range)
Dim I As Integer

For I = 1 To Len(Rng1.Value)
    If Mid(Rng1.Value, I, 1) <> Mid(Rng2.Value, I, 1) Then
        Rng1.Select
        With ActiveCell.Characters(Start:=I, Length:=1).Font
            .Color = -16776961
        End With
         Rng2.Select
        With ActiveCell.Characters(Start:=I, Length:=1).Font
            .Color = -16776961
        End With
    End If
Next I
End Sub

B02: Viết tiếp 1 macro (cha) gọi macro con trên như sau:
Mã:
Sub Cha1()
 Highlight_Different_Character Range("B3"), Range("C3")
End Sub
Nếu kết quả sau khi chạy macro cha vẫn đạt iêu cầu của bạn thì ta chuyển sang bước kế tiếp

B03: Sửa macro Cha1 thành macro Cha2 để nó có khả năng duyệt các ô của 2 vùng
Thí dụ Rng1 là vùng từ ô B3 đến ô B9, tương ứng vùng 2 là ô c3 đến ô C9
Bạn thử sức đi, đến sau 6 giờ chiều nay!
& chúc thành công!
 
Lần chỉnh sửa cuối:
Upvote 0

vanphu_ht91

Thành viên mới
Tham gia
6/4/17
Bài viết
20
Được thích
0
Cảm ơn bạn đã rep, cách của bạn vẫn đang là so sánh data giữa 2 cell B3 & C3 ạ.
Mình muốn là 2 cell ấy nằm ở ngẫu nhiên 2 vị trí bất kỳ đều có thể so sánh đc.
Mình đang nghiên cứu thêm userform nhưng chưa biết sai ở đâu.
 
Upvote 0

snow25

Thành viên gắn bó
Tham gia
24/7/18
Bài viết
3,177
Được thích
3,190
Donate (Momo)
Donate
Giới tính
Nam
Cảm ơn bạn đã rep, cách của bạn vẫn đang là so sánh data giữa 2 cell B3 & C3 ạ.
Mình muốn là 2 cell ấy nằm ở ngẫu nhiên 2 vị trí bất kỳ đều có thể so sánh đc.
Mình đang nghiên cứu thêm userform nhưng chưa biết sai ở đâu.
 
Upvote 0

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia
8/6/06
Bài viết
13,271
Được thích
20,451
. . . . ., cách của bạn vẫn đang là so sánh data giữa 2 cell B3 & C3 ạ.
Mình muốn là 2 cell ấy nằm ở ngẫu nhiên 2 vị trí bất kỳ đều có thể so sánh đc.. . . . .
Muốn ngẫu nhiên 2 ô thì trước tiên ta ngẫu nhiên 001 ô & ô thứ 2 đem so sánh là ô bên phải liền kề với ô ta đã chọn
ví dụ:
PHP:
Sub ThuNghiemSoSanh2OBatKy()
 Dim Rng1 As Range, Rng0 As Range

 Set Rng1 = Selection
 Set Rng0 = Rng1.Offset(, 1)
 HighlightDifferentCharacter Rng1, Rng0
End Sub
 
Upvote 0

bebo021999

Thành viên gạo cội
Tham gia
26/1/11
Bài viết
4,629
Được thích
7,084
Giới tính
Nam
Nghề nghiệp
GPE
Mình chưa hiểu ngẫu nhiên là thế nào?
Giả sử trong bảng tính có cả trăm ô chứa text, phải chỉ định cho nó so sánh với ô nào chứ nhỉ?
 
Upvote 0

vanphu_ht91

Thành viên mới
Tham gia
6/4/17
Bài viết
20
Được thích
0
Mình chưa hiểu ngẫu nhiên là thế nào?
Giả sử trong bảng tính có cả trăm ô chứa text, phải chỉ định cho nó so sánh với ô nào chứ nhỉ?
Đúng rồi bác, code trên là em viết cho text cố định ở B3 & C3.
Em đang muốn text nằm ở 2 ô bất kỳ mình chọn vào 2 ô đó thì sẽ tiến hành so sánh ấy ạ (mình sẽ chỉ định bằng cách chọn 2 ô cần so sánh).
 
Upvote 0

Nhattanktnn

Thành viên gắn bó
Tham gia
11/11/16
Bài viết
2,507
Được thích
2,920
Donate (Momo)
Donate
Giới tính
Nam
Đúng rồi bác, code trên là em viết cho text cố định ở B3 & C3.
Em đang muốn text nằm ở 2 ô bất kỳ mình chọn vào 2 ô đó thì sẽ tiến hành so sánh ấy ạ (mình sẽ chỉ định bằng cách chọn 2 ô cần so sánh).
Cái so sánh chuỗi là bạn so sánh bắt đầu từ ký tự thứ nhất của từng chuỗi đến hết à? Vì có trường hợp kiểu này: "abcd" và "1abcd2" thì theo ý tưởng bạn đưa ra là nó khác nhau hết phải không?
 
Upvote 0

VetMini

Ăn cùng góc phố
Tham gia
21/12/12
Bài viết
14,285
Được thích
18,894
Nếu mình hiểu đúng ý đồ của bạn, thì bạn nên trãi qua các bước như sau:

B01: Sửa đứa con tinh thần của bạn thành vầy:
PHP:
Sub Highlight_Different_Character(Rng1 As Range, Rng2 As Range)
Dim I As Integer

For I = 1 To Len(Rng1.Value)
    If Mid(Rng1.Value, I, 1) <> Mid(Rng2.Value, I, 1) Then
        Rng1.Select
        With ActiveCell.Characters(Start:=I, Length:=1).Font
            .Color = -16776961
        End With
         Rng2.Select
        With ActiveCell.Characters(Start:=I, Length:=1).Font
            .Color = -16776961
        End With
    End If
Next I
End Sub

B02: Viết tiếp 1 macro (cha) gọi macro con trên như sau:
Mã:
Sub Cha1()
 Highlight_Different_Character Range("B3"), Range("C3")
End Sub
Nếu kết quả sau khi chạy macro cha vẫn đạt iêu cầu của bạn thì ta chuyển sang bước kế tiếp

B03: Sửa macro Cha1 thành macro Cha2 để nó có khả năng duyệt các ô của 2 vùng
Thí dụ Rng1 là vùng từ ô B3 đến ô B9, tương ứng vùng 2 là ô c3 đến ô C9
Bạn thử sức đi, đến sau 6 giờ chiều nay!
& chúc thành công!
So sánh có hai kiểu:
1. Tuyệt đối:
Hai bên phải giống nhau, kể cả vị trí. Đó là cách bạn làm ở trên.
2. Tương đối:
Hai bên giống nhau, nhưng có thể lệch vị trí.
abcdefgh giống abcddefgh ở 4 ký tự đầu và 4 ký tự cuối.

Về code:
1. Code gọi hàm Value của Range đến Len+1 lần.
2. Chỉ có 1 cái chấm mà phải dùng With thì tự dưng làm code dài ra thêm 2 dòng. Dòng start With và dòng End With.
3. Code kết thúc ở Rng2 được chọn. Loại code này người ta thường tránh. Code chính chắn trược khi select hoặc activate cái gì thì phải save lại tình trạng trước đó. Sau khi làm việc xong thì trả lại tình trạng ban đầu.

Về tên hàm: (Highlight_Different_Character)
Số ký tự khác nhau là số nhiều. Highlight_Different_Characters mới đúng.
Từ Different cũng hơi tối nghĩa. Differing chính xác hơn.

Chú thích: tôi chỉ bàn với bạn. Tôi tránh dính dáng với người dùng tiếng Tây và viết tắt.
 
Upvote 0

vanphu_ht91

Thành viên mới
Tham gia
6/4/17
Bài viết
20
Được thích
0
Cái so sánh chuỗi là bạn so sánh bắt đầu từ ký tự thứ nhất của từng chuỗi đến hết à? Vì có trường hợp kiểu này: "abcd" và "1abcd2" thì theo ý tưởng bạn đưa ra là nó khác nhau hết phải không?
Đúng rồi đó bác, còn TH kia thì khó quá e chưa nghĩ ra
Bài đã được tự động gộp:

So sánh có hai kiểu:
1. Tuyệt đối:
Hai bên phải giống nhau, kể cả vị trí. Đó là cách bạn làm ở trên.
2. Tương đối:
Hai bên giống nhau, nhưng có thể lệch vị trí.
abcdefgh giống abcddefgh ở 4 ký tự đầu và 4 ký tự cuối.

Về code:
1. Code gọi hàm Value của Range đến Len+1 lần.
2. Chỉ có 1 cái chấm mà phải dùng With thì tự dưng làm code dài ra thêm 2 dòng. Dòng start With và dòng End With.
3. Code kết thúc ở Rng2 được chọn. Loại code này người ta thường tránh. Code chính chắn trược khi select hoặc activate cái gì thì phải save lại tình trạng trước đó. Sau khi làm việc xong thì trả lại tình trạng ban đầu.

Về tên hàm: (Highlight_Different_Character)
Số ký tự khác nhau là số nhiều. Highlight_Different_Characters mới đúng.
Từ Different cũng hơi tối nghĩa. Differing chính xác hơn.

Chú thích: tôi chỉ bàn với bạn. Tôi tránh dính dáng với người dùng tiếng Tây và viết tắt.
Cảm ơn góp ý của bạn, mình sẽ lưu ý ạ. Bạn thông cảm English mình hơi dốt. ^^
 
Upvote 0

VetMini

Ăn cùng góc phố
Tham gia
21/12/12
Bài viết
14,285
Được thích
18,894
Cái so sánh chuỗi là bạn so sánh bắt đầu từ ký tự thứ nhất của từng chuỗi đến hết à? Vì có trường hợp kiểu này: "abcd" và "1abcd2" thì theo ý tưởng bạn đưa ra là nó khác nhau hết phải không?
Giải thuật như bài #1 là sai sót cả đống.

Một giải thuật cho so sánh và bôi đỏ (tuyệt đối, như đề cập ở bài #9):
1. bôi mặc định (đen) cho cả hai - quan trọng, quên điều này là làm sai
2. chọn cái dài hơn làm rg1, cái ngắn hơn là rg2.
If (ô 1 dài hơn hay bằng ô 2) Then Set rg1 = ô 1 : Set rg2 = ô 2
Else Set rg1 = ô 2 : Set rg2 = ô 1
3. a = rg1.Value, b = rg2.Value
4. vòng lặp i = 1 To Len(b)
4.1. so sánh, cứ khác nhau thì đổi thành đỏ
5. nếu i <= Len(a) thì bôi đỏ chỗ còn lại của rg1
 
Upvote 0

vanphu_ht91

Thành viên mới
Tham gia
6/4/17
Bài viết
20
Được thích
0
Giải thuật như bài #1 là sai sót cả đống.

Một giải thuật cho so sánh và bôi đỏ (tuyệt đối, như đề cập ở bài #9):
1. bôi mặc định (đen) cho cả hai - quan trọng, quên điều này là làm sai
2. chọn cái dài hơn làm rg1, cái ngắn hơn là rg2.
If (ô 1 dài hơn hay bằng ô 2) Then Set rg1 = ô 1 : Set rg2 = ô 2
Else Set rg1 = ô 2 : Set rg2 = ô 1
3. a = rg1.Value, b = rg2.Value
4. vòng lặp i = 1 To Len(b)
4.1. so sánh, cứ khác nhau thì đổi thành đỏ
5. nếu i <= Len(a) thì bôi đỏ chỗ còn lại của rg1
Ý tưởng của em trùng vs của bác đó, nhưng do mới học nên chưa biết đưa vào vba như thế nào.
Mong được chỉ giáo.
 
Upvote 0

HieuCD

Chuyên gia GPE
Tham gia
14/9/10
Bài viết
9,079
Được thích
20,037
Xin chào mọi người.
Mình mới học thêm VBA do tính chất công việc. Nhờ mọi người chỉ bảo thêm
Bài toán của mình là làm thế nào để so sánh data ở 2 ô bất kỳ trong excel & Highlight các giá trị khác biệt đó
Code so sánh ở 2 cell cụ thể thì mình có làm được như thế này rồi.
Cảm ơn mọi người đã góp ý
Mã:
Sub Highlight_Different_Character()
Dim i As Integer
For i = 1 To Len(Range("B3"))
    If Mid(Range("B3"), i, 1) <> Mid(Range("C3"), i, 1) Then
        Range("B3").Select
        With ActiveCell.Characters(Start:=i, Length:=1).Font
        .Color = -16776961
        End With
         Range("C3").Select
        With ActiveCell.Characters(Start:=i, Length:=1).Font
        .Color = -16776961
        End With
    End If
Next i
End Sub
View attachment 281255
Kiểm tra lại . . .
Mã:
Sub Highlight_Different_Character()
  Dim rng As Range, rng2 As Range, txt$, txt2$, L&, L2&, i&
 
  Application.DisplayAlerts = False
  On Error Resume Next
ChonLai:
  Set rng = Application.InputBox(prompt:="Chon Cell Thu Nhat", Type:=8)
  If rng Is Nothing Then GoTo ChonLai
ChonLai2:
  Set rng2 = Application.InputBox(prompt:="Chon Cell Thu Hai", Type:=8)
  If rng2 Is Nothing Then GoTo ChonLai2
  rng.Font.ColorIndex = xlAutomatic
  rng2.Font.ColorIndex = xlAutomatic
  txt = rng(1, 1).Value: txt2 = rng2(1, 1).Value
  L = Len(txt): L2 = Len(txt2)
 
  For i = 1 To L
    If i <= L2 Then
      If Mid(txt, i, 1) <> Mid(txt2, i, 1) Then
        rng.Characters(Start:=i, Length:=1).Font.Color = -16776961
        rng2.Characters(Start:=i, Length:=1).Font.Color = -16776961
      End If
    Else
      rng.Characters(Start:=i, Length:=L - L2).Font.Color = -16776961
      Exit For
    End If
  Next i
  If L2 > L Then
    rng2.Characters(Start:=L + 1, Length:=L2 - L).Font.Color = -16776961
  End If
  Application.DisplayAlerts = True
End Sub
 
Upvote 0

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia
8/6/06
Bài viết
13,271
Được thích
20,451
Bạn tham khảo file & thực hiện tiếp
 

File đính kèm

  • Form.rar
    16.4 KB · Đọc: 3
Upvote 0

vanphu_ht91

Thành viên mới
Tham gia
6/4/17
Bài viết
20
Được thích
0
Chưa lai đủ.
Đáng lẽ phải mở đầu bằng "Perfecto! Gracias, amigo" mới đúng thời trang tiếng Mẽo Latino, học trên phim xã hội đen Mẽo.
Các bạn giỏi thì có thể k vào đọc bài mà, mình mới học nên cần học hỏi nhiều.
Có nhất thiết phải khó chịu với nhau thế k nhỉ?
Bài đã được tự động gộp:

Chưa lai đủ.
Đáng lẽ phải mở đầu bằng "Perfecto! Gracias, amigo" mới đúng thời trang tiếng Mẽo Latino, học trên phim xã hội đen Mẽo.
Các bạn giỏi thì có thể k vào đọc bài mà, mình mới học nên cần học hỏi nhiều.
Có nhất thiết phải khó chịu với nhau thế k nhỉ?
 
Upvote 0
Web KT

Group

DIỄN ĐÀN GIẢI PHÁP EXCEL
Top Bottom