File chạy quá chậm khi sử dụng hàm sumif cho hơn 1000 item (1 người xem)

Liên hệ QC

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

dangphongpro2010

Thành viên mới
Tham gia
19/12/13
Bài viết
33
Được thích
4
Giới tính
Nam
Chào mọi người,
Mọi người có thể giúp mình xem có cách gì giúp file mình chạy nhanh hơn ko nhe. mình chỉ minh họa 2 item trong file đính kèm thôi, nếu để trên 1000 item thì cột Tính Tổng chạy cực kì chậm. Cảm ơn mọi người.
 

File đính kèm

Chào mọi người,
Mọi người có thể giúp mình xem có cách gì giúp file mình chạy nhanh hơn ko nhe. mình chỉ minh họa 2 item trong file đính kèm thôi, nếu để trên 1000 item thì cột Tính Tổng chạy cực kì chậm. Cảm ơn mọi người.
Chỉ có cách duy nhất là dùng VBA thôi.
 
Bạn có thể giúp mình viết đoạn VBA đó được không, cảm ơn bạn nhiều.
Bạn thử đoạn code này
PHP:
Sub abc()
Dim nguon(), kq(), i, ii
nguon = Range([A2], [E65536].End(3)).Value
ReDim kq(1 To UBound(nguon), 1 To 2)
For i = 1 To UBound(nguon)
    If IsNumeric(nguon(i, 5)) Then
        kq(i, 1) = (nguon(i, 2) * nguon(i, 4)) * (1 + nguon(i, 5) / 100)
        For ii = 1 To UBound(nguon)
            If nguon(ii, 3) = nguon(i, 3) Then
                kq(i, 2) = kq(i, 2) + kq(i, 1)
            End If
        Next
    End If
Next
[F2].Resize(i - 1, 2) = kq
End Sub
 
Lần chỉnh sửa cuối:
Chào mọi người,
Mọi người có thể giúp mình xem có cách gì giúp file mình chạy nhanh hơn ko nhe. mình chỉ minh họa 2 item trong file đính kèm thôi, nếu để trên 1000 item thì cột Tính Tổng chạy cực kì chậm. Cảm ơn mọi người.

Bạn nghiên cứu PivotTable xem. Tôi nghĩ nó có thể áp dụng cho bài này được đấy
 
Bạn thử đoạn code này
PHP:
Sub abc()
Dim nguon(), kq(), i, ii
nguon = Range([A2], [E65536].End(3)).Value
ReDim kq(1 To UBound(nguon), 1 To 2)
For i = 1 To UBound(nguon)
    If IsNumeric(nguon(i, 5)) Then
        kq(i, 1) = (nguon(i, 2) * nguon(i, 4)) * (1 + nguon(i, 5) / 100)
        For ii = 1 To UBound(nguon)
            If nguon(ii, 3) = nguon(i, 3) Then
                kq(i, 2) = kq(i, 2) + kq(i, 1)
            End If
        Next
    End If
Next
[F2].Resize(i - 1, 2) = kq
End Sub
Úi da!
Nếu là 1000 dòng thì code phải chạy 1000 cái i nhân với 1000 cái ii ?
Dùng Dic thì cho nó chạy 2 lần 1000 là xong.
[GPECODE=vb]Public Sub GPE_ABC()
Dim sArr(), dArr(), Dic As Object, Tem As Variant, I As Long
Set Dic = CreateObject("Scripting.Dictionary")
sArr = Range([B3], [B1048576].End(xlUp)).Resize(, 5).Value2
ReDim dArr(1 To UBound(sArr, 1), 1 To 1)
For I = 1 To UBound(sArr, 1)
If IsNumeric(sArr(I, 1)) Then
Tem = sArr(I, 2)
If Not Dic.Exists(Tem) Then
Dic.Add Tem, sArr(I, 5)
Else
Dic.Item(Tem) = Dic.Item(Tem) + sArr(I, 5)
End If
End If
Next I
For I = 1 To UBound(sArr, 1)
Tem = sArr(I, 2)
If Dic.Exists(Tem) Then dArr(I, 1) = Dic.Item(Tem)
Next I
[H3].Resize(UBound(sArr, 1)) = dArr
Set Dic = Nothing
End Sub[/GPECODE]
Chỉ tính cho cột Tổng như công thức của cột G thôi à nghe.
Nếu siêng thì cho nó tính thêm cột F cho bớt công thức.
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn thử đoạn code này
PHP:
Sub abc()
Dim nguon(), kq(), i, ii
nguon = Range([A2], [E65536].End(3)).Value
ReDim kq(1 To UBound(nguon), 1 To 2)
For i = 1 To UBound(nguon)
    If IsNumeric(nguon(i, 5)) Then
        kq(i, 1) = (nguon(i, 2) * nguon(i, 4)) * (1 + nguon(i, 5) / 100)
        For ii = 1 To UBound(nguon)
            If nguon(ii, 3) = nguon(i, 3) Then
                kq(i, 2) = kq(i, 2) + kq(i, 1)
            End If
        Next
    End If
Next
[F2].Resize(i - 1, 2) = kq
End Sub

Bạn QuangHai1969 ơi, mình muốn là khi mình nhập số lượng vào Cột Qty thì tất cả số liệu sẽ thay đổi theo, như vậy có thể được không ?
 
Úi da!
Nếu là 1000 dòng thì code phải chạy 1000 cái i nhân với 1000 cái ii ?
Dùng Dic thì cho nó chạy 2 lần 1000 là xong.
[GPECODE=vb]Public Sub GPE_ABC()
Dim sArr(), dArr(), Dic As Object, Tem As Variant, I As Long
Set Dic = CreateObject("Scripting.Dictionary")
sArr = Range([B3], [B1048576].End(xlUp)).Resize(, 5).Value2
ReDim dArr(1 To UBound(sArr, 1), 1 To 1)
For I = 1 To UBound(sArr, 1)
If IsNumeric(sArr(I, 1)) Then
Tem = sArr(I, 2)
If Not Dic.Exists(Tem) Then
Dic.Add Tem, sArr(I, 5)
Else
Dic.Item(Tem) = Dic.Item(Tem) + sArr(I, 5)
End If
End If
Next I
For I = 1 To UBound(sArr, 1)
Tem = sArr(I, 2)
If Dic.Exists(Tem) Then dArr(I, 1) = Dic.Item(Tem)
Next I
[H3].Resize(UBound(sArr, 1)) = dArr
Set Dic = Nothing
End Sub[/GPECODE]
Chỉ tính cho cột Tổng như công thức của cột G thôi à nghe.
Nếu siêng thì cho nó tính thêm cột F cho bớt công thức.

cảm ơn bạn Ba Tê nhe, đúng là VBA, mình nghe nói áp dụng VBA là dc nên đầu tư nghiên cứu cả tháng, nhìn code các bạn viết thấy mình giống như giọt nước trong biển, không hiểu gi hết, chắc phải tầm sư học đạo thôi. hi vọng có người thu nhận.
 
Bạn QuangHai1969 ơi, mình muốn là khi mình nhập số lượng vào Cột Qty thì tất cả số liệu sẽ thay đổi theo, như vậy có thể được không ?
Bạn muốn mỗi lần nhập vào 1 ô trong cột B thì sẽ có kết quả ở cột G ?
Như vậy thì có Hàm SumIf() mà bác Bill làm sẵn rồi đó. Mỗi lần nhập thì nó sẽ duyệt tất cả số dòng mà bạn đang có để ra kết quả cho bạn, cuối cùng cũng là ... chậm "Rùa".
Muốn nhanh gọn nhẹ nhàng thì dùng VBA, cứ nhập thoải mái xong rồi bấm nút 1 phát có kết quả ngay, không có công thức trong từng ô thì file sẽ nhẹ dung lượng hơn rất nhiều.
 

File đính kèm

Bạn muốn mỗi lần nhập vào 1 ô trong cột B thì sẽ có kết quả ở cột G ?
Như vậy thì có Hàm SumIf() mà bác Bill làm sẵn rồi đó. Mỗi lần nhập thì nó sẽ duyệt tất cả số dòng mà bạn đang có để ra kết quả cho bạn, cuối cùng cũng là ... chậm "Rùa".
Muốn nhanh gọn nhẹ nhàng thì dùng VBA, cứ nhập thoải mái xong rồi bấm nút 1 phát có kết quả ngay, không có công thức trong từng ô thì file sẽ nhẹ dung lượng hơn rất nhiều.

Hữu dụng vô cùng, cảm ơn bạn Ba Tê nhiều nhe..
 
Web KT

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

Back
Top Bottom