Thống kê tình hình sử dụng hóa đơn theo điều kiện

Liên hệ QC

quick87

(/ội...
Tham gia
8/4/08
Bài viết
371
Được thích
350
Giới tính
Nam
Em chào mọi người,

Em có vấn đề liên quan đến việc tổng hợp báo cáo tình hình sử dụng hóa đơn theo Quý theo từng Mẫu số và ký hiệu từ sheet "Chitiet" theo mẫu kết quả được tổng hợp tại sheet: "Thongke" mong được giúp đỡ. Cụ thể:

Dữ liệu được liệt kê tại sheet "Chitiet":

1582859376812.png


Tổng hợp theo mẫu báo cáo tại Sheet "Thongke":

1582858927625.png

Từng chỉ tiêu tại sheet "Thongke" được lấy bên sheet "Chitiet" theo điều kiện như sau:

(1) Mẫu số: được lấy từ Cột B
(2) Ký hiệu: được lấy từ Cột C
(3) Số lượng đã sử dụng: là tổng số hóa đơn có trạng thái là: "Đã in" tại cột "Trạng thái hóa đơn" (Cột M)
(4) Số lượng xóa bỏ: là tổng số hóa đơn có trạng thái là: "Đã xóa" tại cột "Trạng thái hóa đơn" (Cột M)
(5) Số: liệt kê chi tiết những hóa đơn có trạng thái là xóa bỏ, được liệt kê theo từng số và cách nhau bằng dấu ";, nếu số liên tục thì được thống kê theo khoảng (-)

Ví dụ, với "Mẫu số" là "01GTKT0/001", có "Ký hiệu hóa đơn" là "AA/19E" có số hóa đơn xóa bỏ như hình dưới là:

1582859573085.png

=> sẽ cần phải thống kê như sau: 88795-88802;88806-88807;88817-88819;88855-88856;88858;88860;88902-88903;94489;94757;...
và cho đến những số còn lại.

(6) Từ số: số hóa đơn cuối cùng đã sử dụng trong Quý.

Mong được mọi người giúp đỡ ạ. Em cảm ơn thật nhiều.
Chi tiết, em xin phép gửi file đính kèm.
 

File đính kèm

  • Hoi_Thong ke hoa don.zip
    1.9 MB · Đọc: 44
Sao giống báo cáo tình hình sử dụng hóa đơn quá vậy
 
Upvote 0
Hiểu roi bạn làm cái này để đưa vào CCHTKK thhuế đúng không, chứ báo cáo Hóa đơn phải có mã vạch
 
Upvote 0
Em chào mọi người,

Em có vấn đề liên quan đến việc tổng hợp báo cáo tình hình sử dụng hóa đơn theo Quý theo từng Mẫu số và ký hiệu từ sheet "Chitiet" theo mẫu kết quả được tổng hợp tại sheet: "Thongke" mong được giúp đỡ. Cụ thể:

Dữ liệu được liệt kê tại sheet "Chitiet":

View attachment 232595


Tổng hợp theo mẫu báo cáo tại Sheet "Thongke":

View attachment 232592

Từng chỉ tiêu tại sheet "Thongke" được lấy bên sheet "Chitiet" theo điều kiện như sau:

(1) Mẫu số: được lấy từ Cột B
(2) Ký hiệu: được lấy từ Cột C
(3) Số lượng đã sử dụng: là tổng số hóa đơn có trạng thái là: "Đã in" tại cột "Trạng thái hóa đơn" (Cột M)
(4) Số lượng xóa bỏ: là tổng số hóa đơn có trạng thái là: "Đã xóa" tại cột "Trạng thái hóa đơn" (Cột M)
(5) Số: liệt kê chi tiết những hóa đơn có trạng thái là xóa bỏ, được liệt kê theo từng số và cách nhau bằng dấu ";, nếu số liên tục thì được thống kê theo khoảng (-)

Ví dụ, với "Mẫu số" là "01GTKT0/001", có "Ký hiệu hóa đơn" là "AA/19E" có số hóa đơn xóa bỏ như hình dưới là:

View attachment 232597

=> sẽ cần phải thống kê như sau: 88795-88802;88806-88807;88817-88819;88855-88856;88858;88860;88902-88903;94489;94757;...
và cho đến những số còn lại.

(6) Từ số: số hóa đơn cuối cùng đã sử dụng trong Quý.

Mong được mọi người giúp đỡ ạ. Em cảm ơn thật nhiều.
Chi tiết, em xin phép gửi file đính kèm.
Chạy code
Mã:
Sub HoaDon()
  Dim HD(), TT(), Res(), Res2() As String
  Dim i&, k&, sRow&, SoHD&, tmp&
  Dim TuSo$
  With Sheets("Chitiet")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co du lieu"): Exit Sub
    HD = .Range("B1:D" & i + 1).Value
    TT = .Range("M1:M" & i + 1).Value
  End With
  sRow = UBound(HD)
  ReDim Res(1 To 100, 1 To 6)
  ReDim Res2(1 To 100, 1 To 1)
  For i = 2 To sRow - 1
    If HD(i, 2) <> HD(i - 1, 2) Then
      k = k + 1
      Res(k, 1) = HD(i, 1)
      Res(k, 2) = HD(i, 2)
      TuSo = ""
    End If
    If TT(i, 1) Like "?? in" Then
      Res(k, 3) = Res(k, 3) + 1
      TuSo = HD(i, 3)
    Else
      Res(k, 4) = Res(k, 4) + 1
      If Not (TT(i - 1, 1) Like "?? x?a") Then
        SoHD = HD(i, 3)
        Res(k, 5) = Res(k, 5) & ";" & SoHD
      End If
      If Not (TT(i + 1, 1) Like "?? x?a") Or HD(i, 2) <> HD(i + 1, 2) Then
        If HD(i, 3) > SoHD Then
          Res(k, 5) = Res(k, 5) & "-" & Val(HD(i, 3))
        End If
      End If
    End If
    If HD(i, 2) <> HD(i + 1, 2) Then
      If Len(Res(k, 5)) Then
        Res(k, 5) = Mid(Res(k, 5), 2, Len(Res(k, 5)))
      End If
      Res2(k, 1) = TuSo
    End If
  Next i
  With Sheets("ThongKe")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("B5:G" & i).ClearContents
    .Range("B5").Resize(k, 5) = Res
    .Range("G5").Resize(k) = Res2
  End With
End Sub
 
Upvote 0
Chạy code
Mã:
Sub HoaDon()
  Dim HD(), TT(), Res(), Res2() As String
  Dim i&, k&, sRow&, SoHD&, tmp&
  Dim TuSo$
  With Sheets("Chitiet")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co du lieu"): Exit Sub
    HD = .Range("B1:D" & i + 1).Value
    TT = .Range("M1:M" & i + 1).Value
  End With
  sRow = UBound(HD)
  ReDim Res(1 To 100, 1 To 6)
  ReDim Res2(1 To 100, 1 To 1)
  For i = 2 To sRow - 1
    If HD(i, 2) <> HD(i - 1, 2) Then
      k = k + 1
      Res(k, 1) = HD(i, 1)
      Res(k, 2) = HD(i, 2)
      TuSo = ""
    End If
    If TT(i, 1) Like "?? in" Then
      Res(k, 3) = Res(k, 3) + 1
      TuSo = HD(i, 3)
    Else
      Res(k, 4) = Res(k, 4) + 1
      If Not (TT(i - 1, 1) Like "?? x?a") Then
        SoHD = HD(i, 3)
        Res(k, 5) = Res(k, 5) & ";" & SoHD
      End If
      If Not (TT(i + 1, 1) Like "?? x?a") Or HD(i, 2) <> HD(i + 1, 2) Then
        If HD(i, 3) > SoHD Then
          Res(k, 5) = Res(k, 5) & "-" & Val(HD(i, 3))
        End If
      End If
    End If
    If HD(i, 2) <> HD(i + 1, 2) Then
      If Len(Res(k, 5)) Then
        Res(k, 5) = Mid(Res(k, 5), 2, Len(Res(k, 5)))
      End If
      Res2(k, 1) = TuSo
    End If
  Next i
  With Sheets("ThongKe")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("B5:G" & i).ClearContents
    .Range("B5").Resize(k, 5) = Res
    .Range("G5").Resize(k) = Res2
  End With
End Sub
Em cảm ơn anh @HieuCD, kết quả đúng rồi ah.
Chúc anh sức khỏe và cuối tuần nhiều niềm vui nhé !
 
Upvote 0
Dữ liệu đã sort theo ký hiệu và số hóa đơn, số hóa đơn từng ký hiệu liên tục không bị thiếu số , chỉ cần 1 vòng For là được
Em không làm theo cách truyền thống, em điều chỉnh lại cái hàm A_SQL của em, ma sao nó xử lý chậm thật. Mệt óc quá hichic.
Code của anh lẹ kinh khủng.
 
Upvote 0
Nó sử dụng chủ yếu là câu lệnh sql thôi anh, chay dư liệu mà chọn nguyên sheet1 rất chậm không biết sao nữa. Còn định vị vùng thì chạy tương đối
 
Upvote 0
Chạy code
Mã:
Sub HoaDon()
  Dim HD(), TT(), Res(), Res2() As String
  Dim i&, k&, sRow&, SoHD&, tmp&
  Dim TuSo$
  With Sheets("Chitiet")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co du lieu"): Exit Sub
    HD = .Range("B1:D" & i + 1).Value
    TT = .Range("M1:M" & i + 1).Value
  End With
  sRow = UBound(HD)
  ReDim Res(1 To 100, 1 To 6)
  ReDim Res2(1 To 100, 1 To 1)
  For i = 2 To sRow - 1
    If HD(i, 2) <> HD(i - 1, 2) Then
      k = k + 1
      Res(k, 1) = HD(i, 1)
      Res(k, 2) = HD(i, 2)
      TuSo = ""
    End If
    If TT(i, 1) Like "?? in" Then
      Res(k, 3) = Res(k, 3) + 1
      TuSo = HD(i, 3)
    Else
      Res(k, 4) = Res(k, 4) + 1
      If Not (TT(i - 1, 1) Like "?? x?a") Then
        SoHD = HD(i, 3)
        Res(k, 5) = Res(k, 5) & ";" & SoHD
      End If
      If Not (TT(i + 1, 1) Like "?? x?a") Or HD(i, 2) <> HD(i + 1, 2) Then
        If HD(i, 3) > SoHD Then
          Res(k, 5) = Res(k, 5) & "-" & Val(HD(i, 3))
        End If
      End If
    End If
    If HD(i, 2) <> HD(i + 1, 2) Then
      If Len(Res(k, 5)) Then
        Res(k, 5) = Mid(Res(k, 5), 2, Len(Res(k, 5)))
      End If
      Res2(k, 1) = TuSo
    End If
  Next i
  With Sheets("ThongKe")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("B5:G" & i).ClearContents
    .Range("B5").Resize(k, 5) = Res
    .Range("G5").Resize(k) = Res2
  End With
End Sub

Anh @HieuCD ơi, nhờ anh xem thêm giúp em phần "Lấy số tồn cuối kỳ" trong trường hợp như file đính kèm.
Theo trường hợp này, số "Tồn cuối kỳ"đúng phải là số "12288" mới đúng nhưng code hiện tại đang trả về là số "12253":

1595245313499.png

Em đính kèm file chi tiết, nhờ anh và các thành viên xem giúp ạ.
Em cảm ơn !
 

File đính kèm

  • Hoi_ThongKe_HD 147949#19.xlsb
    110.2 KB · Đọc: 11
Lần chỉnh sửa cuối:
Upvote 0
Anh @HieuCD ơi, nhờ anh xem thêm giúp em phần "Lấy số tồn cuối kỳ" trong trường hợp như file đính kèm.
Theo trường hợp này, số "Tồn cuối kỳ"đúng phải là số "12288" mới đúng nhưng code hiện tại đang trả về là số "12253":

View attachment 241492

Em đính kèm file chi tiết, nhờ anh và các thành viên xem giúp ạ.
Em cảm ơn !
Duy thử file sau xem
Mã:
Sub TKeHD()
Dim hD(), rS(), i&, Lr&, k&, Tm$, d$, SoHD&, Dic As Object
With Sheets("Chitiet")
    Lr = .Range("B65535").End(xlUp).Row
    If Lr < 2 Then MsgBox ("Khong co du lieu"): Exit Sub
    hD = .Range("B2:M" & Lr + 1).Value
End With
Sheets("ThongKe").Range("B5:G100").ClearContents
ReDim rS(1 To UBound(hD), 1 To 6)
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(hD) - 1
    Tm = hD(i, 1) & " " & hD(i, 2): SoHD = hD(i, 3)
    If Not Dic.Exists(Tm) Then
        k = k + 1: Dic.Add Tm, k
        rS(k, 1) = hD(i, 1): rS(k, 2) = hD(i, 2)
        If hD(i, 12) Like "*in*" Then
            rS(k, 3) = rS(k, 3) + 1
        Else
            rS(k, 4) = rS(k, 4) + 1
            rS(k, 5) = SoHD
            rS(k, 6) = hD(i, 3)
        End If
    Else
        d = Dic.Item(Tm)
        If hD(i, 12) Like "*in*" Then
            rS(d, 3) = rS(d, 3) + 1
        Else
            rS(d, 4) = rS(d, 4) + 1: rS(d, 6) = hD(i, 3)
            If hD(i - 1, 12) Like "*in*" Then
                rS(d, 5) = rS(d, 5) & ";" & SoHD
            ElseIf hD(i + 1, 12) Like "*in*" Or _
                hD(i, 2) <> hD(i + 1, 2) Then
                rS(d, 5) = rS(d, 5) & "-" & SoHD
            End If
            If Left(rS(d, 5), 1) = ";" Then
                rS(d, 5) = Mid(rS(d, 5), 2, Len(rS(d, 5)))
            End If
        End If
    End If
Next i
If k Then Sheets("ThongKe").Range("B5").Resize(k, 6) = rS
Set Dic = Nothing
End Sub
 

File đính kèm

  • Hoi_ThongKe_HD 147949#19.xlsb
    114.7 KB · Đọc: 12
Upvote 0
Web KT
Back
Top Bottom