Em có một vấn đề về tìm kiếm từ nhiều Sheets chuyển vào 1 Sheets (1 người xem)

Liên hệ QC

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

baquang1984

Thành viên tiêu biểu
Tham gia
3/6/10
Bài viết
429
Được thích
44
Nghề nghiệp
Kỹ sư Lâm nghiệp
Chào anh chị trên diễn đàn GPE!
Em có file cần phải tổng hợp từ rất nhiều tờ bản đồ vào 1 Sheets"DÂT" để đưa vào CSDL địa chính trong file đính kèm em dùng hàm "if, IFERROR, Vlookup" và hàm "and" để xử lý dữ liệu em làm VD một tờ bản đồ nếu nhiều tờ bản đồ thì rất chậm. Nay nhờ anh chị Code VBA giúp đển thực hiện công việc của em được nhanh hơn
Bài toán của em đưa ra như sau:
- Em có 3 Sheets:
+ 1 Sheets DATA để tổng hợp dữ liệu từ 2 Sheets"File1", Sheets"QD_CapGCN" vào (Chưa làm được cần GPE giúp đỡ)
+ 1 Sheets"File1" để tổng hợp dữ liệu từ nhiều tờ bản đồ vào (Đã làm được)
+ 1 Sheets"QD_CapGCN" để tổng hợp dữ liệu từ nhiều danh sách cấp giấy chứng nhận (Đã làm được)
Và dữ liệu được tổng hợp từ 2 Sheets"File1", Sheets"QD_CapGCN" vào theo đúng như dữ liệu file đính kèm
mong được các anh chị của diễn đàn giúp đỡ
Cảm ơn mọi người nhiều!
 
Chào anh chị trên diễn đàn GPE!
Em có file cần phải tổng hợp từ rất nhiều tờ bản đồ vào 1 Sheets"DÂT" để đưa vào CSDL địa chính trong file đính kèm em dùng hàm "if, IFERROR, Vlookup" và hàm "and" để xử lý dữ liệu em làm VD một tờ bản đồ nếu nhiều tờ bản đồ thì rất chậm. Nay nhờ anh chị Code VBA giúp đển thực hiện công việc của em được nhanh hơn
Bài toán của em đưa ra như sau:
- Em có 3 Sheets:
+ 1 Sheets DATA để tổng hợp dữ liệu từ 2 Sheets"File1", Sheets"QD_CapGCN" vào (Chưa làm được cần GPE giúp đỡ)
+ 1 Sheets"File1" để tổng hợp dữ liệu từ nhiều tờ bản đồ vào (Đã làm được)
+ 1 Sheets"QD_CapGCN" để tổng hợp dữ liệu từ nhiều danh sách cấp giấy chứng nhận (Đã làm được)
Và dữ liệu được tổng hợp từ 2 Sheets"File1", Sheets"QD_CapGCN" vào theo đúng như dữ liệu file đính kèm
mong được các anh chị của diễn đàn giúp đỡ
Cảm ơn mọi người nhiều!
Bấm nút, thử xem kết quả có đúng không.
Không được xoá dữ liệu trong dòng 2 và 3 sheet DATA (đã ẩn)
 

File đính kèm

Upvote 0
Em Cảm ơn anh Ba Tê ở chương trình anh gửi em thấy có vấn đề như thế này ạ:
- Chương trình đã chạy đúng, tuy nhiên điều em muốn là cột GIOI_TINH1 là lấy theo điều kiện ở cột 23 Sheets"File1", nếu là 1 ghi là "Nam", nếu là 2 "Nữ", nếu không có để trống, cột GIOI_TINH2 nếu là 1 ghi là "Nữ", nếu là 2 "Nam", nếu không có để trống, trong trường hợp có tên ở cột CQL Sheets"DATA" nhưng ở cột TEN_VC Sheets"DATA" không có thì Cột GIOI_TINH2 để trống anh ạ
- Em muốn mở rộng để lấy dữ liệu cho đủ các cột ở Sheets"DATA" từ các Sheets"File1" và Sheets"QD_CapGCN" thì sửa như thế nào ạ
Cảm ơn anh nhiều!
 
Lần chỉnh sửa cuối:
Upvote 0
- Yêu cầu 1: Đã sửa lại code
- Yêu cầu 2: Chú ý dòng 2 sheet DATA là các số cột của sheet QD_CapGNC lấy sang sheet DATA, tuơng tự dòng 3 là các số cột của sheet File1.
Muốn lấy thêm cột nào, của sheet nào sang DATA thì nhập số cột của sheet đó vào đúng dòng 1 hoặc 2 của DATA.
 

File đính kèm

Upvote 0
Em cảm ơn anh Ba Tê đã giúp đỡ, có vấn đề nữa em muốn hỏi anh chút là
- Ở cột DAI_CHI2 Sheets"DATA" dữ liệu được lấy ở cột DiaChiCSD ở Sheets"File1" với điều kiện là có thông tin ở cột TEN_VC thì mới cho địa chỉ còn không để trống, khi em chạy Code của anh thì những cell ở cột TEN_VC không có thông tin nó vẫn cho địa chỉ.
- Nếu em bỏ hai cột Ma_CQL ở Sheets"File1" và cột Ma_CQL2 ở Sheets"QD_CapGCN" thì có ảnh hưởng gì không ạ vì khi em sử dụng các hàm "if, IFERROR, Vlookup" và hàm "and" thì cần phải có cột này vì giá trị duy nhất được tạo gia là nối giữa 2 cột là To_BDThua_dat
Mong được anh và mọi người trên diễn đàn giaiphapexcel.com giúp đỡ
Thanks!
- Yêu cầu 1: Đã sửa lại code
- Yêu cầu 2: Chú ý dòng 2 sheet DATA là các số cột của sheet QD_CapGNC lấy sang sheet DATA, tuơng tự dòng 3 là các số cột của sheet File1.
Muốn lấy thêm cột nào, của sheet nào sang DATA thì nhập số cột của sheet đó vào đúng dòng 1 hoặc 2 của DATA.
 
Upvote 0
Em cảm ơn anh Ba Tê đã giúp đỡ, có vấn đề nữa em muốn hỏi anh chút là
- Ở cột DAI_CHI2 Sheets"DATA" dữ liệu được lấy ở cột DiaChiCSD ở Sheets"File1" với điều kiện là có thông tin ở cột TEN_VC thì mới cho địa chỉ còn không để trống, khi em chạy Code của anh thì những cell ở cột TEN_VC không có thông tin nó vẫn cho địa chỉ.
Chắc "hổng chơi" nữa rồi.
Bài #3 có nói gì đến địa chỉ đâu?
Em Cảm ơn anh Ba Tê ở chương trình anh gửi em thấy có vấn đề như thế này ạ:
- Chương trình đã chạy đúng, tuy nhiên điều em muốn là cột GIOI_TINH1 là lấy theo điều kiện ở cột 23 Sheets"File1", nếu là 1 ghi là "Nam", nếu là 2 "Nữ", nếu không có để trống, cột GIOI_TINH2 nếu là 1 ghi là "Nữ", nếu là 2 "Nam", nếu không có để trống, trong trường hợp có tên ở cột CQL Sheets"DATA" nhưng ở cột TEN_VC Sheets"DATA" không có thì Cột GIOI_TINH2 để trống anh ạ
- Em muốn mở rộng để lấy dữ liệu cho đủ các cột ở Sheets"DATA" từ các Sheets"File1" và Sheets"QD_CapGCN" thì sửa như thế nào ạ
Cảm ơn anh nhiều!
Cái gì thì nói 1 lần, viết code, rồi nếu..., sửa lại code, lại nếu, ... sao chịu nỗi, có khi cái nếu sau lại "phá banh chành" code cũ, bõ công.
Sub này sửa lại, không có Tên_VC thì không có địa chỉ 2, cột 18 sheet DATA, bỏ số 6 ở R2, nhập số 6 vào R3
PHP:
Public Sub LOC_DATA()
Dim Dic As Object, ArrFile1(), ArrQD(), dArr(), ArrCol(), NamNu(), I As Long, J As Long, K As Long, Tem As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("File1")
    ArrFile1 = .Range(.[A3], .[A65536].End(xlUp)).Resize(, 23).Value2
End With
With Sheets("QD_CapGCN")
    ArrQD = .Range(.[A3], .[A65536].End(xlUp)).Resize(, 44).Value2
End With
ArrCol = Sheets("DATA").[A2:AQ3].Value2
NamNu = Sheets("DATA").[AR1:AR3].Value2
ReDim dArr(1 To UBound(ArrFile1, 1), 1 To 44)
For I = 1 To UBound(ArrFile1, 1)
    K = K + 1
    Dic.Add ArrFile1(I, 2), K
    For J = 1 To UBound(ArrCol, 2)
        If ArrCol(2, J) <> Empty Then dArr(K, J) = ArrFile1(I, ArrCol(2, J))
    Next J
        If dArr(K, 12) <> Empty Then        '-------------GioiTinh2
            If dArr(K, 2) = 1 Then
                dArr(K, 13) = 2
            ElseIf dArr(K, 2) = 2 Then
                dArr(K, 13) = 1
            End If
        Else
            dArr(K, 13) = 3
            dArr(K, 18) = Empty
        End If
    dArr(K, 2) = NamNu(dArr(K, 2), 1)       '------------Gioitinh Nam Nu
    dArr(K, 13) = NamNu(dArr(K, 13), 1)
Next I
For I = 1 To UBound(ArrQD, 1)
    Tem = ArrQD(I, 14)
    For J = 1 To UBound(ArrCol, 2)
        If ArrCol(1, J) <> Empty Then dArr(Dic.Item(Tem), J) = ArrQD(I, ArrCol(1, J))
    Next J
Next I
With Sheets("DATA")
    .[A5].Resize(K, 43) = dArr
End With
Set Dic = Nothing
End Sub
Còn cái Nếu thứ hai thì không hiểu, trước khi Nếu thì làm thử xem nó ra sao rồi hãy nói rõ khi thay đổi như vậy thì nó sai ra sao, đúng phải là thế nào...
- Nếu em bỏ hai cột Ma_CQL ở Sheets"File1" và cột Ma_CQL2 ở Sheets"QD_CapGCN" thì có ảnh hưởng gì không ạ vì khi em sử dụng các hàm "if, IFERROR, Vlookup" và hàm "and" thì cần phải có cột này vì giá trị duy nhất được tạo gia là nối giữa 2 cột là To_BDThua_dat
Mong được anh và mọi người trên diễn đàn giaiphapexcel.com giúp đỡ
Thanks!
 
Lần chỉnh sửa cuối:
Upvote 0
Hix anh Ba Tê ạ em đưa dữ liệu đầy đủ và điền các cột như anh hướng dẫn thì cháy chương chình báo lỗi
anh xem giúp em với ạ đây là đường dẫn tải file về ạ http://www.fshare.vn/file/TM0AK6008T/ file nó hơi nặng
Thanks anh!
 
Upvote 0
Hix anh Ba Tê ạ em đưa dữ liệu đầy đủ và điền các cột như anh hướng dẫn thì cháy chương chình báo lỗi
anh xem giúp em với ạ đây là đường dẫn tải file về ạ http://www.fshare.vn/file/TM0AK6008T/ file nó hơi nặng
Thanks anh!
Vậy thì do bạn thôi, dữ liệu ban đầu của bạn số thửa thừ 1-54 đâu có trùng nhau?
Giờ thì cái nào mới là không trùng nhau trong tất cả các dòng? Lấy cột nào làm cột chuẩn để ghép lại dữ liệu 2 sheet.
-------Nếu lấy cột 1 (Ma_CQL) sheet File1 và cột 1 (Ma_CQL2) thì cũng còn lỗi "1 đống" trong cột 23 sheet File1 vì Giới tính 1 Nam, 2 Nữ, 3 để trống, còn có 4 là gì, giới tính 10 là gì?
Ví dụ W8962, W10075....
 
Lần chỉnh sửa cuối:
Upvote 0
Vâng ban đầu của em số thửa chỉ ở một tờ bản đồ nên không thể trùng nhau được, khi em cho nhiều tờ bản đồ vào thì để thửa không trùng nhau em phải tạo một cột Ma_CQL = "Thua_dat&"0000"&To_BD thì sẽ tạo ra dãy số không trùng nhau anh à
 
Upvote 0
Vâng ban đầu của em số thửa chỉ ở một tờ bản đồ nên không thể trùng nhau được, khi em cho nhiều tờ bản đồ vào thì để thửa không trùng nhau em phải tạo một cột Ma_CQL = "Thua_dat&"0000"&To_BD thì sẽ tạo ra dãy số không trùng nhau anh à
Vẫn chưa nói rõ giới tính 4 và 10 là sao? Nó cũng là nguyên nhân gây lỗi, Nếu để nguyên số 1,2,3,4... 10 thì không sao, đàng này muốn 1 là Nam, có khi 1 là Nữ nếu là giới tính 2, rồi 3, rồi 4, 10...
Rồi A10709 và A10710 sheet File1 giống hệt nhau luôn.
 
Upvote 0
Vẫn chưa nói rõ giới tính 4 và 10 là sao? Nó cũng là nguyên nhân gây lỗi, Nếu để nguyên số 1,2,3,4... 10 thì không sao, đàng này muốn 1 là Nam, có khi 1 là Nữ nếu là giới tính 2, rồi 3, rồi 4, 10...
Rồi A10709 và A10710 sheet File1 giống hệt nhau luôn.
Nếu sửa hết các lỗi trên thì chạy Sub này.
Trước khi chạy pha 1 ly Cà phê ngồi chờ.... Máy tôi chạy 52 giây mới lọc xong hơn 1.000.000 cells
PHP:
Public Sub LOC_DATA()
Application.ScreenUpdating = False
Dim Dic As Object, ArrFile1(), ArrQD(), dArr(), ArrCol(), NamNu(), I As Long, J As Long, K As Long, Tem As Long, t As Variant
t = Timer
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("File1")
    ArrFile1 = .Range(.[A3], .[A65536].End(xlUp)).Resize(, 23).Value2
End With
With Sheets("QD_CapGCN")
    ArrQD = .Range(.[A3], .[A65536].End(xlUp)).Resize(, 44).Value2
End With
ArrCol = Sheets("DATA").[A2:AQ3].Value2
NamNu = Sheets("DATA").[AR1:AR3].Value2
ReDim dArr(1 To UBound(ArrFile1, 1), 1 To 44)
For I = 1 To UBound(ArrFile1, 1)
    K = K + 1
    Tem = ArrFile1(I, 1)
    If Not Dic.Exists(Tem) Then
        Dic.Add Tem, K
        For J = 1 To UBound(ArrCol, 2)
            If ArrCol(2, J) <> Empty Then dArr(K, J) = ArrFile1(I, ArrCol(2, J))
        Next J
        If dArr(K, 12) <> Empty Then        '-------------GioiTinh2
            If dArr(K, 2) = 1 Then
                dArr(K, 13) = 2
            ElseIf dArr(K, 2) = 2 Then
                dArr(K, 13) = 1
            End If
        Else
            dArr(K, 13) = 3
            dArr(K, 18) = Empty
        End If
        dArr(K, 2) = NamNu(dArr(K, 2), 1)       '------------Gioitinh Nam Nu
        dArr(K, 13) = NamNu(dArr(K, 13), 1)
    End If
Next I
For I = 1 To UBound(ArrQD, 1)
    Tem = ArrQD(I, 1)
    If Dic.Exists(Tem) Then
        For J = 1 To UBound(ArrCol, 2)
            If ArrCol(1, J) <> Empty Then dArr(Dic.Item(Tem), J) = ArrQD(I, ArrCol(1, J))
        Next J
    End If
Next I
With Sheets("DATA")
    .[A5].Resize(K, 43) = dArr
End With
Set Dic = Nothing
Application.ScreenUpdating = True
MsgBox Timer - t
End Sub
 
Upvote 0
Em cảm ơn anh!
- Anh có thể cho em hỏi chút là cơ chế lọc dữ liệu của chương trình anh viết có phụ thuộc vào cột Ma_CQL ở Sheets"File1" và cột Ma_CQL2 ở Sheets"QD_CapGCN" không ạ. vì khi Code thì em không muốn 2 cột này nữa ạ.
- Còn khi em sửa các lỗi như anh nêu là ở Hàng A10709, A107010 Sheets"File1" và dữ liệu ở cột Gioi_Tinh Sheets"File1" các mã 4, 10,.. em chuyển về thành mã là 3 thì chương trình đã chạy.
Vậy anh có thể sử giúp em là Dữ liệu của em ở cột giới tính chỉ cần quan tâm mã 1 và 2 thôi ạ còn các mã 3, 4, ... 10 là các mã quy định riêng của em ạ. Do đó để ghi nam hay nữ chỉ lấy các mã 1và 2 thôi còn các mã còn lại bỏ qua.
Thanks!
 
Lần chỉnh sửa cuối:
Upvote 0
Anh Ba Tê giúp em chương trình anh viết được không ạ:
Anh có thể sử giúp em là Dữ liệu của em ở cột giới tính chỉ cần quan tâm mã 1 và 2 thôi ạ còn các mã 3, 4, ... 10 là các mã quy định riêng của em ạ. Do đó để ghi "Nam " hay "Nữ" chỉ lấy các mã 1và 2 thôi còn các mã còn lại bỏ qua anh ạ.
Cảm ơn anh!
 
Upvote 0
Anh Ba Tê giúp em chương trình anh viết được không ạ:
Anh có thể sử giúp em là Dữ liệu của em ở cột giới tính chỉ cần quan tâm mã 1 và 2 thôi ạ còn các mã 3, 4, ... 10 là các mã quy định riêng của em ạ. Do đó để ghi "Nam " hay "Nữ" chỉ lấy các mã 1và 2 thôi còn các mã còn lại bỏ qua anh ạ.
Cảm ơn anh!
Xem lại file này, bỏ luôn 2 cột đầu trong 2 sheet File1 và QD_CapGCN.
Copy thêm cho đủ dữ liệu.
"Đuối" rồi nghe.
 

File đính kèm

Upvote 0
Em cảm ơn anh đã nhiệt tình giúp đỡ, khi em tải file chương trình anh viết về thì ở cột giới tính em cho thêm các giá trị 4, 5, 6, ... 10 vào thì chạy trương trình bị lỗi anh ạ. Ở đây em gán mã ở cột giới tính để chạy một chương trình khác của em, anh có thể giúp em phần này nữa được không ạ?
Cảm ơn anh nhiều!
Xem lại file này, bỏ luôn 2 cột đầu trong 2 sheet File1 và QD_CapGCN.
Copy thêm cho đủ dữ liệu.
"Đuối" rồi nghe.
 

File đính kèm

Upvote 0
Em cảm ơn anh đã nhiệt tình giúp đỡ, khi em tải file chương trình anh viết về thì ở cột giới tính em cho thêm các giá trị 4, 5, 6, ... 10 vào thì chạy trương trình bị lỗi anh ạ. Ở đây em gán mã ở cột giới tính để chạy một chương trình khác của em, anh có thể giúp em phần này nữa được không ạ?
Cảm ơn anh nhiều!

Giới tính thường là True-False, 0-1, Nam-Nữ ... đàng này có 1,2,3,4,5,6...10, Sao kỳ vậy?
Muốn dùng cho việc khác thì tạo thêm cột khác để quản lý, sao lại dùng chung cột giới tính "Chời"?
Copy lại dữ liệu đầy đủ nhé.
Hy vọng lần này là "vừa ý" với "cái kiểu" dữ liệu của bạn.
 

File đính kèm

Upvote 0
Mình là thành viên mới. Đang gặp khó khăn sau: Các file excell khác mình mở được, có 1 file là không mở được. Mong nhận được chỉ giáo của mọi người nhiều nhiều.
 
Upvote 0

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

Back
Top Bottom