Dùng VBA để lọc danh sách ở quận huyện

Liên hệ QC

nguyentrongdung

Thành viên mới
Tham gia
22/12/11
Bài viết
38
Được thích
8
Dear anh chị em,
Làm ơn giúp mình:
- Khi thông tin trên cột " street/No" có thông tin là một trong các phường thuộc quận " Bắc Từ Liêm" thì xuất hiện giá trị " Bắc Từ liêm" bên cột " Province/ District"
- Danh sách các phường thuộc quận " Bắc Từ Liêm" có trong sheet " Danh sách quận huyện"
Cám ơn các bạn nhiều.

Các bạn download file theo link nà giúp:
Liên kết: https://docs.google.com/spreadsheets/d/15BMmnIct7Lb0u94etJ06W4kAjQ7x333_/edit#gid=0 Liên kết: https://docs.google.com/spreadsheets/d/15BMmnIct7Lb0u94etJ06W4kAjQ7x333_/edit?usp=sharing&ouid=115793869167711299589&rtpof=true&sd=true
 
Lần chỉnh sửa cuối:
Chỉ làm cho Bắc từ liêm hả bạn?
 
Upvote 0
Sao chủ bài đăng không giả lập file & đưa trực tiếp lên diễn đàn nhỉ, khó lắm sao?
 
Upvote 0
Tôi thấy bạn muốn lọc từ xã/phường ra huyện/thị(quận) và thấy có một số điểm sau:
1/Dữ liệu không được chuẩn cho lắm. chỗ thì có phường, xã ..., chỗ thì chung chung.
2/ Cùng một địa danh nên sẽ xuất hiện tình trạng là tên, tổ, khối phố, hay tên huyện/quận/thị sẽ trùng vói tên xã/phường.===> vậy lấy tên nào.
3/ Nếu chỉ làm cho một số huyện thị/quận kể trên thì nên xóa bớt dữ liệu không cần thiết để nhẹ file. Hơn 300000 dòng.
4/ file của bạn kiểu gì mà cứ thi thoảng là treo máy,( chạy quay tròn tròn cả tiếng không ra).Hay là máy tôi chậm có vấn đề.
Làm cho các quận , huyện sau:

Bắc Từ Liêm, Nam Từ Liêm, Huyện Đan Phượng, Huyện Hoài Đức, Huyện Thạch Thất
mặc dù bạn đã cảm ơn tôi....ở topic trước, nhưng tôi vẫn muốn chinh phục bài này nên đã ....
Tôi đã mất cả một buổi chiều để xử lý, nhưng kết quả là chạy code trên file tải về (qua file bạn gửi qua ggSheet) thì không được mà phải copy/paste value sang file của topic trước để test thử.
Chúc bạn thành công.
 

File đính kèm

  • Screenshot (21).png
    Screenshot (21).png
    459.7 KB · Đọc: 9
Upvote 0
Tôi đã làm cho Bắc Từ Liêm. Không rà soát kết quả có đúng hay không miễn sao có tên 1 phường của quận là được. Nhưng sau đó chủ thớt lại nói làm cho các quận huyện khác mà không mở máy tính nữa nên tôi chưa làm. Nếu vẫn chưa có ai giúp thì tôi sẽ tiếp tục việc đang làm dở kia.

@HUONGHCKT bạn bấm vào link rồi vào menu File, sẽ có chức năng lưu lại với các định dạng khác nhau. Tôi làm việc với file không gặp tình trạng đơ như bạn.
 
Upvote 0
@HUONGHCKT bạn bấm vào link rồi vào menu File, sẽ có chức năng lưu lại với các định dạng khác nhau. Tôi làm việc với file không gặp tình trạng đơ như bạn.
Tôi cũng tải về máy tôi và làm thử. Kiểm tra thấy có khoảng trên 180000 ngàn dòng của cột A Sh Data trùng nhau. cứ chạy code là đơ máy luôn.
Bài này của chủ thớt đã đăng trước đây rồi, khoảng 1 ngày gì đó. Tôi cũng đã làm giúp cho bạn ấy ở dữ liệu ít (chỉ có xác định quận Bắc Từ Liêm), xong không hiểu sao bạn đó không dùng được. Và bài đăng trước đây không biết có phải bị xóa rồi không?
 
Upvote 0
Code tìm quận huyện. Chỗ Mỹ Đình II thì không tìm được nghe, nhập sai ráng chịu, lẽ ra là Mỹ Đình 2.
Rich (BB code):
Sub DienQuan_Huyen()
Dim arr, aDtrc, aRsl
Dim i&, j&, k&, tmr#
tmr = Timer()
arr = Sheet1.Range("B2:B" & Sheet1.Range("B" & Rows.Count).End(xlUp).Row)
aDtrc = Sheet2.Range("B2:E" & Sheet2.Range("B" & Rows.Count).End(xlUp).Row)
ReDim aRsl(1 To UBound(arr), 1 To 1)
For i = 1 To UBound(arr)
    For j = 1 To UBound(aDtrc)
        If InStr(1, arr(i, 1), aDtrc(j, 2)) Or InStr(1, arr(i, 1), aDtrc(j, 4)) Then
            aRsl(i, 1) = aDtrc(j, 1): Exit For
        End If
    Next
Next
Sheet1.Range("G2").Resize(UBound(arr), 1) = aRsl
MsgBox "Xong!" & vbNewLine & Timer() - tmr & " giay."
End Sub
 
Upvote 0
Code tìm quận huyện. Chỗ Mỹ Đình II thì không tìm được nghe, nhập sai ráng chịu, lẽ ra là Mỹ Đình 2.
Rich (BB code):
Sub DienQuan_Huyen()
Dim arr, aDtrc, aRsl
Dim i&, j&, k&, tmr#
tmr = Timer()
arr = Sheet1.Range("B2:B" & Sheet1.Range("B" & Rows.Count).End(xlUp).Row)
aDtrc = Sheet2.Range("B2:E" & Sheet2.Range("B" & Rows.Count).End(xlUp).Row)
ReDim aRsl(1 To UBound(arr), 1 To 1)
For i = 1 To UBound(arr)
    For j = 1 To UBound(aDtrc)
        If InStr(1, arr(i, 1), aDtrc(j, 2)) Or InStr(1, arr(i, 1), aDtrc(j, 4)) Then
            aRsl(i, 1) = aDtrc(j, 1): Exit For
        End If
    Next
Next
Sheet1.Range("G2").Resize(UBound(arr), 1) = aRsl
MsgBox "Xong!" & vbNewLine & Timer() - tmr & " giay."
End Sub
Tôi rất mong ngóng anh chị nào đó giải bài này vói tốc độ nhanh (cho dữ liệu hàng gần 200000 bản dòng -đã remove duplicate, chưa remove duplicate là khoảng gần 400000 dòng)
Code của anh chạy rất nhanh, tuy nhiên là khi InStr lại chỉ cho ra kết quả là chỉ có quận Nam Từ Liêm thôi mà đáng ra phải là tên các quận huyện khác.
Của tôi làm cũng ra nhưng máy chạy 10000 dòng mất gần 20 phút.
 

File đính kèm

  • Screenshot (22).png
    Screenshot (22).png
    353.8 KB · Đọc: 10
Upvote 0
Tôi rất mong ngóng anh chị nào đó giải bài này vói tốc độ nhanh (cho dữ liệu hàng gần 200000 bản dòng -đã remove duplicate, chưa remove duplicate là khoảng gần 400000 dòng)
Code của anh chạy rất nhanh, tuy nhiên là khi InStr lại chỉ cho ra kết quả là chỉ có quận Nam Từ Liêm thôi mà đáng ra phải là tên các quận huyện khác.
Của tôi làm cũng ra nhưng máy chạy 10000 dòng mất gần 20 phút.
Giỡn bạn! Bạn xem đủ 5 quận huyện và trên 13 ngàn dòng kết quả nè
1634366970458.png
 
Upvote 0
1634371301952.png


Kiểu này bảng địa chỉ phải chuẩn hoá lại thì mới mượt mà được.
 
Upvote 0
Tôi rất mong ngóng anh chị nào đó giải bài này vói tốc độ nhanh (cho dữ liệu hàng gần 200000 bản dòng -đã remove duplicate, chưa remove duplicate là khoảng gần 400000 dòng)
Code của anh chạy rất nhanh, tuy nhiên là khi InStr lại chỉ cho ra kết quả là chỉ có quận Nam Từ Liêm thôi mà đáng ra phải là tên các quận huyện khác.
Của tôi làm cũng ra nhưng máy chạy 10000 dòng mất gần 20 phút.
Dùng autofilter cho bài này có lẽ là tốc độ cải thiện đáng kể đấy bạn
 
Upvote 0
Dùng autofilter cho bài này có lẽ là tốc độ cải thiện đáng kể đấy bạn
Khi trước tôi làm theo quy trình là dùng dic để lấy tên xã phường add vào dic, sau đó dùng phương thức Find từng dòng của sh Data đối chiếu trong Dic nếu thấy thì lấy tên quân huyện thị tương ứng. Như đã nói là chạy 10000 dòng mất gần 20 phút. Sau này có code của anh Maika8008 thấy anh ấy dùng InStr và tôi thay find = InStr code của tôi và vẫn theo quy trình trên chạy 190000 dòng ra kết quả là trên 600 dòng thỏa, thời gian hết trên 18 giây. Tuy nhiên kết quả chính xác thì cũng vẫn là điều phải bàn. Ví dụ Khi tìm thấy từ Phùng trong chuỗi Phố Phùng Hưng, Phố Phan Đình Phùng thì code vẫn cho ra là Đan Phượng (Đan phượng cũng có Thị Trấn tên là Phùng mà, và một số địa danh khác nữa...)
Bài này có thể nói là dữ liệu rất không chuẩn, không biết AutoFilter có được không?
Bài đã được tự động gộp:

Giỡn bạn! Bạn xem đủ 5 quận huyện và trên 13 ngàn dòng kết quả nè
View attachment 267809
Trời ơi! thật thế sao. Có thể tôi nhầm khi không lọc hết dữ liệu kết quả. nhưng có lẽ máy tính tôi ậm ẹ cũng lên. Dù sao thì tôi cũng nợ mọi người và nhất là anh Maika8008 một lời xin lỗi chân thành.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi cũng tải về máy tôi và làm thử. Kiểm tra thấy có khoảng trên 180000 ngàn dòng của cột A Sh Data trùng nhau. cứ chạy code là đơ máy luôn.
Bài này của chủ thớt đã đăng trước đây rồi, khoảng 1 ngày gì đó. Tôi cũng đã làm giúp cho bạn ấy ở dữ liệu ít (chỉ có xác định quận Bắc Từ Liêm), xong không hiểu sao bạn đó không dùng được. Và bài đăng trước đây không biết có phải bị xóa rồi khô

Tôi cũng tải về máy tôi và làm thử. Kiểm tra thấy có khoảng trên 180000 ngàn dòng của cột A Sh Data trùng nhau. cứ chạy code là đơ máy luôn.
Bài này của chủ thớt đã đăng trước đây rồi, khoảng 1 ngày gì đó. Tôi cũng đã làm giúp cho bạn ấy ở dữ liệu ít (chỉ có xác định quận Bắc Từ Liêm), xong không hiểu sao bạn đó không dùng được. Và bài đăng trước đây không biết có phải bị xóa rồi không?
Tôi đã làm theo công thức của bạn nhưng ko thành công. Sở dĩ có bài trước đó vì tôi sợ file nặng, nên chỉ trích ra 1 ít dữ liệu thôi. Cám ơn bạn nhiều
Bài đã được tự động gộp:

Khi trước tôi làm theo quy trình là dùng dic để lấy tên xã phường add vào dic, sau đó dùng phương thức Find từng dòng của sh Data đối chiếu trong Dic nếu thấy thì lấy tên quân huyện thị tương ứng. Như đã nói là chạy 10000 dòng mất gần 20 phút. Sau này có code của anh Maika8008 thấy anh ấy dùng InStr và tôi thay find = InStr code của tôi và vẫn theo quy trình trên chạy 190000 dòng ra kết quả là trên 600 dòng thỏa, thời gian hết trên 18 giây. Tuy nhiên kết quả chính xác thì cũng vẫn là điều phải bàn. Ví dụ Khi tìm thấy từ Phùng trong chuỗi Phố Phùng Hưng, Phố Phan Đình Phùng thì code vẫn cho ra là Đan Phượng (Đan phượng cũng có Thị Trấn tên là Phùng mà, và một số địa danh khác nữa...)
Bài này có thể nói là dữ liệu rất không chuẩn, không biết AutoFilter có được không?
Bài đã được tự động gộp:


Trời ơi! thật thế sao. Có thể tôi nhầm khi không lọc hết dữ liệu kết quả. nhưng có lẽ máy tính tôi ậm ẹ cũng lên. Dù sao thì tôi cũng nợ mọi người và nhất là anh Maika8008 một lời xin lỗi chân thành.
Cám ơn bạn, dữ liệu trong file của mình lộn xộn thật, Mình vừa check lại thì thấy thật là khó khăn khi làm. Thôi vậy, cám ơn các bạn
 
Upvote 0
Web KT
Back
Top Bottom