So sánh 2 range ? giúp mình với

Liên hệ QC

vumian

Mỗi bậc thang là mỗi Cell
Tham gia
12/3/07
Bài viết
267
Được thích
186
Nghề nghiệp
employee only, not a boss
hi,
như đã mô tả trong file, làm cách nào so sánh được 2 range như vậy,
- range1 có số dòng không bằng range2
- so sánh từng cell trong range1 có tồn tại trong rang2 hay không ?
- số dòng trong range1 được dao động

Giúp mình với. Rất cám ơn các cậu
 

File đính kèm

  • SoSanh2range.zip
    4.4 KB · Đọc: 147
Như đã mô tả trong file, làm cách nào so sánh được 2 range như vậy,
- range1 có số dòng không bằng range2
- so sánh từng cell trong range1 có tồn tại trong rang2 hay không ?
- số dòng trong range1 được dao động
công thức tại C4: =COUNTIF(E$4:E$17,B4) :so sánh từng cell trong range1 có tồn tại trong rang2 hay không ?
Nếu chưa có, hiện msgbox thông báo đang thiếu số nào hay tự động thêm vào cũng được: Có lẽ cái này fải dùng đến VBA như bạn nói mới xong: Vấn đề này như duyệt từng phần tử của mảng bên Number đem so sánh với mảng bên data ?
 
Upvote 0
hi SA DQ,
Cách của bạn là so sánh từng phần tử rồi drop down, Có cách nào so sánh mảng với mảng không cùng phần tử với nhau không hay là ý của mình nói ở trên ?

Rất cám ơn bạn đã góp ý
 
Upvote 0
Dear all,
-------
Theo em nguyên tắc so sánh ở đây là: So sánh từng phần tử trong mảng lớn hơn so với các phần tử trong mảng nhỏ hơn.
Kết quả tìm được bổ sung vào mảng nhỏ hơn.
Chúng ta sẽ sử dụng vòng lặp duyệt qua các phần tử trong mảng lớn, mỗi phần tử lại được "quét qua" (so sánh với) các phần tử của mảng nhỏ.
Nhưng khoan hãy nghĩ tới lập trình, chúng ta sử dụng hàm VLookup để tìm xem các phần tử trong DATABASE có tồn tại trong NUMBER không, nếu #N/A! thì đó là các phần tử được bổ sung.
Hi vọng đó là cách ngắn nhất!
 
Upvote 0
Dear Cường,

Ở đây là so sánh mảng nhỏ (Number) trong mảng lớn (Data) ,trong mảng nhỏ có thể có nhiều dòng cùng số (nên có thể không dùng đươc vlookup) , những số này trong mảng nhỏ được cập nhật thường xuyên, nên mới cần sự compare 2 mảng này. mong các anh giúp đỡ
 
Upvote 0
Theo tôi làm thêm 1 cột so sánh các pt trong number,
C4=COUNTIF($B$4:$B4,$B4)
Nếu C4=1 thì vlookup, tiếp theo xác định NA và copy vào Number
1
1
 
Upvote 0
ý của bạn thì SADQ đã nói ở trên, mình thấy dùng VBA có lẽ là tốt nhất
 
Upvote 0
Bài trên có phải là ss các pt Number với Data, nếu pt mà data có mà N o có thì copy từ Data sang N ??? hay là ....
Và copy vào dòng nào của N?
Theo tôi không phải cái gì cũng phải dùng VBA
Bạn xem có đúng chưa?
 
Lần chỉnh sửa cuối:
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
@ThuNghi:
- Bạn đi ngược đề bài
- Nếu bạn dùng formula, thì nếu bên Number 1.000 dòng thì drop down 1000 dòng ? Dù sao mình cũng đã học được tí gì đó ở cách của bạn
Anyway, thanks for your supporting me, Big thanks
@SA DQ:
- Mình chạy lần đầu thì dò kết quả thì đúng, nhưng chưa thầy xíu nào chưa đúng như bạn nói,tí nữa tìm được lỗi, thảo luận tiếp,hihi, actually, it's so great man. Thanks a lot
 
Upvote 0
So sánh hai range

So sánh 2 range bạn có thể tìm trên mạng.
Các bạn tham khảo ví dụ này nha
http://www.exceltip.com/st/Compare_two_worksheet_ranges_using_VBA_in_Microsoft_Excel/476.html

Mã:
Sub CompareWorksheetRanges(rng1 As Range, rng2 As Range)
Dim r As Long, c As Integer
Dim lr1 As Long, lr2 As Long, lc1 As Integer, lc2 As Integer
Dim maxR As Long, maxC As Integer, cf1 As String, cf2 As String
Dim rptWB As Workbook, DiffCount As Long
    If rng1 Is Nothing Or rng2 Is Nothing Then Exit Sub
    If rng1.Areas.Count > 1 Or rng2.Areas.Count > 1 Then
        MsgBox "Can't compare multiple selections!", _
            vbExclamation, "Compare Worksheet Ranges"
        Exit Sub
    End If
    Application.ScreenUpdating = False
    Application.StatusBar = "Creating the report..."
    Set rptWB = Workbooks.Add
    Application.DisplayAlerts = False
    While Worksheets.Count > 1
        Worksheets(2).Delete
    Wend
    Application.DisplayAlerts = True
    With rng1
        lr1 = .Rows.Count
        lc1 = .Columns.Count
    End With
    With rng2
        lr2 = .Rows.Count
        lc2 = .Columns.Count
    End With
    maxR = lr1
    maxC = lc1
    If maxR < lr2 Then maxR = lr2
    If maxC < lc2 Then maxC = lc2
    If lr1 <> lr2 Or lc1 <> lc2 Then
        If MsgBox("The two ranges you want to compare are of different size!" & _
            Chr(13) & "Do you want to continue anyway?", _
            vbQuestion + vbYesNo, "Compare Worksheet Ranges") = vbNo Then Exit Sub
    End If
    DiffCount = 0
    For c = 1 To maxC
        Application.StatusBar = "Comparing cells " & _
            Format(c / maxC, "0 %") & "..."
        For r = 1 To maxR
            cf1 = ""
            cf2 = ""
            On Error Resume Next
            cf1 = rng1.Cells(r, c).FormulaLocal
            cf2 = rng2.Cells(r, c).FormulaLocal
            On Error GoTo 0
            If cf1 <> cf2 Then
                DiffCount = DiffCount + 1
                Cells(r, c).Formula = "'" & cf1 & " <> " & cf2
            End If
        Next r
    Next c
    Application.StatusBar = "Formatting the report..."
    With Range(Cells(1, 1), Cells(maxR, maxC))
        .Interior.ColorIndex = 19
        With .Borders(xlEdgeTop)
            .LineStyle = xlContinuous
            .Weight = xlHairline
        End With
        With .Borders(xlEdgeRight)
            .LineStyle = xlContinuous
            .Weight = xlHairline
        End With
        With .Borders(xlEdgeLeft)
            .LineStyle = xlContinuous
            .Weight = xlHairline
        End With
        With .Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            .Weight = xlHairline
        End With
        On Error Resume Next
        With .Borders(xlInsideHorizontal)
            .LineStyle = xlContinuous
            .Weight = xlHairline
        End With
        With .Borders(xlInsideVertical)
            .LineStyle = xlContinuous
            .Weight = xlHairline
        End With
        On Error GoTo 0
    End With
    Columns("A:IV").ColumnWidth = 20
    rptWB.Saved = True
    If DiffCount = 0 Then
        rptWB.Close False
    End If
    Set rptWB = Nothing
    Application.StatusBar = False
    Application.ScreenUpdating = True
    MsgBox DiffCount & " cells contain different formulas!", _
        vbInformation, "Compare Worksheet Ranges"
End Sub
Để sử dụng thủ tục trên bạn dùng ví dụ sau:
Mã:
Sub TestCompareWorksheetRanges()
    ' compare two ranges in the active worksheet in the active workbook
    CompareWorksheetRanges Range("A1:A100"), Range("B1:B100")
    ' compare two ranges in two different worksheets in the active workbook
    CompareWorksheetRanges Worksheets(1).Range("A1:A100"), _
        Worksheets(2).Range("B1:B100")
    ' compare two ranges in two different worksheets in two different workbooks
    CompareWorksheetRanges ActiveWorkbook.Worksheets(1).Range("A1:A100"), _
        Workbooks("WorkBookName.xls").Worksheets(1).Range("B1:B100")
End Sub

Lê Văn Duyệt
 
Upvote 0
Theo tôi, nếu làm vấn đề này dùng công thức 1.000 dòng mà dùng manual ->F9 thì sẽ nhanh hơn VBA so sánh từng phần tử. Bạn so sánh thử.
Còn dùng VBA để lấy những gì mà number có mà data chưa có thì theo tôi thuật toán sau có lẽ nhanh nhất, "rừng"
- Copy Number: B4:B1000 vào X4
- Copy Data : E4:E100 vào X1001
- Dùng advancefilter - Unique Record only
- copy trở lại E4:...
 
Upvote 0
SA_DQ đã viết:
Bạn tham khảo nhé (còn 1 xíu chưa đúng, bạn tự sửa nha!)
Mã:
Option Explicit:        Option Base 1 
[B]Sub SSanh2Vung() [/B]
 Const lRow1  As Long = 20:         Const lRow2 As Long = 30
 Dim lZ As Long, lW As Long, StrC As String
 Dim Rng As Range, Rng0 As Range
 ReDim MNew(lRow1):                 Dim BDaCo As Boolean
 1[COLOR=blue]' Xếp 2 cột dữ liệu [/COLOR]
 For lZ = 1 To 2
    If lZ = 1 Then
        Set Rng = Range("E3:E" & CStr(lRow2)):          StrC = "E4"
    Else
        Set Rng = Range("B3:B" & CStr(lRow1)):          StrC = "B4"
    End If
    Rng.Select
    Selection.Sort Key1:=Range(StrC), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
 Next lZ
 lZ = 0:            Set Rng = Nothing
 2[COLOR=blue]' Dò tìm ở 2 cột; đưa vô biến ~ DL thiếu [/COLOR]
 
 For Each Rng In Range("B3:B" & CStr(lRow1))
    For Each Rng0 In Range("E3:E" & CStr(lRow2))
        If Rng.Value = Rng0.Value Then
            BDaCo = Not BDaCo:   Exit For
        End If
    Next Rng0
    If BDaCo = True Then
        BDaCo = False
    Else
        lZ = lZ + 1:            MNew(lZ) = Rng.Value
    End If
 Next Rng
3[COLOR=blue]' Chép từ biến mảng DL vô CSDL [/COLOR]
 lZ = Range("E32555").End(xlUp).Row
 For lW = 1 To lRow1
    If Len(MNew(lW)) < 1 Then Exit For
    StrC = "E" & CStr(lZ + lW):         Range(StrC).Value = MNew(lW)
 Next lW
[B]End Sub [/B]

SA DQ ơi,
code của bạn mình chạy chưa tìm được lỗi, vấn đề là mình hôg hiểu bạn đặt biến lZ,LW để làm gì, đoạn for lZ=1 to 2 để làm gì vậy ? nếu lZ=1 thì range(E3:E30), khúc này mình hiểu, còn khúc strC="E4" để làm gì vậy, còn else ?

Giúp mình thêm tí nha, thanks
 
Upvote 0
code của bạn mình chạy chưa tìm được lỗi, . . .
Lỗi đó là nó chép luôn tên trường của cột 'B3:B20'
vấn đề là mình hôg hiểu bạn đặt biến lZ,LW để làm gì,
Bạn có thấy mục 3 có 2 vòng lặp & sử dụng 2 biến này trong các vòng lặp lồng nhau; Nếu bạn thấy còn ít thì khai thêm biến nữa! (&ui nha!)
đoạn for lZ=1 to 2 để làm gì vậy ? nếu lZ=1 thì range(E3:E30), khúc này mình hiểu, còn khúc strC="E4" để làm gì vậy, còn else ?
Vòng lặp để xếp lần lược cột B & cột E;
Gán biến StrC lần lược là 'E4' & 'B4' là để khi xếp cột tương ứng excel nhận ra đâu là tiêu đề cột cần xếp í mà!
Else: Trường hợp còn lại trong 2 trường hợp
Hết vòng lặp này excel sẽ xếp 2 cột mà ta muốn theo í của chúng ta cần;
Vì sau này là phần so sánh; nếu trước so sánh mà không xếp lại thì giống như cưới chưa hôn thú zậy!
 
Upvote 0
Nếu bài toán chỉ có thế thì thật đơn giản, Công thức không thì cũng được rồi. Các bác dùng Dao to Búa lớn quá.

Làm sao để biết từng nội dung trong cột Number có tồn tại trong cột Database hay chưa ?
Nếu chưa có, hiện msgbox thông báo đang thiếu số nào hay tự động thêm vào cũng được

Nếu là tự động thì phải dùng VBA rồi.

Nếu là thêm thì thêm vào đâu ? Cột Number hay Data
-Nếu là Data : Không được bởi Data để nhập liệu
-Nếu là Number : Tại sao lại phải thêm ? Thực ra Number đã có sẵn nhưng Data chưa có, sau này nhập liệu sẽ có.

Mình hình dung : Data : Nhập liệu; Number : Danh mục gì gì đó

Nếu đúng như vậy thì phải là :Làm sao để biết từng nội dung trong cột Database có tồn tại trong cột Number hay chưa ? Nếu chưa có, hiện msgbox thông báo đang thiếu số nào hay tự động thêm vào cột Number cũng được


Thân!
 
Upvote 0
Web KT
Back
Top Bottom