Xin Giúp về code thay thế hàm sumifs (1 người xem)

Liên hệ QC

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

chucuoi92

Thành viên lười biếng
Tham gia
11/9/09
Bài viết
850
Được thích
488
Giới tính
Nam
Nghề nghiệp
Chăn trâu
Em nhờ các anh chị viết giúp em đoạn code thay thế cho hàm sumifs
trong file ,em đã làm bằng công thức cho các cột nhập ở sheet "KIEMSOAT".
Các cột "nhap" này cộng dồn theo ngày từ sheet "nhap".
 

File đính kèm

Không có ai giúp mình nhỉ ,thật là buồn.
 
Upvote 0
thôi có hàm sumifs là được rồi. Nhưng kể ra bác nào giúp cái. em thì chịu. Nhiều lúc chuyển sang office 2003 là bó tay luôn
 
Upvote 0
ý bạn là sử dụng hàm sumif (2003)với 2 điều kiện trở lên (giống sumifs của 2010) phải ko?
mình sử dụng hàm sumproduct trong excel 2003 thay cho sumifs trong 2010.
nếu đúng bạn dùng thử
 
Upvote 0
ý bạn là sử dụng hàm sumif (2003)với 2 điều kiện trở lên (giống sumifs của 2010) phải ko?
mình sử dụng hàm sumproduct trong excel 2003 thay cho sumifs trong 2010.
nếu đúng bạn dùng thử
Không phải vậy!
ý mình là muốn chuyển sang code để chạy cho nhanh thôi.
bảng của mình có 300 ròng và 10 cột có công thức sumifs
nếu dữ liệu nhập vào khoảng vài ngàn ròng thì vẫn ok, nhưng dữ liệu thực sự record từng ngày và dòng dã nhiều tháng nên dùng công thức chỉ là giải pháp tức thời.
 
Upvote 0
Bài này của mình không ai giúp được sao?
Mình đã dùng for.. next sau đó gán biến vào WorksheetFunction nhưng khi chạy thì con chuột cứ biến thành cái đồng hồ cát nên hơi bực mình.
Mình đưa code này lên xem ai giúp được không nhé:
PHP:
Option Explicit
Private Sub Worksheet_Activate()
Dim i As Double, j As Long, l As Long, k As Long, ngay As Date, t As Single
Application.ScreenUpdating = False
Application.Calculation = xlManual
  t = Timer
  l = Sheet1.Range("B1048576").End(xlUp).Row
  With Sheet2
    For j = 4 To 300
     For k = 5 To 32 Step 3
     If Cells(2, k + 4) > 0 Then
        ngay = Cells(2, k + 4)
        Else
        ngay = 402133
     End If
     If Cells(2, k + 1) > 0 Then
      i = WorksheetFunction.SumIfs(Sheet1.Range("E5:E" & l), Sheet1.Range("B5:B" & l), Sheet2.Range("B" & j), Sheet1.Range("A5:A" & l), "<" & ngay)
    Sheet2.Cells(j, k) = i
    'Else
    'Sheet2.Cells(j, k) = ""
    End If
     Next k
  Next j
 End With
 Application.ScreenUpdating = True
 Application.Calculation = xlAutomatic
 MsgBox Timer - t
End Sub
 
Upvote 0
Híc, Chú Cuội này ở cung Trăng hay Mặt đất vậy ta
Code này hổng có khó nhưng bắt người muốn giúp Cuội phải đọc hàm (của Cuội ) ==> hiểu ==> nắm bắt vấn đề ( của Cuội) => rồi viết code thay thế thì hơi...ngồ ngộ
Không cần cái "Sum-íp- sum- iếc" của Cuội, muốn làm gì thì Cuội cứ viết sao cho anh em hiểu Cuội muốn.........làm cái quái gì thì sẽ ....có code ngay thôi
(Nếu đã viết code thế SumIf mà lại WorksheetFunction.SumIfs thì thà cứ SumIfs cho đỡ "dzách" việc)
Híc
 
Upvote 0
Híc, Chú Cuội này ở cung Trăng hay Mặt đất vậy ta
Code này hổng có khó nhưng bắt người muốn giúp Cuội phải đọc hàm (của Cuội ) ==> hiểu ==> nắm bắt vấn đề ( của Cuội) => rồi viết code thay thế thì hơi...ngồ ngộ
Không cần cái "Sum-íp- sum- iếc" của Cuội, muốn làm gì thì Cuội cứ viết sao cho anh em hiểu Cuội muốn.........làm cái quái gì thì sẽ ....có code ngay thôi
(Nếu đã viết code thế SumIf mà lại WorksheetFunction.SumIfs thì thà cứ SumIfs cho đỡ "dzách" việc)
Híc
Cám ơn concogia đã quan tâm!
bài của mình chỉ là cộng dồn theo điều kiện mã và ngày.
ví dụ như ở cột E ở sheet KIEMSOAT
cộng theo mã và ngày tháng nhỏ hơn ngày ở cell I2, nếu như ở cell I2 mà không có ngày thì chỉ cần cộng theo mã, và điều kiện để thực hiện phép tính ở cột E này là phải có ngày ở cột F. Các cột sau cũng tương tự.
rất mong concogia giúp đỡ, có thêm phần giải thích ở code để mình học hỏi.
 
Upvote 0
Không thì bạn làm thử 2 cột phụ để xét điều kiện rồi dùm sumif cộng lại xem có nhanh hơn không?
 
Upvote 0
Không thì bạn làm thử 2 cột phụ để xét điều kiện rồi dùm sumif cộng lại xem có nhanh hơn không?

Bài này mình đã làm cả bằng công thức và code, chỉ có điều code "lởm" quá nên mình muốn mọi người giúp viết code nào đó chạy cho nhanh.
 
Upvote 0
Híc, Chú Cuội này ở cung Trăng hay Mặt đất vậy ta
Code này hổng có khó nhưng bắt người muốn giúp Cuội phải đọc hàm (của Cuội ) ==> hiểu ==> nắm bắt vấn đề ( của Cuội) => rồi viết code thay thế thì hơi...ngồ ngộ
Không cần cái "Sum-íp- sum- iếc" của Cuội, muốn làm gì thì Cuội cứ viết sao cho anh em hiểu Cuội muốn.........làm cái quái gì thì sẽ ....có code ngay thôi
(Nếu đã viết code thế SumIf mà lại WorksheetFunction.SumIfs thì thà cứ SumIfs cho đỡ "dzách" việc)
Híc
Mình đã diễn giải rồi sao không thấy anh cogia ra tay nhỉ???
 
Upvote 0
Mình đã diễn giải rồi sao không thấy anh cogia ra tay nhỉ???
Hihi, bi giờ mình thử nói lại xem trúng hông há
Cụ thể ở cell [E4]
- Nếu [F2] không có dữ liệu thì đếch có làm gì hết
- Nếu [F2] có dữ liệu & cell [I2] có dữ liệu thì dò tìm trong vùng [A5:E54] ở sheet NHAP tính tổng của mã A-01 có thời gian trước ngày 16 tháng 11 năm 2012 ( giá trị trong cell [I2]
- Nếu [F2] có giá trị & [I2] cóc có cái quái gì trong đó thì dò tìm trong vùng [A5:E54] ở sheet NHAP tính tổng của mã A-01 mà cóc cần giới hạn thời gian
Tương tự qua các cột [H, K, N.....]
Nếu ( lại nếu) đúng như thế thì thử xem trong file ( bấm Ctrl + W để chạy code )
Nếu Ok thì tốt còn "tèo" thì ......nhờ Ba Tê làm giúp_ anh ấy đang ế độ nên thèm có bài để giải lắm
Thân
Híc
 

File đính kèm

Upvote 0
Chỉ một câu với anh concogia
Rất tuyệt!

Anh Bate có thể cho em xem thêm code của anh không!
Em muốn được học hỏi các anh!

cám ơn hai anh đã quan tâm!
 
Upvote 0
Hihi, bi giờ mình thử nói lại xem trúng hông há
Cụ thể ở cell [E4]
- Nếu [F2] không có dữ liệu thì đếch có làm gì hết......
Híc

Anh xem phần giải thích giúp em nhé!
có một số chỗ em không hiểu.
Mã:
ic Sub NhapA()
    Dim d As Object, Vung As Range, Ngay As Range, nDau, nCuoi, I As Long, J As Long, DuLieu, Cll '
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào các bạn,
Nhờ các bạn giúp đỡ tôi trường hợp lấy dữ liệu đơn hàng và tồn kho thay thế cho hàm sumifs trong file đính kèm với ạ.
 

File đính kèm

Upvote 0
Xin chào các bạn,
Nhờ các bạn giúp đỡ tôi trường hợp lấy dữ liệu đơn hàng và tồn kho thay thế cho hàm sumifs trong file đính kèm với ạ.
Bạn thử code này nhé.
Mã:
Sub tinhtong()
    Dim arr, i As Long, j As Long, lr As Long, a As Long, dic As Object, data, lc As Long, dk As String, b As Long, lr1 As Long, c As Long
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("CHECK")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         lc = .Cells(2, Columns.Count).End(xlToLeft).Column
         If lr < 3 Or lc < 3 Then Exit Sub
         .Range("C3").Resize(lr - 2, lc - 2).ClearContents
         arr = .Range("b2").Resize(lr - 1, lc - 1).Value
         For i = 3 To UBound(arr, 2)
             b = CLng(arr(1, i))
             dic.Item(b) = i
         Next i
         For i = 2 To UBound(arr)
             dk = arr(i, 1)
             dic.Item(dk) = i
         Next i
    End With
    With Sheets("SODER")
         lr1 = .Range("A" & Rows.Count).End(xlUp).Row
         data = .Range("A2:C" & lr1).Value
         For i = 1 To UBound(data)
             dk = data(i, 1)
             a = dic.Item(dk)
             If a Then
                b = quydoi(data(i, 2))
                c = dic.Item(b)
                If c Then
                   arr(a, c) = arr(a, c) + data(i, 3)
                End If
            End If
        Next i
   End With
   With Sheets("STOCK")
         lr1 = .Range("A" & Rows.Count).End(xlUp).Row
         data = .Range("A2:C" & lr1).Value
         For i = 1 To UBound(data)
              dk = data(i, 1)
             a = dic.Item(dk)
             If a Then
                arr(a, 2) = arr(a, 2) + data(i, 3)
             End If
         Next i
   End With
   With Sheets("CHECK")
       .Range("b2").Resize(lr - 1, lc - 1).Value = arr
   End With
End Sub
Function quydoi(ByVal dk As String) As Long
        quydoi = CLng(DateSerial(Left(dk, 4), Mid(dk, 5, 2), Mid(dk, 7, 2)))
End Function
 
Upvote 0
Bạn thử code này nhé.
Mã:
Sub tinhtong()
    Dim arr, i As Long, j As Long, lr As Long, a As Long, dic As Object, data, lc As Long, dk As String, b As Long, lr1 As Long, c As Long
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("CHECK")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         lc = .Cells(2, Columns.Count).End(xlToLeft).Column
         If lr < 3 Or lc < 3 Then Exit Sub
         .Range("C3").Resize(lr - 2, lc - 2).ClearContents
         arr = .Range("b2").Resize(lr - 1, lc - 1).Value
         For i = 3 To UBound(arr, 2)
             b = CLng(arr(1, i))
             dic.Item(b) = i
         Next i
         For i = 2 To UBound(arr)
             dk = arr(i, 1)
             dic.Item(dk) = i
         Next i
    End With
    With Sheets("SODER")
         lr1 = .Range("A" & Rows.Count).End(xlUp).Row
         data = .Range("A2:C" & lr1).Value
         For i = 1 To UBound(data)
             dk = data(i, 1)
             a = dic.Item(dk)
             If a Then
                b = quydoi(data(i, 2))
                c = dic.Item(b)
                If c Then
                   arr(a, c) = arr(a, c) + data(i, 3)
                End If
            End If
        Next i
   End With
   With Sheets("STOCK")
         lr1 = .Range("A" & Rows.Count).End(xlUp).Row
         data = .Range("A2:C" & lr1).Value
         For i = 1 To UBound(data)
              dk = data(i, 1)
             a = dic.Item(dk)
             If a Then
                arr(a, 2) = arr(a, 2) + data(i, 3)
             End If
         Next i
   End With
   With Sheets("CHECK")
       .Range("b2").Resize(lr - 1, lc - 1).Value = arr
   End With
End Sub
Function quydoi(ByVal dk As String) As Long
        quydoi = CLng(DateSerial(Left(dk, 4), Mid(dk, 5, 2), Mid(dk, 7, 2)))
End Function

Xin chào snow25
Cảm ơn bạn đã giúp đỡ, nhìn code dữ thấy ớn quá :D
------
T_T Híc thực sự xin lỗi bạn và mọi người rất nhiều, OT có bổ sung thêm 1 sheet "PRODUCTION" để thuận tiện nhất việc theo dõi.
Nhờ bạn và mọi người code them giúp vùng "AI3:BL371" trong sheet check ạ.
 

File đính kèm

Upvote 0
Xin chào snow25
Cảm ơn bạn đã giúp đỡ, nhìn code dữ thấy ớn quá :D
------
T_T Híc thực sự xin lỗi bạn và mọi người rất nhiều, OT có bổ sung thêm 1 sheet "PRODUCTION" để thuận tiện nhất việc theo dõi.
Nhờ bạn và mọi người code them giúp vùng "AI3:BL371" trong sheet check ạ.
Kiểm tra code
Mã:
Sub CongTheoDieuKien()
  Dim sArr(), Res(), Res2(), Res3(), Dic As Object, iKey As String, Ngay
  Dim i As Long, iRow As Long, j As Long, jCol As Long
  Dim eRow As Long, sRow As Long, sCol2 As Long, sCol3 As Long
  Dim Rng As Range, rngRes2 As Range, rngRes3 As Range
  Const Ngay_Res2 As String = "D2:AG2"
  Const Ngay_Res3 As String = "AI2:BL2"
 
  Set Dic = CreateObject("scripting.dictionary")
  With Sheets("CHECK")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow < 3 Then MsgBox ("Khong co du lieu!"): Exit Sub
    sArr = .Range("B3:B" & eRow).Value
    sRow = UBound(sArr)
    
    ReDim Res(1 To sRow, 1 To 1)
    For i = 1 To sRow
      iKey = sArr(i, 1)
      If Dic.exists(iKey) = False Then Dic.Add iKey, i
    Next i
    
    Set Rng = .Range(Ngay_Res2)
    Set rngRes2 = Rng(1, 1).Offset(1)
    sCol2 = Rng.Columns.Count
    ReDim Res2(1 To sRow, 1 To sCol2)
    For j = 1 To sCol2
      iKey = "Res2" & Rng(1, j).Value2
      If Dic.exists(iKey) = False Then Dic.Add iKey, j
    Next j
    
    Set Rng = .Range(Ngay_Res3)
    Set rngRes3 = Rng(1, 1).Offset(1)
    sCol3 = Rng.Columns.Count
    ReDim Res3(1 To sRow, 1 To sCol3)
    For j = 1 To sCol2
      iKey = "Res3" & Rng(1, j).Value2
      If Dic.exists(iKey) = False Then Dic.Add iKey, j
    Next j
    Set Rng = Nothing
  End With
 
  With Sheets("STOCK")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    sArr = .Range("A2:C" & eRow).Value
    n = UBound(sArr)
    For i = 1 To n
      If sArr(i, 3) > 0 Then
        iRow = Dic.Item(sArr(i, 1))
        If iRow > 0 Then Res(iRow, 1) = Res(iRow, 1) + sArr(i, 3)
      End If
    Next i
  End With
 
  With Sheets("SODER")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    sArr = .Range("A2:C" & eRow).Value
    n = UBound(sArr)
    For i = 1 To n
      iRow = Dic.Item(sArr(i, 1))
      Ngay = sArr(i, 2)
      Ngay = CLng(DateSerial(Left(Ngay, 4), Mid(Ngay, 5, 2), Mid(Ngay, 7, 2)))
      jCol = Dic.Item("Res2" & Ngay)
      If iRow > 0 And jCol > 0 Then Res2(iRow, jCol) = Res2(iRow, jCol) + sArr(i, 3)
    Next i
  End With
    
  With Sheets("PRODUCTION")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    sArr = .Range("A2:D" & eRow).Value
    n = UBound(sArr)
    For i = 1 To n
      iRow = Dic.Item(sArr(i, 1))
      Ngay = sArr(i, 4)
      Ngay = CLng(DateSerial(Mid(Ngay, 7, 4), Mid(Ngay, 1, 2), Mid(Ngay, 4, 2)))
      jCol = Dic.Item("Res3" & Ngay)
      If iRow > 0 And jCol > 0 Then Res3(iRow, jCol) = Res3(iRow, jCol) + CLng(sArr(i, 3))
    Next i
  End With

   With Sheets("CHECK")
    .Range("C3").Resize(sRow, 1).Value = Res
    rngRes2.Resize(sRow, sCol2).Value = Res2
    rngRes3.Resize(sRow, sCol3).Value = Res3
   End With
   Set Dic = Nothing: Set rngRes2 = Nothing: Set rngRes3 = Nothing
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom