Cập nhật từ Bảng Phụ sang Bảng Chính dạng Mảng

Liên hệ QC

Phúc Lộc Thọ

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
12/8/22
Bài viết
32
Được thích
4
Em xin chào đaị gia Đình. Em cần đang viết 1 đoạn code để cập nhật từ bảng con sang bảng chính, Nhưng dữ liệu em nhiều quá code chạy khá lâu. nay em nhờ anh chị sửa giúp em sao cho nhanh nhất có thể ( Dữ liệu bảng chính của em tầm 20.000 dòng ). Em xin chân thành cảm ơn ạ

1661528438932.png

Sub capnhat()
On Error Resume Next
Dim i As Long, y As Long
For i = 6 To 20
For y = 6 To 20000

If UCase(Range("i" & i)) = UCase(Range("b" & y)) Then
Range("f" & y).Value = Range("l" & i).Value
End If

Next y
Next i

End Sub
 

File đính kèm

  • cap nhat.xlsb
    17.3 KB · Đọc: 18
Giải pháp
PHP:
Sub DuaVoMang()
 Dim Tmr As Double, J As Long, W As Integer, Rws As Long
 Dim Arr(), aDL()
 
 Tmr = Timer()
 Rws = [B6].End(xlDown).Row:
 Arr() = Range("B6:B" & Rws).Value
 ReDim aKQ(1 To Rws, 1 To 1) As Double
 W = [I9999].End(xlUp).Row
 aDL() = Range("I6").Resize(W, 4).Value
 For J = 1 To UBound(Arr())
    For W = 1 To UBound(aDL())
        If UCase$(Arr(J, 1)) = UCase$(aDL(W, 1)) Then
            aKQ(J, 1) = aDL(W, 4)
        End If
    Next W
 Next J
 [f6].Resize(Rws).Value = aKQ()
 [P3].Value = Timer() - Tmr
End Sub
PHP:
Sub DuaVoMang()
 Dim Tmr As Double, J As Long, W As Integer, Rws As Long
 Dim Arr(), aDL()
 
 Tmr = Timer()
 Rws = [B6].End(xlDown).Row:
 Arr() = Range("B6:B" & Rws).Value
 ReDim aKQ(1 To Rws, 1 To 1) As Double
 W = [I9999].End(xlUp).Row
 aDL() = Range("I6").Resize(W, 4).Value
 For J = 1 To UBound(Arr())
    For W = 1 To UBound(aDL())
        If UCase$(Arr(J, 1)) = UCase$(aDL(W, 1)) Then
            aKQ(J, 1) = aDL(W, 4)
        End If
    Next W
 Next J
 [f6].Resize(Rws).Value = aKQ()
 [P3].Value = Timer() - Tmr
End Sub
 
Upvote 0
Giải pháp
PHP:
Sub DuaVoMang()
 Dim Tmr As Double, J As Long, W As Integer, Rws As Long
 Dim Arr(), aDL()
 
 Tmr = Timer()
 Rws = [B6].End(xlDown).Row:
 Arr() = Range("B6:B" & Rws).Value
 ReDim aKQ(1 To Rws, 1 To 1) As Double
 W = [I9999].End(xlUp).Row
 aDL() = Range("I6").Resize(W, 4).Value
 For J = 1 To UBound(Arr())
    For W = 1 To UBound(aDL())
        If UCase$(Arr(J, 1)) = UCase$(aDL(W, 1)) Then
            aKQ(J, 1) = aDL(W, 4)
        End If
    Next W
 Next J
 [f6].Resize(Rws).Value = aKQ()
 [P3].Value = Timer() - Tmr
End Sub
Code chạy nhanh như 1 cơn gió. Quá đúng ý mình. Chân thành cảm ơn bạn !
 
Upvote 0
Chú ơi. Cho cháu hỏi cái Ucase$. Cái dấu $ kia có ý nghĩa gì thế ạ?
Chú hoặc mọi người có thể giải thích giúp cháu với không?
Ucase$ khác Ucase chỗ nào ạ?
Hàm có $ là hàm thượng cổ. Một số phiên bản BASIC cổ có luật tên biến và hàm chuỗi sẽ kết thúc bằng $.
Theo kiểu mới, và có ảnh hưởng chiều hướng lập trình hướng đối tượng thì người ta bỏ đi những ràng buộc kiểu dữ liệu. MS viết lại, bỏ $ đi.
Người ta cho rằng hàm viết lại chỉ là gói hàm cũ trong cái vỏ mới, cho nên gọi hàm theo tên cũ nhanh hơn.

Nhắc lại, nếu bạn muốn viết code chạy nhanh hơn vài phần triệu giây thì nên tìm tòi lục các cách viết cũ, gọi các hàm cũ.
Nhưng nếu bạn muốn code đồng bộ, theo chiều hướng mới thì đừng rớ tới những kiểu cổ này.
 
Upvote 0
Hàm có $ là hàm thượng cổ. Một số phiên bản BASIC cổ có luật tên biến và hàm chuỗi sẽ kết thúc bằng $.
Theo kiểu mới, và có ảnh hưởng chiều hướng lập trình hướng đối tượng thì người ta bỏ đi những ràng buộc kiểu dữ liệu. MS viết lại, bỏ $ đi.
Người ta cho rằng hàm viết lại chỉ là gói hàm cũ trong cái vỏ mới, cho nên gọi hàm theo tên cũ nhanh hơn.

Nhắc lại, nếu bạn muốn viết code chạy nhanh hơn vài phần triệu giây thì nên tìm tòi lục các cách viết cũ, gọi các hàm cũ.
Nhưng nếu bạn muốn code đồng bộ, theo chiều hướng mới thì đừng rớ tới những kiểu cổ này.
Cám ơn chú ạ. Tại tự nhiên nhìn thấy cái lạ lạ. Chưa dùng bao giờ nên cháu muốn hỏi để hiểu và sử dụng cho đúng cách.
 
Upvote 0
Với dữ liệu lớn code trên chạy khá chậm, chịu khó thêm vài lệnh code sẽ nhanh hơn. Nếu muốn nhanh hơn gió thì tim hiểu dictionary
Hàm VLookup chạy trong vòng 1/2 giây (20000 dòng) nếu giá trị cần so sánh là A, B, C (VLookup căn bản không phân biệt hoa thường). Nếu giá trị là chuỗi dài tới 20 ký tự thì chạy trong vòng 1 giây. Trên nữa tôi chưa thử, chưa thể nói.
Dữ liệu khoảng 40000 dòng thì nên dùng Data Model. VLookup không vấn đề gì với Data Model cả triệu dòng.
.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom