Lấy ra những số khác nhau trong hai chuỗi số

Liên hệ QC

Cu Tồ

Tìm đến kiến thức! ꧁༺ Cu Tồ ༻꧂
Tham gia
6/5/20
Bài viết
735
Được thích
347
Chào đại gia đình GPE
Cả nhà cho mình hỏi . Minh có hai dãy số A VÀ B như sau :
dãy số A : 100;500;600;800;18000;600
dãy số B : 800;400;3000;100;7007;600
Làm sao để so sánh lấy ra những số không có đồng thời ở cả 2 dãy số A và dãy số B
Kết quả mong muốn :
Kết quả
dãy số Adãy số B
500;600;18000400;3000;7007
có một lưu ý nhở là ở dãy số A số 600 xuất hiện 2 lần,còn ở dãy B xuất hiện 1 lần,thì kết quả liệt kê ra sẽ là dãy số A bị thừa ra 1 số 600
Cảm ơn cả nhà nhiều
 
Lần chỉnh sửa cuối:
Chào đại gia đình GPE
Cả nhà cho mình hỏi . Minh có hai dãy số A VÀ B như sau :
dãy số A : 100;500;600;800;18000;600
dãy số B : 800;400;3000;100;7007;600
Làm sao để so sánh lấy ra những số không có đồng thời ở cả 2 dãy số A và dãy số B
Kết quả mong muốn :
Kết quả
dãy số Adãy số B
500;600;18000;600400;3000;7007
có một lưu ý nhở là ở dãy số A số 600 xuất hiện 2 lần,còn ở dãy B xuất hiện 1 lần,thì kết quả liệt kê ra sẽ là dãy số A bị thừa ra 1 số 600
Cảm ơn cả nhà nhiều
Nếu viết code VBA thì không khó, nhưng dùng hàm có sẵn trong excel thì hơi khoai, phải ủ mưu
 
Upvote 0
Nếu viết code VBA thì không khó, nhưng dùng hàm có sẵn trong excel thì hơi khoai, phải ủ mưu
mình muốn viết code để so sánh lấy ra các số khác nhau đó ạ
Bài đã được tự động gộp:

Chắc bạn thử mọi người chứ bài này bạn thừa sức làm mà.
không bác ơi,nhiều người có cách làm hay,cái gì cũng phải học hỏi mọi người mới biết được cái hay bác ạ
 
Upvote 0
Chào đại gia đình GPE
Cả nhà cho mình hỏi . Minh có hai dãy số A VÀ B như sau :
dãy số A : 100;500;600;800;18000;600
dãy số B : 800;400;3000;100;7007;600
Làm sao để so sánh lấy ra những số không có đồng thời ở cả 2 dãy số A và dãy số B
Kết quả mong muốn :
Kết quả
dãy số Adãy số B
500;600;18000;600400;3000;7007
có một lưu ý nhở là ở dãy số A số 600 xuất hiện 2 lần,còn ở dãy B xuất hiện 1 lần,thì kết quả liệt kê ra sẽ là dãy số A bị thừa ra 1 số 600
Cảm ơn cả nhà nhiều
Thử code dưới đây.
Các chuỗi A đặt tại cột A, B đặt tại cột B.
Các số trong chuỗi <= 1000000

---
Có lẽ cần nhiều dữ liệu hơn để test code
Mã:
Option Explicit

Sub Loc()
Dim mangA, mangB
Dim Loc() As Integer
Dim Kq
Dim rws, i, j

With Sheet1
    mangA = .Range("A1", .Range("A1").End(xlDown))
    mangB = .Range("B1", .Range("B1").End(xlDown))
    rws = Application.Min(UBound(mangA), UBound(mangB))
    ReDim Loc(1000000)
    ReDim Kq(1 To rws, 1 To 2)
    For i = 1 To rws
        For Each j In Split(mangA(i, 1), ";")
            Loc(CLng(j)) = Loc(CLng(j)) + 1
        Next j
        For Each j In Split(mangB(i, 1), ";")
            If Loc(CLng(j)) = 0 Then
                Kq(i, 2) = Kq(i, 2) & " " & j
            Else
                Loc(CLng(j)) = Loc(CLng(j)) - 1
            End If
        Next j
        Kq(i, 2) = Trim(Kq(i, 2))
      
        For Each j In Split(mangA(i, 1), ";")
            If Loc(CLng(j)) > 0 Then
                Kq(i, 1) = Kq(i, 1) & " " & j
                Loc(CLng(j)) = 0
            End If
        Next j
        Kq(i, 1) = Trim(Kq(i, 1))
    Next i
    .Range("D1").Resize(rws, 2) = Kq
End With

End Sub
 
Upvote 0
Đầu tiên là không được đăng nhiều bài cùng nội dung đã bạn.
Bạn dùng cách nào biết hai bài trùng nhau thì cũng cách ấy thử xem hai dãy số trùng nhau :p

Vậy bạn đưa cách của bạn trước đi, như vậy ai có cách không hay bằng đỡ phải đưa lên nữa.
Người đã có sẵn nhiều cách nhưng vẫn muốn thêm. Việc chia sẻ thì còn phya.
 
Upvote 0
Kết quả mong muốn :
Kết quả
dãy số Adãy số B
500;600;18000;600400;3000;7007
có một lưu ý nhở là ở dãy số A số 600 xuất hiện 2 lần,còn ở dãy B xuất hiện 1 lần,thì kết quả liệt kê ra sẽ là dãy số A bị thừa ra 1 số 600
Cảm ơn cả nhà nhiều
Theo tôi hiểu thì 600 đầu tiên trong A sẽ triệt tiêu với 600 trong B. Vậy kết quả chỉ có 1 số 600 chứ đâu là 2 số 600 như bạn liệt kê.
 
Upvote 0
Nếu tôi hiểu yêu cầu thì
Mã:
Sub loc_chuoi()
Const delim = ";"
Dim lastRow As Long, r As Long, k As Long, chuoiA As String, chuoiB As String, mangA, dulieu()
    With ThisWorkbook.Worksheets("Sheet1")
        .Range("D1:E10000").ClearContents
        lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
        dulieu = .Range("A1:B" & lastRow).Value
    End With
    For r = 1 To UBound(dulieu, 1)
        dulieu(r, 1) = Application.Trim(dulieu(r, 1))
        If Len(dulieu(r, 1)) Then
            mangA = Split(dulieu(r, 1), delim)
            chuoiB = delim & Application.Trim(dulieu(r, 2)) & delim
            For k = 0 To UBound(mangA)
                If InStr(1, chuoiB, delim & mangA(k) & delim, vbTextCompare) Then
                    chuoiB = Replace(chuoiB, delim & mangA(k), "", 1, 1, vbTextCompare)
                    mangA(k) = ""
                End If
            Next k
            For k = 0 To UBound(mangA)
                If Len(mangA(k)) Then chuoiA = chuoiA & delim & mangA(k)
            Next k
            dulieu(r, 1) = Mid(chuoiA, 2)
            dulieu(r, 2) = Mid(chuoiB, 2, Len(chuoiB) - 2)
        End If
    Next r
    ThisWorkbook.Worksheets("Sheet1").Range("D1").Resize(UBound(dulieu, 1), UBound(dulieu, 2)).Value = dulieu
End Sub
 
Upvote 0
Chào đại gia đình GPE
Cả nhà cho mình hỏi . Minh có hai dãy số A VÀ B như sau :
dãy số A : 100;500;600;800;18000;600
dãy số B : 800;400;3000;100;7007;600
Làm sao để so sánh lấy ra những số không có đồng thời ở cả 2 dãy số A và dãy số B
Kết quả mong muốn :
Kết quả
dãy số Adãy số B
500;600;18000;600400;3000;7007
có một lưu ý nhở là ở dãy số A số 600 xuất hiện 2 lần,còn ở dãy B xuất hiện 1 lần,thì kết quả liệt kê ra sẽ là dãy số A bị thừa ra 1 số 600
Cảm ơn cả nhà nhiều
2 dãy số nằm ở cột A và B từ dòng 1 như trong file
Mã:
Sub ABC()
  Dim arr(), S, i&, k&, A$, B$
  Const deli$ = ";"
  arr = Sheets("Sheet1").Range("A1").CurrentRegion.Value
  For i = 1 To UBound(arr)
    A = deli & Application.Trim(arr(i, 1)) & deli
    B = deli & Application.Trim(arr(i, 2)) & deli
    If Len(A) > 2 And Len(A) > 2 Then
      S = Split(A, deli)
      For k = 1 To UBound(S) - 1
        If InStr(1, B, deli & S(k) & deli, vbTextCompare) Then
          B = Replace(B, deli & S(k), "", 1, 1, vbTextCompare)
          A = Replace(A, deli & S(k), "", 1, 1, vbTextCompare)
        End If
      Next k
      If A = deli Then arr(i, 1) = "" Else arr(i, 1) = Mid(A, 2, Len(A) - 2)
      If B = deli Then arr(i, 2) = "" Else arr(i, 2) = Mid(B, 2, Len(B) - 2)
    End If
  Next i
  Sheets("Sheet1").Range("D1").Resize(UBound(arr), 2).Value = arr
End Sub
 

File đính kèm

  • SoSanh.xlsm
    16.2 KB · Đọc: 12
Lần chỉnh sửa cuối:
Upvote 0
rất cảm ơn các bác đã giúp đỡ
Bài đã được tự động gộp:

Thử code dưới đây.
Các chuỗi A đặt tại cột A, B đặt tại cột B.
Các số trong chuỗi <= 1000000

---
Có lẽ cần nhiều dữ liệu hơn để test code
Mã:
Option Explicit

Sub Loc()
Dim mangA, mangB
Dim Loc() As Integer
Dim Kq
Dim rws, i, j

With Sheet1
    mangA = .Range("A1", .Range("A1").End(xlDown))
    mangB = .Range("B1", .Range("B1").End(xlDown))
    rws = Application.Min(UBound(mangA), UBound(mangB))
    ReDim Loc(1000000)
    ReDim Kq(1 To rws, 1 To 2)
    For i = 1 To rws
        For Each j In Split(mangA(i, 1), ";")
            Loc(CLng(j)) = Loc(CLng(j)) + 1
        Next j
        For Each j In Split(mangB(i, 1), ";")
            If Loc(CLng(j)) = 0 Then
                Kq(i, 2) = Kq(i, 2) & " " & j
            Else
                Loc(CLng(j)) = Loc(CLng(j)) - 1
            End If
        Next j
        Kq(i, 2) = Trim(Kq(i, 2))
   
        For Each j In Split(mangA(i, 1), ";")
            If Loc(CLng(j)) > 0 Then
                Kq(i, 1) = Kq(i, 1) & " " & j
                Loc(CLng(j)) = 0
            End If
        Next j
        Kq(i, 1) = Trim(Kq(i, 1))
    Next i
    .Range("D1").Resize(rws, 2) = Kq
End With

End Sub
code bác chạy ổn ,cảm ơn bác nhiều
Bài đã được tự động gộp:

Nếu tôi hiểu yêu cầu thì
Mã:
Sub loc_chuoi()
Const delim = ";"
Dim lastRow As Long, r As Long, k As Long, chuoiA As String, chuoiB As String, mangA, dulieu()
    With ThisWorkbook.Worksheets("Sheet1")
        .Range("D1:E10000").ClearContents
        lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
        dulieu = .Range("A1:B" & lastRow).Value
    End With
    For r = 1 To UBound(dulieu, 1)
        dulieu(r, 1) = Application.Trim(dulieu(r, 1))
        If Len(dulieu(r, 1)) Then
            mangA = Split(dulieu(r, 1), delim)
            chuoiB = delim & Application.Trim(dulieu(r, 2)) & delim
            For k = 0 To UBound(mangA)
                If InStr(1, chuoiB, delim & mangA(k) & delim, vbTextCompare) Then
                    chuoiB = Replace(chuoiB, delim & mangA(k), "", 1, 1, vbTextCompare)
                    mangA(k) = ""
                End If
            Next k
            For k = 0 To UBound(mangA)
                If Len(mangA(k)) Then chuoiA = chuoiA & delim & mangA(k)
            Next k
            dulieu(r, 1) = Mid(chuoiA, 2)
            dulieu(r, 2) = Mid(chuoiB, 2, Len(chuoiB) - 2)
        End If
    Next r
    ThisWorkbook.Worksheets("Sheet1").Range("D1").Resize(UBound(dulieu, 1), UBound(dulieu, 2)).Value = dulieu
End Sub
bác hiểu đúng ý rồi ạ,600 kia là do em viết thừa ra,nhưng code bác khi dữ liệu nhiều hơn 1 dòng thì kết quả lại không đúng ạ
ví dụ cột A là


500;800;900;600;400
500;800;600;400
500;300;400
cột B là


500;300;400;100;500
500;300;400
500;800;900;600;400
Thì kết quả của bác lại sai ạ
1651794344723.png
Bài đã được tự động gộp:

2 dãy số nằm ở cột A và B từ dòng 1 như trong file
Mã:
Sub ABC()
  Dim arr(), S, i&, k&, A$, B$
  Const deli$ = ";"
  arr = Sheets("Sheet1").Range("A1").CurrentRegion.Value
  For i = 1 To UBound(arr)
    A = deli & Application.Trim(arr(i, 1)) & deli
    B = deli & Application.Trim(arr(i, 2)) & deli
    If Len(A) > 2 And Len(A) > 2 Then
      S = Split(A, deli)
      For k = 1 To UBound(S) - 1
        If InStr(1, B, deli & S(k) & deli, vbTextCompare) Then
          B = Replace(B, deli & S(k), "", 1, 1, vbTextCompare)
          A = Replace(A, deli & S(k), "", 1, 1, vbTextCompare)
        End If
      Next k
      If A = ";" Then arr(i, 1) = "" Else arr(i, 1) = Mid(A, 2, Len(A) - 2)
      If B = ";" Then arr(i, 2) = "" Else arr(i, 2) = Mid(B, 2, Len(B) - 2)
    End If
  Next i
  Sheets("Sheet1").Range("D1").Resize(UBound(arr), 2).Value = arr
End Sub
cảm ơn bác ,code bác chạy nhanh ạ
 
Upvote 0
Tôi cũng chẳng hiểu làm sao quý vị lại code được:
1. Thứ nhất, thớt chỉ nói mình có hai dãy số, và đưa ví dụ là hai chuỗi có delim là ";". Quý vị đoán ra được chúng là ranges.
2. Thứ hai, (lỗi này quá tệ) thớt nói chuỗi có hai số lặp lại thì "liệt kê ra là thừa":
Cách "liệt kê là thừa" của thớt bố tôi cũng không hiểu nổi: nếu tôi đọc kết quả của A (gọi là KQA), thấy số 600 thì tôi vẫn chưa thể tin là 600 không có trong B. Phải đọc hết chuỗi KQA, không còn thấy 600 nào nữa thì tôi mới tin rằng 600 không có trong B. Nhưng nếu đọc xong và thấy trong KQA có 2 lần 600 thì tôi vẫn chưa thể biết là trong B có 600 hay không.
Nói túm lại:
Kết quả A: 500;600;18000;600 chỉ cho biết 500 không có trong B, nhưng 600 thì ... chịu khó dò lại trong B
Trừ phi thớt bảo rằng "Số xuất hiện trong chuỗi kết quả 1 lần mới là số khác nhau, nhiều hơn 1 thì có ở cả hai chuỗi".

Tiêu chí của phân tích kết quả (kết quả mong muốn) là lối làm việc dưới cả trình độ của tay mơ.
 
Upvote 0
bác hiểu đúng ý rồi ạ,600 kia là do em viết thừa ra,nhưng code bác khi dữ liệu nhiều hơn 1 dòng thì kết quả lại không đúng ạ
ví dụ cột A là
Tôi sơ ý, do đêm nên lười kiểm tra.

Trước dòng
Mã:
For k = 0 To UBound(mangA)

thì thêm

Mã:
chuoiA = ""

Ý tưởng và thuật toán là quan trọng thôi, còn những cái khác chỉ cần cẩn thận, chú ý thật kỹ. Dùng Application.Trim để loại khoản cách thừa nếu có. Còn chuyện dùng Instr vì Instr rất nhanh. Dùng Replace cũng đương nhiên.
 
Upvote 0
Tôi cũng chẳng hiểu làm sao quý vị lại code được:
1. Thứ nhất, thớt chỉ nói mình có hai dãy số, và đưa ví dụ là hai chuỗi có delim là ";". Quý vị đoán ra được chúng là ranges.
2. Thứ hai, (lỗi này quá tệ) thớt nói chuỗi có hai số lặp lại thì "liệt kê ra là thừa":
Cách "liệt kê là thừa" của thớt bố tôi cũng không hiểu nổi: nếu tôi đọc kết quả của A (gọi là KQA), thấy số 600 thì tôi vẫn chưa thể tin là 600 không có trong B. Phải đọc hết chuỗi KQA, không còn thấy 600 nào nữa thì tôi mới tin rằng 600 không có trong B. Nhưng nếu đọc xong và thấy trong KQA có 2 lần 600 thì tôi vẫn chưa thể biết là trong B có 600 hay không.
Nói túm lại:
Kết quả A: 500;600;18000;600 chỉ cho biết 500 không có trong B, nhưng 600 thì ... chịu khó dò lại trong B
Trừ phi thớt bảo rằng "Số xuất hiện trong chuỗi kết quả 1 lần mới là số khác nhau, nhiều hơn 1 thì có ở cả hai chuỗi".

Tiêu chí của phân tích kết quả (kết quả mong muốn) là lối làm việc dưới cả trình độ của tay mơ.
cảm ơn bác góp ý
Bài đã được tự động gộp:

Tôi sơ ý, do đêm nên lười kiểm tra.

Trước dòng
Mã:
For k = 0 To UBound(mangA)

thì thêm

Mã:
chuoiA = ""

Ý tưởng và thuật toán là quan trọng thôi, còn những cái khác chỉ cần cẩn thận, chú ý thật kỹ. Dùng Application.Trim để loại khoản cách thừa nếu có. Còn chuyện dùng Instr vì Instr rất nhanh. Dùng Replace cũng đương nhiên.
cảm ơn bác nhiều
 
Upvote 0
Web KT

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

Back
Top Bottom