Không xem hết code nhưng Theo tôi thì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 ạ
Em nhờ các bác tối ưu
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".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.
hihi, cũng là một cách để rèn luyện mà bác. Em cảm ơn bácMì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?View attachment 303469
Em đang muốn tối ưu code này ở sheet2 anh ạ. Code này chạy chậm quá bác ạ. chờ mất 15 phút ạ.
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 ạ.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 bạn sau khi chạy macro trên là 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.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 ạ.!
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 ạCó thể do cột G, H tính toán trực tiếp trên sheet quá nhiều lần.
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?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 ạ.
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 ạ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?
Đến tận bài #12 mới hiểu chủ bài định làm gì.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é.địa chỉ viết lung tung quá
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ạ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é.
dạ bác, đúng là em đang muốn dựa vào cột u, v ( kiểu thư viện ngược đó ạ).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.
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