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
21
Đượ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
 
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
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
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
. . . . ., 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
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
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
Đú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
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
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
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
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
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
Bạn tham khảo file & thực hiện tiếp
 

File đính kèm

  • Form.rar
    16.4 KB · Đọc: 4
Upvote 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
Back
Top Bottom