Nhờ các bác tối ưu hóa code trong sheet2 với ạ. Em cảm ơn ạ

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Hoale85

Thành viên mới
Tham gia
2/8/24
Bài viết
48
Được thích
1
Em nhờ các bác tối ưu hóa code VBA trong sheet2 với ạ. Code chạy chậm quá ạ. Em cảm ơn ạ!. Em gửi file đính kèm ạ
 

File đính kèm

  • Book4.xlsm
    1.1 MB · Đọc: 12
Em nhờ các bác tối ưu hộ em với ạ. Em cảm ơn ạ
 
Bạn muốn xử lý macro nào
 
Em nhờ các bác tối ưu hóa code VBA trong sheet2 với ạ. Code chạy chậm quá ạ. Em cảm ơn ạ!. Em gửi file đính kèm ạ
Không xem hết code nhưng Theo tôi thì
1/việc đầu tiên là đưa 2 cái Call tinh_123 và Call abc_123 ra ngoài vòng lặp.
2/ đưa vùng G2:H946 thành 1 mảng và xử lý trên mảng được kết quả đưa vào 1 mảng kết quả sau hết mới gán xuống sheet.
 
Em nhờ các bác tối ưu
Không xem hết code nhưng Theo tôi thì
1/việc đầu tiên là đưa 2 cái Call tinh_123 và Call abc_123 ra ngoài vòng lặp.
2/ đưa vùng G2:H946 thành 1 mảng và xử lý trên mảng được kết quả đưa vào 1 mảng kết quả sau hết mới gán xuống sheet.
Mình không dám lọ mọ mấy vụ nhờ "Tối ưu", làm xong có ai đó có code chạy nhanh hơn thì code của mình thành "Tối um".
 
Kết quả mong muốn của bạn sau khi chạy macro trên là thế nào?
Kết quả mong muốn của em là bên sheet "data" bác ạ. Vì em muốn lấy danh sách quận, tỉnh theo địa chỉ ở sheet data. Nhưng vì địa chỉ viết lung tung quá, nên em dùng sql để tìm từ khóa trong đó. sau đó dùng vòng lặp theo cột ở bên sheet2 ạ.
Bài đã được tự động gộp:

Kết quả mong muốn của bạn sau khi chạy macro trên là thế nào?
1724730267630.png
Là 2 cột này bác ạ. Em cảm ơn ạ
Bài đã được tự động gộp:

Chắc là code nặng do code Tinh_123: vì ở sheet data em đang để hàm vlookup, sau đó dùng code tinh_123 để copy chết những ô có dữ liệu. Giờ khắc phục code đó như thế nào ạ.!
 
Lần chỉnh sửa cuối:
Kết quả mong muốn của em là bên sheet "data" bác ạ. Vì em muốn lấy danh sách quận, tỉnh theo địa chỉ ở sheet data. Nhưng vì địa chỉ viết lung tung quá, nên em dùng sql để tìm từ khóa trong đó. sau đó dùng vòng lặp theo cột ở bên sheet2 ạ.
Bài đã được tự động gộp:


View attachment 303470
Là 2 cột này bác ạ. Em cảm ơn ạ
Bài đã được tự động gộp:

Chắc là code nặng do code Tinh_123: vì ở sheet data em đang để hàm vlookup, sau đó dùng code tinh_123 để copy chết những ô có dữ liệu. Giờ khắc phục code đó như thế nào ạ.!
Có thể do cột G, H tính toán trực tiếp trên sheet quá nhiều lần.
 
Có thể do cột G, H tính toán trực tiếp trên sheet quá nhiều lần.
dạ vâng, cột G, H tính copy chết nhiều quá. Có cách nào khắc phục không ạ. Vì mục đích của em là những dữ liệu nào ở cột G, H có dữ liệu thì copy xong paste value lại ạ. Vì cột G, H đang dùng Vlookup từ sheet2 ạ
 
Kết quả mong muốn của em là bên sheet "data" bác ạ. Vì em muốn lấy danh sách quận, tỉnh theo địa chỉ ở sheet data. Nhưng vì địa chỉ viết lung tung quá, nên em dùng sql để tìm từ khóa trong đó. sau đó dùng vòng lặp theo cột ở bên sheet2 ạ.
Nghĩa là: Dữ liệu ban đầu tại sheet data, từ cột A -> F. Bạn mong muốn lọc ra địa chỉ: Quận, Tỉnh/ thành phố của từng dòng?
 
Nghĩa là: Dữ liệu ban đầu tại sheet data, từ cột A -> F. Bạn mong muốn lọc ra địa chỉ: Quận, Tỉnh/ thành phố của từng dòng?
Dạ vâng, Nhưng vì địa chỉ viết lung tung quá, nên em định lấy danh sách ở bản đồ việt Nam, xong dùng sql để tìm ạ
 
Bạn thử kiểm tra xem thế nào, những dòng không có dấu chấm, dấu phẩy thì tự chỉnh nhé.
Em cảm ơn anh. Nhưng kết quả thì chưa được đúng ý lắm ạ: Vì dữ liệu địa chỉ lộn xộn quá, nên khi chạy code ra: cùng 1 huyện, xã nhưng lại tồn tại nhiều: Ví dụ (Tp Pleiku, TP. Pleiku). Các mã khác cũng tương tự ạ. Chính vì thế, bài toán lúc đầu em Định dùng sheet2 là danh mục huyện, tỉnh trong cột U,V để dò tìm và đồng nhất. Sau đó hiện ra những địa chỉ lỗi, hoặc viết sai chính tả, lúc đó em mới sửa.
 
Bài dạng này cũng có gần chục người đăng bài hỏi rồi.

Cái này muốn giải được hoàn hảo thì phải dùng kỹ thuật tạo thư viện ngược + chút chịu thương chịu khó nữa.
 
Bài dạng này cũng có gần chục người đăng bài hỏi rồi.

Cái này muốn giải được hoàn hảo thì phải dùng kỹ thuật tạo thư viện ngược + chút chịu thương chịu khó nữa.
dạ bác, đúng là em đang muốn dựa vào cột u, v ( kiểu thư viện ngược đó ạ).
 
@Hoale85
Bài này chỉ sửa lại code bài 1 để làm rõ hơn cách tính nên vẫn giữ nguyên sql như cũ.
Bạn xem file đính kèm để hiệu chỉnh lại cho phù hợp
Mã:
Option Explicit

Sub A_0_xxx()
Dim ArrID
Dim sql As String
Dim cn As Object, rs As Object
Dim Tam
Dim Kq()
Dim DicTH As Object
Dim i, j, k

'ket noi
Set cn = CreateObject("ADODB.connection")
Set rs = CreateObject("ADODB.recordset")
With cn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Chr(39) & ThisWorkbook.FullName & Chr(39) & ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"
.Open
End With

'khai bao mang ket qua & dicTH.
'DicTH: key = Stt trong sheet data. Item = so thu tu dong trong danh sach quan huyen can tra cuu ( sheet2.Rang("C6:D35"))
With Sheet1
    k = .Range("A" & Rows.Count).End(xlUp).Row
    ReDim Kq(1 To k - 1, 1 To 2)
End With
Set DicTH = CreateObject("Scripting.Dictionary")

'trich loc theo danh sach yeu cau
With Sheet2
    ArrID = .Range("C6", Sheet2.Range("D6").End(xlDown))
    
    For i = 1 To UBound(ArrID)
        k = .Range("A6") & ArrID(i, 1) & .Range("A7") & ArrID(i, 2)
        sql = Right(k, Len(k) - Len("mi_sql")) & "%'"
        
        rs.Open sql, cn
        
        Tam = rs.GetRows '<-- lay ket qua ve mang. ket qua tra ve theo tung cot
        For j = 0 To UBound(Tam, 2)
            k = Tam(0, j) 'k = Stt khach hang theo sheet data
            DicTH(k) = i 'key = stt khach hang, item = chi so dong quan huyen tinh toan ( i )
        Next j
        
        rs.Close
    Next i
End With

'huy ket noi
cn.Close
Set cn = Nothing
Set rs = Nothing

'tra quan huyen theo cot Stt cua Sheet data
Tam = Sheet1.Range("A2", Sheet1.Range("A2").End(xlDown))
For i = 1 To UBound(Tam)
    If DicTH.exists(Tam(i, 1)) Then
        k = DicTH(Tam(i, 1))
        Kq(i, 1) = ArrID(k, 1)
        Kq(i, 2) = ArrID(k, 2)
    End If
Next i

'dien ket qua xuong sheet
With Sheet1
    .Range("G2").Resize(UBound(Kq), UBound(Kq, 2)).Clear
    .Range("G2").Resize(UBound(Kq), UBound(Kq, 2)) = Kq
End With

MsgBox "Ket thuc"
End Sub
 

File đính kèm

  • Hoale85.xlsb
    753.3 KB · Đọc: 5
Web KT

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

Back
Top Bottom