So sánh 2 bảng tính

  • Thread starter Thread starter binhmv
  • Ngày gửi Ngày gửi
Liên hệ QC

binhmv

Thành viên mới
Tham gia
4/8/07
Bài viết
12
Được thích
4
Chào các bạn! Tôi đang gặp vấn đề nan giải trong công việc phải so sánh 2 bảng tính do 1 chương trình tạo ra tại 2 thời gian khác nhau cần tìm ra sự thay đổi đưa kết quả ra bảng tính khác... là tín đồ của excel tôi nghĩ không có vấn đề gì excel không giải quyết được vậy nhờ các bậc tiền bối chỉ giáo cho xin cảm ơn trước :=\+ +-+-+-+ :=\+ +-+-+-+ :=\+ :=\+ .( có bảng mẫu gửi kèm )
 

File đính kèm

Bạn cũng có thể tải tiện ích sau (dùng thử 30 ngày):
http://j-walk.com/ss/pup/pup6/pup6trial.exePup6

Cài vào máy, nó sẽ tạo một Menu trên Excel.

Vào Pup6> Auditing Tool> Compare Range, làm theo hướng dẫn.

Kết quả tôi gửi kèm file !

Chúc bạn thành công!

Chú ý gửi bài đúng chỗ nhé!
 

File đính kèm

Lần chỉnh sửa cuối:
Cảm ơn các bạn đã gúp đỡ, mình đã thử dùng nhưng cả 2 chương trình đều không miễn phí, kết quả đưa ra ứng dụng khác lại mất thời gian chọn thủ công trên bảng tính so sánh .... và khi sử dụng với bảng tính dung lượng lớn >10.000 dòng thì chúng lỳ ra mất nhiều thời gian.... Nhờ các bạn giúp có cách nào đơn giản hơn tách được kết quả trên bảng tính so sánh = autofilter không

Cảm ơn các bạn đã gúp đỡ. Mình đã dùng thử 2 chương trình nhưng cả hai đều không miễn phí và kết quả đưa ra khó sử dụng mà phải lọc lại trên 2 bảng so sánh, khi sử dụng trên bảng lớn >10.000 dòng chạy rất chậm.
Mình muốn các bạn giúp có cách nào đơn giản hơn đánh dấu các dòng khác nhau sau đó sử dụng autofilter đẻ lọc ra để sử dụng trên 2 bảng so sánh....!!!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Đơn giản nhất là đưa 2 sheet về 1 book mới, mở thêm 1 sheet thứ 3 tên là So sánh:
Nhập công thức ở sheet3 , A1 = if(sheet1!A1-sheet2!A1=0,,sheet1!A1-sheet2!A1)'nếu là số
là text thì tùy chọn hiển thị sheet1 hay 2.

Copy công thức này tới 10K hay 65K cũng bình thường
 
Dùng hàm tự tạo để so sánh 2 mảng dữ liệu

Một giải pháp miễn phí cho bạn binhmv, sử dụng hàm tự tạo để tính tổng số lần lặp lại của Record (>=1 thì là có lập lại, thuận tiện cho Filter).
Tôi đã tạo một hàm cho bạn. Bạn thử xem nhé, nhưng nếu dữ liệu nhiều như bạn nói (10K x 24 field = 240k lần so sánh tối đa cho 1 record) thì bạn nên tắt chức năng autocalculations của Excel đi nhập công thức xong thì nhấn F9 để Excel tính toán, sau đó bạn copy / paste value qua dòng kế, xoá công thức đi để cho nhẹ, rồi đặt lại chế độ AutoCalculations (10K Record để so sánh lẫn nhau thì mấy việc này bõ bèn gì đúng không?)

Có thể đây chưa là cách hay, các bạn cứ cho ý kiến nhé, làm sao để tăng tốc chương trình???
Thân.
tôi gửi kèm file cho bạn (dựa trên file của bạn up lên) nhưng đã đem 2 sheet gộp chung vào một bảng tính, khi làm việc thì không nhất thiết phải để chung, tuy nhiên bạn sẽ phải copy hàm tự tạo sang cả 2 file.

cú pháp của hàm như sau:
=timtongsohanggiongnhau(dataLookup,Table_array)
dataLookup : hàng dữ liệu cần tìm
Table_array : Bảng dữ liệu so sánh

tổng số cột của dataLookup có thể nhỏ hơn bằng tổng số cột của Table_Array, nhưng buộc phải bắt đầu so sánh từ cột đầu tiên.

đây là code của hàm

Mã:
[COLOR=darkblue]Option[/COLOR] [COLOR=darkblue]Explicit[/COLOR]
[COLOR=darkblue]Public[/COLOR] [COLOR=darkblue]Function[/COLOR] timtongsohanggiongnhau(dataLookup [COLOR=darkblue]As[/COLOR] Range, Table_array [COLOR=darkblue]As[/COLOR] Range) [COLOR=darkblue]As[/COLOR] [COLOR=darkblue]Long[/COLOR]
[COLOR=darkblue]Dim[/COLOR] i [COLOR=darkblue]As[/COLOR] [COLOR=darkblue]Integer[/COLOR], j [COLOR=darkblue]As[/COLOR] [COLOR=darkblue]Integer[/COLOR]
[COLOR=darkblue]Dim[/COLOR] iTotalRow [COLOR=darkblue]As[/COLOR] [COLOR=darkblue]Integer[/COLOR]
[COLOR=darkblue]Dim[/COLOR] iTable_arrayCol [COLOR=darkblue]As[/COLOR] [COLOR=darkblue]Integer[/COLOR]
[COLOR=darkblue]Dim[/COLOR] idataLookupRow [COLOR=darkblue]As[/COLOR] [COLOR=darkblue]Integer[/COLOR]
[COLOR=darkblue]Dim[/COLOR] iTotalCol [COLOR=darkblue]As[/COLOR] [COLOR=darkblue]Integer[/COLOR]
[COLOR=darkblue]Dim[/COLOR] giong [COLOR=darkblue]As[/COLOR] [COLOR=darkblue]Boolean[/COLOR]
[COLOR=darkblue]Dim[/COLOR] tongsolangiongnhau As [COLOR=darkblue]Integer[/COLOR]
 
[COLOR=green]'khoi dong bien[/COLOR]
tongsolangiongnhau = 0
    iTotalRow = Table_array.Rows.Count
    iTable_arrayCol = Table_array.Columns.Count
    idatalookupRow = dataLookup.rows.Count
    iTotalCol = dataLookup.Columns.Count
[COLOR=green]'so col cua datalookup co the nho hon = so col cua Table_array[/COLOR]
[COLOR=darkblue]If[/COLOR] iTotalCol > iTable_arrayCol [COLOR=darkblue]Or[/COLOR] idataLookupRow > 1 [COLOR=darkblue]Then[/COLOR]
    timtongsohanggiongnhau = [COLOR=darkblue]CVErr[/COLOR](xlErrNA)
[COLOR=darkblue]Else[/COLOR] [COLOR=green]' Col data nho hon va rowdata = 1[/COLOR]
    [COLOR=darkblue]For[/COLOR] i = 1 [COLOR=darkblue]To[/COLOR] iTotalRow
        giong = [COLOR=darkblue]False[/COLOR]
        j = 0
        [COLOR=darkblue]Do[/COLOR]
            j = j + 1
            giong = (dataLookup.Cells(1, j) = Table_array.Cells(i, j))
        [COLOR=darkblue]Loop[/COLOR] [COLOR=darkblue]Until[/COLOR] [COLOR=darkblue]Not[/COLOR] giong [COLOR=darkblue]Or[/COLOR] j = iTotalCol
        [COLOR=darkblue]If[/COLOR] giong [COLOR=darkblue]Then[/COLOR] tongsolangiongnhau = tongsolangiongnhau + 1 [COLOR=green]' tang bien tongsolanbangnhau len[/COLOR]
    [COLOR=darkblue]Next[/COLOR] i
    timtongsohanggiongnhau = tongsolangiongnhau
[COLOR=darkblue]End[/COLOR] [COLOR=darkblue]If[/COLOR] [COLOR=green]' tong so col thoa dieu kien[/COLOR]
[COLOR=darkblue]End[/COLOR] [COLOR=darkblue]Function[/COLOR]

Thân.
 
Lần chỉnh sửa cuối:
Cảm ơn bạn SoiBien rất nhiều ! bạn có thể thiết kế cho mình một hàm theo ý của mình như sau : số liệu so sánh chỉ cần so sánh 2 cột D của 2 bảng để tìm ra dữ liệu trong cột D của bảng này có tồn tại trong cột D của bảng kia không sau đó đưa ra KQ để = autofilter sử dụng như hàm trên như vậy mới đúng yêu cầu công việc..... xin cảm ơn rất nhiều. Mình gửi file lớn hơn kèm theo
 

File đính kèm

SoiBien đã viết:
Một giải pháp miễn phí cho bạn binhmv, sử dụng hàm tự tạo để tính tổng số lần lặp lại của Record (>=1 thì là có lập lại, thuận tiện cho Filter).
Tôi đã tạo một hàm cho bạn. Bạn thử xem nhé, nhưng nếu dữ liệu nhiều như bạn nói (10K x 24 field = 240k lần so sánh tối đa) thì bạn nên tắt chức năng autocalculations của Excel đi nhập công thức xong thì nhấn F9 để Excel tính toán, sau đó bạn copy / paste value qua dòng kế, xoá công thức đi để cho nhẹ, rồi đặt lại chế độ AutoCalculations (10K Record để so sánh lẫn nhau thì mấy việc này bõ bèn gì đúng không?)

Có thể đây chưa là cách hay, các bạn cứ cho ý kiến nhé, làm sao để tăng tốc chương trình???
Thân.
tôi gửi kèm file cho bạn (dựa trên file của bạn up lên) nhưng đã đem 2 sheet gộp chung vào một bảng tính, khi làm việc thì không nhất thiết phải để chung, tuy nhiên bạn sẽ phải copy hàm tự tạo sang cả 2 file.

cú pháp của hàm như sau:
=timtongsohanggiongnhau(dataLookup,Table_array)
dataLookup : hàng dữ liệu cần tìm
Table_array : Bảng dữ liệu so sánh

tổng số cột của dataLookup có thể nhỏ hơn bằng tổng số cột của Table_Array, nhưng buộc phải bắt đầu so sánh từ cột đầu tiên.

[/code]

Thân.

sau cái này phức tạp quá có cách nào gọn nhẹ không,vd như chọ vùng nào đó rồi so sánh không cần phải gõ công thức như trên không "soibien"
 
binhmv đã viết:
Cảm ơn bạn SoiBien rất nhiều ! bạn có thể thiết kế cho mình một hàm theo ý của mình như sau : số liệu so sánh chỉ cần so sánh 2 cột D của 2 bảng để tìm ra dữ liệu trong cột D của bảng này có tồn tại trong cột D của bảng kia không sau đó đưa ra KQ để = autofilter sử dụng như hàm trên như vậy mới đúng yêu cầu công việc..... xin cảm ơn rất nhiều. Mình gửi file lớn hơn kèm theo

Nếu không lầm ý bạn thì bạn vẫn dùng công thức trên cho ô Y2
=timtongsohanggiongnhau(d2,[workbookname]sheetname!$d$2:$d$10000)

rồi copy xuống dưới

thì nó vẫn cho ra kết quả là dữ liệu trong ô D2 được lập bao nhiêu lần trong vùng d2:D10000

Đó là nói về hàm trên để bạn hiểu thêm cách sử dụng hàm

Còn thực tế nếu chỉ so sánh một cột thôi thì bạn dùng một hàm sẵn có của Excel là hàm countif để đếm số lần xuất hiện của ô, bạn dùng như sau:
=countif([workbookname]sheetname!$d$2:$d$10000,d2)
rồi copy xuống dưới

Thân
 
ongtrungducmx25 đã viết:
sau cái này phức tạp quá có cách nào gọn nhẹ không,vd như chọ vùng nào đó rồi so sánh không cần phải gõ công thức như trên không "soibien"

Sao chứ nhỉ???

ý bạn là chọn 2 vùng riêng biệt, rồi dùng một thủ tục, so sánh từng record của vùng này với vùng kia, trùng nhau thì tô màu ??
 
Với hàm Countif cho dữ liệu của bạn, mất vài giây, còn hàm tự tạo mất 10' (P3 1 Ghz = 384 MBRam).

Bó tay, lâu quá.
 

File đính kèm

Cảm ơn các bạn ! mình muốn đúng như anh Tuấn nói rồi dùng một thủ tục, so sánh từng record của vùng này với vùng kia, trùng nhau thì thôi, ngược lại đưa ra một ký tự nào đó vào ô chứa kết quả thủ tục để dùng auto filter sử dụng .....!
 
Trường hợp của bạn là hàm Countif sẽ trả về số lần lặp lại của Criteria (từng ô trong cột D), trả về 0 nếu không có ô nào trùng, từ đây bạn dùng autofilter để lọc với Criteria là 0.
Thân.
 
Cảm ơn Diễn đàn ! cảm ơn bạn soibien đã cho ý tưởng đúng là hàm Countif là giải pháp tuyệt vời trong trường hợp này với < 2phút tôi có thể thực hiện công việc bấy lâu nay mấy rất nhiều công sức bằng cách thực hiện 1 add-ins là có ngay kết quả đúng là " Đi đâu lanh quanh cho đời mỏi mòn " cảm ơn các bạn rất nhiều !!!!!!!!!!
 
Mình đang làm cách khác là dùng hàm if(and(data 1= data 1'), (data 2 = data 2'),...),1,0). Các data 1, data 2 là các key chính cần so sánh. Cái này tuỳ dữ liệu của mọi người mà xử lý khác nhau.
Đào mộ lên chút xíu, mọi người thông cảm :)
 
Web KT

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

Back
Top Bottom