Lọc theo mã số (1 người xem)

Liên hệ QC

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

Rùa Con 1080

Thành Viên Sao Chép 2
Tham gia
4/5/16
Bài viết
351
Được thích
47
Giới tính
Nữ
Chào mọi người, em có file excel này, mong mọi người giúp viết code để lọc theo mã số, theo tháng, theo năm ah!
Trong file có chi tiết (sheet Xem)
 

File đính kèm

Em ví dụ là nếu chọn tháng 1 năm 2016 thì tốn đầu của các mã số là không có (vì chỉ nhập từ tháng 1 năm 2016) và nhập trong tháng 1 năm 2016 chỉ có mã số bacdan, daycll, nhancl và tìm xuất của các mã số này trong tháng 1 năm 2016.
nếu chọn tháng 1 năm 2017 thí tồn đầu phải tính tổng nhập của các mã số trong năm 2016 trừ cho tống xuất của các mã số trong năm 2016 ra tốn đấu của các mã số trong tháng 1 năm 2017 cộng cho nhập của các mã số trừ xuát của các mã số ra tốn cuối.
nói dài dòng chắc các AC chưa hiểu, để em xem file của anh dazkangel đã.
 
Upvote 0
Cám ơn Anh dazkangel, nhưng file của em dữ lieu nhiều, mong anh giúp viết code.
Trong file của anh còn lọc thiếu, như tháng 3 năm 2016 còn có xuất "Cữ các Loại" mã số "cuccll"
là 2000, và anh viết cho tìm cả năm 2017 luôn.
 
Upvote 0
Chào mọi người, em có file excel này, mong mọi người giúp viết code để lọc theo mã số, theo tháng, theo năm ah!
Trong file có chi tiết (sheet Xem)
Bạn xem thử. Cái Tồn đầu kỳ mình không biết làm :D
Mã:
Sub tonghop()
    Dim sArr(), tArr(), dArr(), I As Long, K As Long
    Dim Dic As Object, Tem As String, R As Long
    Dim Thang As Long, Nam As Long
Thang = Sheet3.Range("B2"): Nam = Sheet3.Range("D2")
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    tArr = .Range("A3", .Range("F65535").End(3)).Value
End With
For I = 1 To UBound(tArr)
    Tem = Month(tArr(I, 1)) & Year(tArr(I, 1)) & tArr(I, 5)
    Dic.Item(Tem) = I
Next I
With Sheet2
    sArr = .Range("A3", .Range("F65535").End(3)).Value
End With
ReDim dArr(1 To UBound(sArr), 1 To 5)
For I = 1 To UBound(sArr)
    If Month(sArr(I, 1)) & Year(sArr(I, 1)) = Thang & Nam Then
        Tem = Month(sArr(I, 1)) & Year(sArr(I, 1)) & sArr(I, 5)
        R = Dic.Item(Tem)
        If R Then
            K = K + 1
            dArr(K, 1) = tArr(R, 5)
            dArr(K, 3) = tArr(R, 6)
            dArr(K, 4) = sArr(R, 6)
            dArr(K, 5) = dArr(K, 2) + dArr(K, 3) - dArr(K, 4)
        End If
    End If
Next I
With Sheet3
    If K Then
        .Range("A5:E1000").ClearContents
        .Range("A5").Resize(K, 5) = dArr
    End If
End With
Set Dic = Nothing
End Sub
 
Upvote 0
Cám ơn bạn PacificPR, cái tồn đầu kỳ là như thế này
nếu chọn tháng 3 năm 2016 thì tồn đầu kỳ là tồn cuối của tháng 2 năm 2016.
nếu chọn tháng 1 năm 2017 thì tồn đầu kỳ là tốn cuối của tháng 12 năm 2016.
Mong bạn giúp.
 
Upvote 0
Cám ơn Anh dazkangel, nhưng file của em dữ lieu nhiều, mong anh giúp viết code.
Trong file của anh còn lọc thiếu, như tháng 3 năm 2016 còn có xuất "Cữ các Loại" mã số "cuccll"
là 2000, và anh viết cho tìm cả năm 2017 luôn.
thật là thiếu sót về việc năm còn "Cữ các Loại" mã số "cuccll" là 2000 là thế nào nhỉ bạn ??
 

File đính kèm

Upvote 0
Cám ơn Anh dazkangel, nhưng file của em dữ lieu nhiều, mong anh giúp viết code.
Trong file của anh còn lọc thiếu, như tháng 3 năm 2016 còn có xuất "Cữ các Loại" mã số "cuccll"
là 2000, và anh viết cho tìm cả năm 2017 luôn.
à mình không biết về VBA tiếc thật, chào bạn.
 
Upvote 0
Cám ơn Bạn dazkangel, trong file của mình co tất cả 5 loại mã số.nếu bạn đưa ra hết 5 loại đó thì sẽ có "cuccll" = 2000 vào tháng 3 năm 2016.
Mà file bạn là lọc tổng nhập và xuất trong tháng ,năm, nhưng không có"Tồn đầu" của từng mã số theo tháng, năm.
 
Upvote 0
Cám ơn Bạn dazkangel, trong file của mình co tất cả 5 loại mã số.nếu bạn đưa ra hết 5 loại đó thì sẽ có "cuccll" = 2000 vào tháng 3 năm 2016.
Mà file bạn là lọc tổng nhập và xuất trong tháng ,năm, nhưng không có"Tồn đầu" của từng mã số theo tháng, năm.
thì chỉ cần nhập mã vào kéo công thức xuống là được hết.
không có định hướng tồn thì chịu, dữ kiện như vậy chắc phải đợi 1 ai đó chuyên về cái này chỉ bạn thôi.
tôi có mường tượng là tổng nhập từ tháng chọn đến trước đó - tổng xuất nhỏ hơn hoặc bằng tháng chọn là ra số tồn đầu nhưng không biết đúng không.
theo các loại dữ liệu như vậy họ thường có cột phụ cộng trừ cả năm luôn rồi sau đó chọn tháng giống như 1 dữ liệu pivote chứ chọn tháng trực tiếp không biết tồn hàng tháng thế nào thì tính kiểu gì.
 
Upvote 0
Cám ơn Bạn dazkangel, trong file của mình co tất cả 5 loại mã số.nếu bạn đưa ra hết 5 loại đó thì sẽ có "cuccll" = 2000 vào tháng 3 năm 2016.
Mà file bạn là lọc tổng nhập và xuất trong tháng ,năm, nhưng không có"Tồn đầu" của từng mã số theo tháng, năm.
Tức là bạn muốn :
- Chỉ xem những mã có nhập xuất trong Tháng/Năm được chọn?
- Chỉ xem luôn giá trị tồn của những mã này trước Tháng/Năm chọn?
- Các mã không Nhập/Xuất trong Tháng/Năm chọn thì không quan tâm tới?
 

File đính kèm

Upvote 0
Tức là bạn muốn :
- Chỉ xem những mã có nhập xuất trong Tháng/Năm được chọn?
- Chỉ xem luôn giá trị tồn của những mã này trước Tháng/Năm chọn?
- Các mã không Nhập/Xuất trong Tháng/Năm chọn thì không quan tâm tới?
Code này của anh chưa đúng thì phải, nguyên tắc là tồn cuối tháng trước=tồn đầu tháng sau, anh chạy tháng 6,7 thử xem, tồn cuối t06<> tồn đầu t07
 
Upvote 0
Bài này làm công thức dễ hơn đấy, và cũng không chậm lắm!!!
mình không hiểu rõ tồn khó nó tính thế nào nếu gom cả mảng của tất cả các tháng trước đó thì -_-
chủ yếu là cảm thấy thiết kế không hợp ly.
với ý mình nói là bạn học VBA nhanh quá, chứ không đề cập đến tốc độ công thức :D
 
Upvote 0
mình không hiểu rõ tồn khó nó tính thế nào nếu gom cả mảng của tất cả các tháng trước đó thì -_-
chủ yếu là cảm thấy thiết kế không hợp ly.
với ý mình nói là bạn học VBA nhanh quá, chứ không đề cập đến tốc độ công thức :D
Tồn kho tính dễ mà, nhập xuất thì sumif trong giai đoạn đó, còn tồn đầu thì sumif nhỏ hơn giai đoạn đó lấy nhập -xuất là ra thôi, tính toán số thì không khó dùng sumif là được, sợ chỗ lấy mã số hàng hóa không trùng hơi nặng với dữ liệu nhiều thôi.
Bài náy thiết kế gom 1 bảng thì thuận tiện cho VBA hơn, chứ công thức vẫn vậy.
VBA chỉ biết hơi hơi thôi, :D:D:D!!
 
Upvote 0
Em cám ơn Thầy Ba tê, anh HieuCD, bạn eke_rula nhiều!
 
Upvote 0
Tồn kho tính dễ mà, nhập xuất thì sumif trong giai đoạn đó, còn tồn đầu thì sumif nhỏ hơn giai đoạn đó lấy nhập -xuất là ra thôi, tính toán số thì không khó dùng sumif là được, sợ chỗ lấy mã số hàng hóa không trùng hơi nặng với dữ liệu nhiều thôi.
Bài náy thiết kế gom 1 bảng thì thuận tiện cho VBA hơn, chứ công thức vẫn vậy.
VBA chỉ biết hơi hơi thôi, :D:D:D!!
thì đấy tính tổng trước tháng chọn
 
Upvote 0
Em xin đưa file mới (code của anh HieuCD), mong mọi người viết code để các cell nào bang 0.00 và rỗng có giá trị là (-) going định dạng của Excell.
 

File đính kèm

Upvote 0
Em xin đưa file mới (code của anh HieuCD), mong mọi người viết code để các cell nào bang 0.00 và rỗng có giá trị là (-) going định dạng của Excell.
Mình chả biết làm thế nào chế đại 1 dòng macro vào, nhưng ô rỗng vẫn là rỗng nha bạn.
 

File đính kèm

Upvote 0
Em xin đưa file mới (code của anh HieuCD), mong mọi người viết code để các cell nào bang 0.00 và rỗng có giá trị là (-) going định dạng của Excell.
gán giá trị 0 cho các ô trống, dùng format dạng số
Mã:
Sub tonghop()
    Dim InArr(), OutArr(), Arr(), i As Long, ik As Long, k As Long
    Dim Dic As Object, Tmp
    Dim Thang As Long, Nam As Long
With Sheets("Xem")
  Thang = .Range("B2").Value
  Nam = .Range("D2").Value
End With
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Nhap")
    InArr = .Range("A3", .Range("F65535").End(3)).Value2
End With
With Sheets("Xuat")
    OutArr = .Range("A3", .Range("F65535").End(3)).Value2
End With
ReDim Arr(1 To UBound(InArr) + UBound(OutArr), 1 To 5)
For i = 1 To UBound(InArr)
  If (Month(InArr(i, 1)) <= Thang And Year(InArr(i, 1)) = Nam) Or Year(InArr(i, 1)) < Nam Then
    Tmp = InArr(i, 5)
    If Not Dic.exists(Tmp) Then
      k = k + 1
      Dic.Add Tmp, k
      Arr(k, 1) = Tmp:    Arr(k, 2) = 0
      Arr(k, 3) = 0:      Arr(k, 4) = 0
    End If
    ik = Dic(Tmp)
    If Month(InArr(i, 1)) = Thang And Year(InArr(i, 1)) = Nam Then
      Arr(ik, 3) = Arr(ik, 3) + InArr(i, 6)
      Arr(ik, 5) = Arr(ik, 5) + InArr(i, 6)
    End If
    If (Month(InArr(i, 1)) < Thang And Year(InArr(i, 1)) = Nam) Or Year(InArr(i, 1)) < Nam Then
      Arr(ik, 2) = Arr(ik, 2) + InArr(i, 6)
      Arr(ik, 5) = Arr(ik, 5) + InArr(i, 6)
    End If
  End If
Next i
For i = 1 To UBound(OutArr)
  If (Month(OutArr(i, 1)) <= Thang And Year(OutArr(i, 1)) = Nam) Or Year(OutArr(i, 1)) < Nam Then
      Tmp = OutArr(i, 5)
      If Not Dic.exists(Tmp) Then
        k = k + 1
        Dic.Add Tmp, k
        Arr(k, 1) = Tmp:    Arr(k, 2) = 0
        Arr(k, 3) = 0:      Arr(k, 4) = 0
      End If
      ik = Dic(Tmp)
    If Month(OutArr(i, 1)) = Thang And Year(OutArr(i, 1)) = Nam Then
      Arr(ik, 4) = Arr(ik, 4) + OutArr(i, 6)
      Arr(ik, 5) = Arr(ik, 5) - OutArr(i, 6)
    End If
    If (Month(OutArr(i, 1)) < Thang And Year(OutArr(i, 1)) = Nam) Or Year(OutArr(i, 1)) < Nam Then
      Arr(ik, 2) = Arr(ik, 2) - OutArr(i, 6)
      Arr(ik, 5) = Arr(ik, 5) - OutArr(i, 6)
    End If
  End If
Next i
With Sheets("Xem")
    .Range("A5:E1000").Clear
    If k Then
        .Range("A5").Resize(k, 5) = Arr
        .Range("B5").Resize(k, 4).NumberFormat = " #,##0.00 ; [red](#,##0.00) ; - "
        .Range("A5").Resize(k, 5).Borders.LineStyle = 1
    End If
End With
Set Dic = Nothing
End Sub
 
Upvote 0
gán giá trị 0 cho các ô trống, dùng format dạng số
Mã:
Sub tonghop()
    Dim InArr(), OutArr(), Arr(), i As Long, ik As Long, k As Long
    Dim Dic As Object, Tmp
    Dim Thang As Long, Nam As Long
With Sheets("Xem")
  Thang = .Range("B2").Value
  Nam = .Range("D2").Value
End With
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Nhap")
    InArr = .Range("A3", .Range("F65535").End(3)).Value2
End With
With Sheets("Xuat")
    OutArr = .Range("A3", .Range("F65535").End(3)).Value2
End With
ReDim Arr(1 To UBound(InArr) + UBound(OutArr), 1 To 5)
For i = 1 To UBound(InArr)
  If (Month(InArr(i, 1)) <= Thang And Year(InArr(i, 1)) = Nam) Or Year(InArr(i, 1)) < Nam Then
    Tmp = InArr(i, 5)
    If Not Dic.exists(Tmp) Then
      k = k + 1
      Dic.Add Tmp, k
      Arr(k, 1) = Tmp:    Arr(k, 2) = 0
      Arr(k, 3) = 0:      Arr(k, 4) = 0
    End If
    ik = Dic(Tmp)
    If Month(InArr(i, 1)) = Thang And Year(InArr(i, 1)) = Nam Then
      Arr(ik, 3) = Arr(ik, 3) + InArr(i, 6)
      Arr(ik, 5) = Arr(ik, 5) + InArr(i, 6)
    End If
    If (Month(InArr(i, 1)) < Thang And Year(InArr(i, 1)) = Nam) Or Year(InArr(i, 1)) < Nam Then
      Arr(ik, 2) = Arr(ik, 2) + InArr(i, 6)
      Arr(ik, 5) = Arr(ik, 5) + InArr(i, 6)
    End If
  End If
Next i
For i = 1 To UBound(OutArr)
  If (Month(OutArr(i, 1)) <= Thang And Year(OutArr(i, 1)) = Nam) Or Year(OutArr(i, 1)) < Nam Then
      Tmp = OutArr(i, 5)
      If Not Dic.exists(Tmp) Then
        k = k + 1
        Dic.Add Tmp, k
        Arr(k, 1) = Tmp:    Arr(k, 2) = 0
        Arr(k, 3) = 0:      Arr(k, 4) = 0
      End If
      ik = Dic(Tmp)
    If Month(OutArr(i, 1)) = Thang And Year(OutArr(i, 1)) = Nam Then
      Arr(ik, 4) = Arr(ik, 4) + OutArr(i, 6)
      Arr(ik, 5) = Arr(ik, 5) - OutArr(i, 6)
    End If
    If (Month(OutArr(i, 1)) < Thang And Year(OutArr(i, 1)) = Nam) Or Year(OutArr(i, 1)) < Nam Then
      Arr(ik, 2) = Arr(ik, 2) - OutArr(i, 6)
      Arr(ik, 5) = Arr(ik, 5) - OutArr(i, 6)
    End If
  End If
Next i
With Sheets("Xem")
    .Range("A5:E1000").Clear
    If k Then
        .Range("A5").Resize(k, 5) = Arr
        .Range("B5").Resize(k, 4).NumberFormat = " #,##0.00 ; [red](#,##0.00) ; - "
        .Range("A5").Resize(k, 5).Borders.LineStyle = 1
    End If
End With
Set Dic = Nothing
End Sub
Anh Hiếu cho em hỏi tí, Anh hay dùng mấy hàm này Tarr(), Darr(), Sarr(), vậy mấy hàm này có ý nghĩa gì vậy Anh? Anh có thể nêu ví dụ minh họa được không?
Em cảm ơn Anh.
 
Upvote 0
Anh Hiếu cho em hỏi tí, Anh hay dùng mấy hàm này Tarr(), Darr(), Sarr(), vậy mấy hàm này có ý nghĩa gì vậy Anh? Anh có thể nêu ví dụ minh họa được không?
Em cảm ơn Anh.

- Đó không phải là hàm, mà là khai báo kiểu dữ liệu.
Dạng đầy đủ là:
Dim Darr() as string-->Khai báo một biến darr() là một mảng động, dữ liệu chứa trong mảng là kiểu string.
 
Upvote 0
- Đó không phải là hàm, mà là khai báo kiểu dữ liệu.
Dạng đầy đủ là:
Dim Darr() as string-->Khai báo một biến darr() là một mảng động, dữ liệu chứa trong mảng là kiểu string.
Dạ giờ em mới vỡ lẽ nhiều điều.

Em cảm ơn Anh.
 
Upvote 0
Em chào các AC trong GPE, file này anh HieuCD giúp em lọc theo mã số của những mã s nào có Nhập , Xuất, giờ Em xin các AC (Anh Hiếu nữa) chỉnh code để liệt kê ra tất cả các mã số (có 5 mã số) và xin giúp em sheet"BCThang " cũng giống sheet"Xem"
Em cám ơn.
 

File đính kèm

Upvote 0
Em chào các AC trong GPE, file này anh HieuCD giúp em lọc theo mã số của những mã s nào có Nhập , Xuất, giờ Em xin các AC (Anh Hiếu nữa) chỉnh code để liệt kê ra tất cả các mã số (có 5 mã số) và xin giúp em sheet"BCThang " cũng giống sheet"Xem"
Em cám ơn.
Code ai người ấy sửa nhé.
Tôi viết code cho sheet BCThang:
PHP:
Public Sub BC_Thang()
Dim Dic As Object, sArr(), dArr(1 To 1000, 1 To 8), I As Long, J As Long, K As Long, R As Long, Rws As Long, NgayDau As Long, NgayCuoi As Long, Tem As String
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("BCThang")
    NgayDau = DateSerial(.Range("G2"), .Range("E2"), 1)
    NgayCuoi = DateSerial(.Range("G2"), .Range("E2") + 1, 0)
End With
With Sheets("Nhap")
    sArr = .Range("A3", .Range("A3").End(xlDown)).Resize(, 6).Value
    R = UBound(sArr)
    For I = 1 To R
        Tem = sArr(I, 3) 'sArr(I, 5)'
        If Not Dic.Exists(Tem) Then
            K = K + 1: Dic.Add Tem, K
            dArr(K, 1) = K: dArr(K, 2) = sArr(I, 3): dArr(K, 3) = sArr(I, 4): dArr(K, 4) = sArr(I, 5)
        End If
        Rws = Dic.Item(Tem)
        If sArr(I, 1) < NgayDau Then
            dArr(Rws, 5) = dArr(Rws, 5) + sArr(I, 6)
        ElseIf sArr(I, 1) <= NgayCuoi Then
            dArr(Rws, 6) = dArr(Rws, 6) + sArr(I, 6)
        End If
    Next I
End With
With Sheets("Xuat")
    sArr = .Range("A3", .Range("A3").End(xlDown)).Resize(, 6).Value
    R = UBound(sArr)
    For I = 1 To R
        Tem = sArr(I, 3) 'sArr(I, 5)'
        If Not Dic.Exists(Tem) Then
            K = K + 1: Dic.Add Tem, K
            dArr(K, 1) = K: dArr(K, 2) = sArr(I, 3): dArr(K, 3) = sArr(I, 4): dArr(K, 4) = sArr(I, 5)
        End If
        Rws = Dic.Item(Tem)
        If sArr(I, 1) < NgayDau Then
            dArr(Rws, 5) = dArr(Rws, 5) - sArr(I, 6)
        ElseIf sArr(I, 1) <= NgayCuoi Then
            dArr(Rws, 7) = dArr(Rws, 7) + sArr(I, 6)
        End If
    Next I
End With
For I = 1 To K
    dArr(I, 8) = dArr(I, 5) + dArr(I, 6) - dArr(I, 7)
Next I
With Sheets("BCThang")
    .Range("A5:H1000").ClearContents
    .Range("A5:H5").Resize(K) = dArr
End With
End Sub
Code trên, dòng :
PHP:
Tem = sArr(I, 3) '--------->  sArr(I, 5)
Nếu bạn muốn liệt kê tất cả Tên phụ tùng thì Tem=sArr(I, 3)
Nếu bạn muốn liệt kê tất cả Mã số thì Tem=sArr(I, 5)
 
Upvote 0
Cám Ơn Thầy Ba Tê, em thấy hình Thầy trong SN GPE 11, Thầy cũng đứng tuổi rồi, em thì còn trẻ , nhưng sao "Ngu" thế
 
Upvote 0
Sao laptop của em cứ Copy mã "PHP" là lỗi, không chạy code được, còn mã Code thì lại được.
Không biết ai có cách giải quyết giúp em.
 
Upvote 0

File đính kèm

Upvote 0
Ý của em là khi Thầy đưa code lên dạng "code" thì em copy code dán vào không sao(code chạy), còn nếu Thầy đưa code lên dạng"PHP" thì em copy code vào thì code có nhiều dòng màu đỏ và code không chạy.
Ah mà Thầy ơi, trong file của Thầy, Thầy chỉnh dùm cho có Border và cell nào không có số (rổng) thì có dấu gạch ngang.[/code]
 
Upvote 0
Em bôi đen->nhấp chuột phải->copy->paste vào ModuleUntitled.png
 
Upvote 0
Còn như code của anh Hiếu là "Mã" thì em copy chép vào không bị lỗi.
Ah Thầy Ba Tê ơi chổ Border em đã làm được, chỉ còn chổ cell rổng hoặc bằng 0 thì là dấu gạch ngang mong Thầy giúp.
 
Upvote 0
Ý của em là khi Thầy đưa code lên dạng "code" thì em copy code dán vào không sao(code chạy), còn nếu Thầy đưa code lên dạng"PHP" thì em copy code vào thì code có nhiều dòng màu đỏ và code không chạy.
- Hổng tin!
- Dấu gạch ngang là Format từ số 0 thành dấu "-", chứ trong ô vẫn có giá trị 0.
 

File đính kèm

Upvote 0
Cám Ơn Thầy!
Em để ý mấy lần rồi, nếu ai đưa code lên dạng "PHP" thì em cứ Copy/Paste là bị lỗi (có nhiều dòng màu đỏ) và không chạy.
Như hình em đưa lên bài #38.
 
Upvote 0
Mong anh Hiếu liệt kê hết các mã số có trong danh sách dùm emah.
Code anh là chỉ liệt kê những mã só nao2co1nha6p, xuất.
 
Upvote 0
Mong anh Hiếu liệt kê hết các mã số có trong danh sách dùm emah.
Code anh là chỉ liệt kê những mã só nao2co1nha6p, xuất.
Chỉnh lại code Xem
Mã:
Sub tonghop()
    Dim InArr(), OutArr(), Maso(), Arr() As Double, i As Long, ik As Long, k As Long
    Dim Dic As Object, Tmp
    Dim Thang As Long, Nam As Long
With Sheets("Xem")
  Thang = .Range("B2").Value
  Nam = .Range("D2").Value
End With
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Nhap")
    InArr = .Range("A3", .Range("F65535").End(3)).Value2
End With
With Sheets("Xuat")
    OutArr = .Range("A3", .Range("F65535").End(3)).Value2
End With
ReDim Maso(1 To UBound(InArr) + UBound(OutArr), 1 To 1)
ReDim Arr(1 To UBound(InArr) + UBound(OutArr), 1 To 4)
For i = 1 To UBound(InArr)
  Tmp = InArr(i, 5)
  If Not Dic.exists(Tmp) Then
    k = k + 1:      Dic.Add Tmp, k:    Maso(k, 1) = Tmp
  End If
  ik = Dic(Tmp)
  If Month(InArr(i, 1)) = Thang And Year(InArr(i, 1)) = Nam Then
    Arr(ik, 2) = Arr(ik, 2) + InArr(i, 6)
  ElseIf (Month(InArr(i, 1)) < Thang And Year(InArr(i, 1)) = Nam) Or Year(InArr(i, 1)) < Nam Then
    Arr(ik, 1) = Arr(ik, 1) + InArr(i, 6)
  End If
Next i
For i = 1 To UBound(OutArr)
  Tmp = OutArr(i, 5)
  If Not Dic.exists(Tmp) Then
    k = k + 1:      Dic.Add Tmp, k:    Maso(k, 1) = Tmp
  End If
  ik = Dic(Tmp)
  If Month(OutArr(i, 1)) = Thang And Year(OutArr(i, 1)) = Nam Then
    Arr(ik, 3) = Arr(ik, 3) + OutArr(i, 6)
  ElseIf (Month(OutArr(i, 1)) < Thang And Year(OutArr(i, 1)) = Nam) Or Year(OutArr(i, 1)) < Nam Then
    Arr(ik, 1) = Arr(ik, 1) - OutArr(i, 6)
  End If
Next i
For i = 1 To k
  Arr(i, 4) = Arr(i, 1) + Arr(i, 2) - Arr(i, 3)
Next i
With Sheets("Xem")
  .Range("A5:E1000").Clear
  If k Then
    .Range("A5").Resize(k, 1) = Maso
    .Range("B5").Resize(k, 4) = Arr
    .Range("B5").Resize(k, 4).NumberFormat = " #,##0.00 ; [red](#,##0.00) ; - "
    .Range("A5").Resize(k, 5).Borders.LineStyle = 1
    .Range("A4").Resize(k + 1, 5).Sort [A4], 1, Header:=xlYes 'sort theo Ma so
  End If
End With
Set Dic = Nothing
End Sub
 
Upvote 0
Cám ơn anh Hiếu, code trước anh gán giá tri 0 cho cell rổng và format giá trị số
còn code mới của anh chổ nào mà có dấu gạch ngang vậy Anh??
mình tách mảng kết quả thành 2 mảng:
Maso() dùng để ghi nhận mã số
Arr() As Double dùng để ghi nhận các con số, với mặc định là 0, nên không cần gán số 0
 
Upvote 0
Thầy Ba TêAnh Hiếu giúp em file này với, File trước không có sheet "Tondau", trong file này giờ có them sheet"Tondau" vì có một số phụ tùng có tồn đầu.
Em nhờ thầy Ba têanh Hiếu giúp chỉnh dùm code trong sheet"Xem" và sheet "BCThang" với.
Em ví dụ như: "Bạc đạn 602" khi chọn tháng 1/2016 thì có tồn cuối là tồn đầu(12)+nhập(2675)-xuất(1000+1600) = 87
cứ như vậy nếu chọn tháng 2/2016 thì có tồn đầu là tồn cuối của tháng 1 + nhập trong tháng 2 - xuất trong tháng 2 = tồn cuối
 

File đính kèm

Upvote 0
Thầy Ba TêAnh Hiếu giúp em file này với, File trước không có sheet "Tondau", trong file này giờ có them sheet"Tondau" vì có một số phụ tùng có tồn đầu.
Em nhờ thầy Ba têanh Hiếu giúp chỉnh dùm code trong sheet"Xem" và sheet "BCThang" với.
Em ví dụ như: "Bạc đạn 602" khi chọn tháng 1/2016 thì có tồn cuối là tồn đầu(12)+nhập(2675)-xuất(1000+1600) = 87
cứ như vậy nếu chọn tháng 2/2016 thì có tồn đầu là tồn cuối của tháng 1 + nhập trong tháng 2 - xuất trong tháng 2 = tồn cuối
Chạy code sheet Xem
Mã:
Sub tonghop()
Dim Sarr, StoreArr(), Darr(), Maso(), Arr() As Double, i As Long, ik As Long, k As Long
Dim Dic As Object, Tmp
Dim NgayTon As Long, NgayDau As Long, NgayCuoi As Long

With Sheets("Xem")
  NgayDau = DateSerial(.Range("D2"), .Range("B2"), 1)
  NgayCuoi = DateSerial(.Range("D2"), .Range("B2") + 1, 0)
End With

i = Sheets("Nhap").UsedRange.Rows.Count + Sheets("Xuat").UsedRange.Rows.Count
ReDim Maso(1 To i, 1 To 1)
ReDim Arr(1 To i, 1 To 4)

Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Tondau")
  NgayTon = .Range("D1").Value2
  StoreArr = .Range("C3", .Range("D" & Rows.Count).End(3)).Value2
End With
For i = 1 To UBound(StoreArr)
  Tmp = StoreArr(i, 1)
  If Not Dic.exists(Tmp) Then
    k = k + 1:      Dic.Add Tmp, k:    Maso(k, 1) = Tmp
  End If
  ik = Dic(Tmp)
  Arr(ik, 1) = Arr(ik, 1) + StoreArr(i, 2)
Next i

Sarr = Array("Nhap", "Xuat", 1, -1)
For s = 0 To 1
  With Sheets(Sarr(s))
    Darr = .Range("A3", .Range("F" & Rows.Count).End(3)).Value2
  End With
  For i = 1 To UBound(Darr)
    Tmp = Darr(i, 5)
    If Not Dic.exists(Tmp) Then
      k = k + 1:      Dic.Add Tmp, k:    Maso(k, 1) = Tmp
    End If
    ik = Dic(Tmp)
    If Darr(i, 1) < NgayDau And Darr(i, 1) >= NgayTon Then
      Arr(ik, 1) = Arr(ik, 1) + Darr(i, 6) * Sarr(s + 2)
    ElseIf Darr(i, 1) >= NgayDau And Darr(i, 1) <= NgayCuoi Then
      Arr(ik, 2 + s) = Arr(ik, 2 + s) + Darr(i, 6)
    End If
  Next i
Next s

For i = 1 To k
  Arr(i, 4) = Arr(i, 1) + Arr(i, 2) - Arr(i, 3)
Next i
With Sheets("Xem")
  .Range("A5:E1000").Clear
  If k Then
    .Range("A5").Resize(k, 1) = Maso
    .Range("B5").Resize(k, 4) = Arr
    .Range("B5").Resize(k, 4).NumberFormat = " #,##0.00 ; [red](#,##0.00) ; - "
    .Range("A5").Resize(k, 5).Borders.LineStyle = 1
    .Range("A4").Resize(k + 1, 5).Sort [A4], 1, Header:=xlYes 'sort theo Ma so
  End If
End With
Set Dic = Nothing
End Sub
 
Upvote 0
Cám ơn anh Hiếu!
Thầy Ba Tê
giúp em sheet"BCthang" với.
 
Upvote 0

File đính kèm

Upvote 0
Trên GPE biết bao người làm được chuyện này, sao lại phải "réo" đích danh người như vậy?
Người khác làm được hay hơn cũng không thèm ghé.
Tại nickname của anh @Ba Tê@HieuCD dễ thương, cũng như tính phóng khoáng hay giúp đỡ anh em của hai anh, vì vậy nên hai anh cứ phải "bị réo quài".
Anh em khác dù có làm hay hơn cũng không ngại "nhào dzô" nhậu chung đâu.

Khà khà khà!
--=0--=0--=0
Chúc anh ngày thiệt vui.
 
Upvote 0
Lại phiền anh Hiếu nữa rồi (vì code này em lấy theo code Anh Hiếu làm cho em)
Trong file mong anh giúp cho sheet"chitiet", lúc trước code chưa có sheet"tondau", nay có sheet"tondau", khi chạy code sẽ nạp tồn đầu vào G6, và lấy G6 để cộng(nhập) hoặc trừ(Xuất) vào dòng 1 của bang nhập xuất tồn, và lại tính tiếp.
Mong anh giúp.
 

File đính kèm

Upvote 0
Lại phiền anh Hiếu nữa rồi (vì code này em lấy theo code Anh Hiếu làm cho em)
Trong file mong anh giúp cho sheet"chitiet", lúc trước code chưa có sheet"tondau", nay có sheet"tondau", khi chạy code sẽ nạp tồn đầu vào G6, và lấy G6 để cộng(nhập) hoặc trừ(Xuất) vào dòng 1 của bang nhập xuất tồn, và lại tính tiếp.
Mong anh giúp.
bạn chỉnh lại code
Mã:
Private Sub ChiTietCreat()
  Dim Tarr As Variant, Arr As Variant, i As Long, K As Long
  Dim Nhap As String, Xuat As String, Ton As Double, dk As String
  If IsEmpty(Narr) Then CreatData
  dk = Range("C5").Value
  Nhap = [E8]
  Xuat = [F8]
  ReDim Arr(1 To UBound(Narr) + UBound(Xarr), 1 To 5)
 
  With Sheets("Tondau")
    Tarr = .Range("A3", .Range("D" & Rows.Count).End(3)).Value
  End With
  For i = 1 To UBound(Tarr)
    If dk = Tarr(i, 1) Then
      Ton = Tarr(i, 4):    Exit For
    End If
  Next i
 
  For i = 1 To UBound(Narr)
    If dk = Narr(i, 3) Then
      K = K + 1
      Arr(K, 1) = Narr(i, 1):       Arr(K, 3) = Narr(i, 1)
      Arr(K, 2) = nh & " - " & "(" & Narr(i, 2) & ")": Arr(K, 4) = Narr(i, 6)
    End If
  Next i
 
  For i = 1 To UBound(Xarr)
    If dk = Xarr(i, 3) Then
      K = K + 1
      Arr(K, 1) = Xarr(i, 1):       Arr(K, 3) = Xarr(i, 1)
      Arr(K, 2) = xu & " - " & "(" & Xarr(i, 2) & ")": Arr(K, 5) = Xarr(i, 6)
    End If
  Next i
 
  Range("A9:G" & 1000).Borders.LineStyle = 0
  Range("A9:G" & 1000).ClearContents
  If K Then
    Range("B9").Resize(K, 5) = Arr
    Range("B9:F9").Resize(K).Sort [B9], 1, [E9], , 2, Header:=xlNo
    Range("A9").Value = 1
    Range("A9").Resize(K).DataSeries
    Range("A9:G9").Resize(K).Borders.LineStyle = 1
    Range("B9").Resize(K).NumberFormat = "dd/mm/yyyy"
    Range("D9").Resize(K).NumberFormat = "dd/mm/yyyy"
    Range("E9").Resize(K, 3).NumberFormat = "#,##0.00 ;[red]( #,##0.00 )"
    Range("G6").Value = Ton
    Range("G9").Value = Ton + Range("E9").Value - Range("F9").Value
    If K > 1 Then
      For i = 10 To 8 + K
        Range("G" & i) = Range("G" & i - 1) + Range("E" & i) - Range("F" & i)
      Next i
    End If
  End If
End Sub
 
Upvote 0

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

Back
Top Bottom