So sánh 2 vùng dữ liệu (Range) bằng VBA (1 người xem)

Liên hệ QC

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

tunglinhmot

Thành viên chính thức
Tham gia
17/5/17
Bài viết
59
Được thích
6
Giới tính
Nam
Chào các anh chị.
Em mới học về VBA, em có một vấn đề muốn nhờ các anh chị trên GPE giúp đỡ ạ.
Em có một bài toán với Excel VBA là so sánh 2 vùng dữ liệu giữa 2 workbook.
Kiểu như là vlookup cho một ô cell ý,nhưng đây là cho cả một vùng dữ liệu (theo hàng) .
Cụ thể là, nếu cell E1 của workbook A bằng một giá trị cho trước nào đó thì sẽ select vào Range("A1: D1") của workbook A đó rồi tìm xem ở trong workbook B từ cột A : D tương ứng xem có vùng (hàng) nào có các giá trị trong các ô cell tương ứng giống hệt với vùng Range("A1: D1") của workbook A không. Giả sử là vùng "Ax : Dx" của Workbook B trùng với vùng "A1 : D1" của workbook A thì sẽ copy dữ liệu của vùng Workbook(A).sheet1.Range("G1:J1") sang vùng Workbook(B).sheet1.Range("Gx : Jx")

Em xin cảm ơn các anh chị.
 
Lần chỉnh sửa cuối:
có ai chỉ giúp em hướng đi cho bài toán này không ạ
 
Upvote 0
Chả đoán nổi bạn muốn đi đâu, lấy gì chỉ hướng đi.
Là thế này ạ. Em có một vùng dữ liệu là Range("A1 : D1") trong sheet A. Bây giờ em muồn tìm trong một vùng Range("A1 : D12") của Sheet B (tìm theo hàng) xem có hàng nào đồng nhất hoàn toàn với vùng SheetA.Range("A1 : D1") hay không. Nếu có thì copy dữ liệu từ SheetA.Range("E1 : G1") sang SheetB.Range("Ex : Gx") nào đó. x là số hàng mà giá trị SheetB.Range("Ax : Dx") đồng nhất với SheetA.Range("A1 : D1"). Cụ thể thì em trinh bày trong file đính kèm ah.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Filter range A1: D12 bên sheetB theo A1: D1 của sheetA.
Copy E1:G1 bên sheetA
Paste Visble Cells Only to sheetB
 
Upvote 0
Filter range A1: D12 bên sheetB theo A1: D1 của sheetA.
Copy E1:G1 bên sheetA
Paste Visble Cells Only to sheetB
Anh có thế nói cụ thể hơn một chút được không ah. Làm sao để Filter range A1: D12 bên sheetB theo A1: D1 của sheetA, và Paste Visble Cells Only to sheetB là như thế nào ah.
 
Upvote 0
ah là cái gì? Tôi chả thấy nó cụ thể chút nào.
 
Upvote 0
Hổng biết làm thì học VBA chi cho sớm. Lo học hết chỗ căn bản của bảng tính đã.

Mà cái này là bạn tự đặt ra để tập làm hay là vấn đề thật vậy? Nếu tự đặt ra thì tìm đề bài khác đi. Đề này không dễ cho người mới bắt đầu. Nó cần đến kỹ thuật so sánh mảng chuỗi.
 
Upvote 0
Em có học qua một lớp VBA cơ bản rồi. Cái này là vấn đề thật mà ở cty em đang gặp phải. Lần nào cũng phải copy từng hàng một rất mất thời gian.
Về cách nghĩ thì em cũng nghĩ giống như anh nói, nhưng về câu lệnh thì em không rõ. Anh có thể chỉ cho em một ví dụ cơ bản về so sánh 2 vùng dữ liệu trong VBA, nếu trùng thì đưa giá trị true , không trùng thì False được không.
 
Upvote 0
Em có học qua một lớp VBA cơ bản rồi. Cái này là vấn đề thật mà ở cty em đang gặp phải. Lần nào cũng phải copy từng hàng một rất mất thời gian.
Về cách nghĩ thì em cũng nghĩ giống như anh nói, nhưng về câu lệnh thì em không rõ. Anh có thể chỉ cho em một ví dụ cơ bản về so sánh 2 vùng dữ liệu trong VBA, nếu trùng thì đưa giá trị true , không trùng thì False được không.

Bạn khong có nghĩ giống tôi nói đâu. Tôi có nhắc ở trên là cách đói chiếu của bài này thuộc về trình độ hơi khá một chút. Cỡ câu lệnh còn tơ lơ mơ thì khong biết giải thuật này.

Mã:
Sub CopTumLum()
Const VUNGDOICHIEU = "A1:D1"
Const VUNGCOPY = "E1:G1"
Const VUNGTRA = "A3:A12"
Const TENSH1 = "SheetA"
Const TENSH2 = "SheetB"
Dim mangDCh As Variant, mangCpy As Variant, mangTra As Variant
Dim chepBD As Range
Dim lnDCh As Integer, lnCpy As Integer, i As Integer, i2 As Integer
mangDCh = Sheets(TENSH1).Range(VUNGDOICHIEU).Value
mangCpy = Sheets(TENSH1).Range(VUNGCOPY).Value
lnDCh = UBound(mangDCh, 2)
lnCpy = UBound(mangCpy, 2)
mangTra = Sheets(TENSH2).Range(VUNGTRA).Resize(, lnDCh).Value
Set chepBD = Sheets(TENSH2).Range(VUNGTRA).Offset(0, lnDCh).Resize(1, lnCpy)
For i = 1 To UBound(mangTra)
    For i2 = 1 To lnDCh
        If mangTra(i, i2) <> mangDCh(1, i2) Then Exit For
    Next i2
    If i2 > lnDCh Then chepBD.Offset(i - 1).Value = mangCpy
Next i
End Sub

Mấy cái Const là chỗ bạn cần sửa cho hợp với dữ liệu của mình.
 
Upvote 0
Bạn khong có nghĩ giống tôi nói đâu. Tôi có nhắc ở trên là cách đói chiếu của bài này thuộc về trình độ hơi khá một chút. Cỡ câu lệnh còn tơ lơ mơ thì khong biết giải thuật này.

Mã:
Sub CopTumLum()
Const VUNGDOICHIEU = "A1:D1"
Const VUNGCOPY = "E1:G1"
Const VUNGTRA = "A3:A12"
Const TENSH1 = "SheetA"
Const TENSH2 = "SheetB"
Dim mangDCh As Variant, mangCpy As Variant, mangTra As Variant
Dim chepBD As Range
Dim lnDCh As Integer, lnCpy As Integer, i As Integer, i2 As Integer
mangDCh = Sheets(TENSH1).Range(VUNGDOICHIEU).Value
mangCpy = Sheets(TENSH1).Range(VUNGCOPY).Value
lnDCh = UBound(mangDCh, 2)
lnCpy = UBound(mangCpy, 2)
mangTra = Sheets(TENSH2).Range(VUNGTRA).Resize(, lnDCh).Value
Set chepBD = Sheets(TENSH2).Range(VUNGTRA).Offset(0, lnDCh).Resize(1, lnCpy)
For i = 1 To UBound(mangTra)
    For i2 = 1 To lnDCh
        If mangTra(i, i2) <> mangDCh(1, i2) Then Exit For
    Next i2
    If i2 > lnDCh Then chepBD.Offset(i - 1).Value = mangCpy
Next i
End Sub

Mấy cái Const là chỗ bạn cần sửa cho hợp với dữ liệu của mình.
Em có học qua một lớp VBA ngắn hạn ở cty. chỉ làm quen với các bài toán liên quan đến if, for, do_loop, while... thôi. có thể bài toán này cũng hơi quá sức thật. Nhưng em sẽ từ từ nghiên cứu. Cám ơn anh vì đoạn code kia.
 
Upvote 0
Em đã thử đoạn code trên. Nó chạy OK rồi. Sau một hồi nghiên cứu thì em cũng hiểu đại khái ý nghĩa những câu lệnh đó rồi. Đúng là suy nghĩ không giống nhau thật.
Em vẫn còn lơ tơ mơ quá. Cám ơn và hi vọng được các bác trên GPE giúp đỡ nhiều hơn. Dựa vào đoạn code của bác VetMini thì em nghĩ mình có thể hoàn thành nốt bài toán của mình rồi. Khi nào xem viết xong đoạn code hoàn chỉnh dùng cho công việc của mình em xin chia sẻ để mọi người cùng tham khảo và trao đổi ạ. Một lần nữa xin cảm ơn bác VetMini ạ.
 
Upvote 0
Tôi cố tình viết VUNGTRA = "A3:A12" để bạn tự tìm hiểu cách biến chuyển

Một khi hiểu cách làm rồi thì bạn có thể sửa VUNGTRA = "A3" và viết thêm code để nó tìm ra dòng cuối cùng dữ liệu.
Ở đây có rất nhiều code tìm dòng cuối. Bạn tự nghiên cứu lấy.
 
Upvote 0
Tôi cố tình viết VUNGTRA = "A3:A12" để bạn tự tìm hiểu cách biến chuyển

Một khi hiểu cách làm rồi thì bạn có thể sửa VUNGTRA = "A3" và viết thêm code để nó tìm ra dòng cuối cùng dữ liệu.
Ở đây có rất nhiều code tìm dòng cuối. Bạn tự nghiên cứu lấy.
Vâng, em cũng đang nghiên cứu đây. Thanks bác.
 
Upvote 0
Web KT

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

Back
Top Bottom