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
cach khac phuc Ham sumif chay qua cham cho hon 1000 item.xlsx
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.
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
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.
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.
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.
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 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.
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.