Báo cáo tháng

Liên hệ QC

quykh

Chim non
Tham gia
7/9/11
Bài viết
381
Được thích
46
Giới tính
Nữ
Nghề nghiệp
Công Nhân
Mình có file báo cáo tháng này, mong các bạn giúp đỡ.File này bạn HYEN17 đã làm cho mình, nhưng mình thấy chưa đúng(Số lượng nhập, xuất trong tháng vẫn không đúng theo sheet chi tiết)
 

File đính kèm

  • BCThang.xls
    71.5 KB · Đọc: 32
Mình có file báo cáo tháng này, mong các bạn giúp đỡ.File này bạn HYEN17 đã làm cho mình, nhưng mình thấy chưa đúng(Số lượng nhập, xuất trong tháng vẫn không đúng theo sheet chi tiết)

Mình thì k hiểu hàm sumproduct này. nhưng xem file thấy đúng như bạn nói.. số lượng nhập bị sai.. Nguyên nhân là bởi vì chú HYEN17 bôi đen nhầm vùng dữ liệu . Mình đã sửa lại bạn xem có phải số lượng như vậy k nhé
 

File đính kèm

  • Copy of BCThang-1.xls
    57.5 KB · Đọc: 35
Lần chỉnh sửa cuối:
Upvote 0
Vẫn không đúng bạn ơi! (ví dụ như BKT-1 trong tháng 1 đâu có nhập cái nào đâu mà có 120 cái). Ý của mình là chỉnh sửa lại trong code, để qua sheet Report cho nó đúng kìa.
 
Upvote 0
Vẫn không đúng bạn ơi! (ví dụ như BKT-1 trong tháng 1 đâu có nhập cái nào đâu mà có 120 cái). Ý của mình là chỉnh sửa lại trong code, để qua sheet Report cho nó đúng kìa.

Nếu sửa lại code thì mình chịu.. nhưng BKT-1 của bạn trong tháng 1 mình vẫn thấy nhập 120 cái đó thôi. Bạn nhìn cái vùng ngày tháng bôi màu vàng đó.. đấy k phải là tháng 1 sao? nhìn sang bên BKT-1 rõ ráng vẫn 120 cái mà
 
Upvote 0
Trước tiên cho fép mình xin lỗi chủ topic cái nghen!

Do trong macro thiếu 2 câu lệnh dùng để xóa số liệu báo cáo chạy kì trước, nên nó cứ cộng dồn;

Bạn lấy cái ni chép đè lên toàn bộ macro cũ là được;

Ghi chú 2 dòng lệnh thêm mình đã đánh dấu sẵn đó. (Một cách khác, chép thêm 2 dòng lệnh này vô macro cũ đúng vị trí mà nó fải có là được.
Một lần nữa thành thật xin lỗi bạn vì những fiền muộn đã gây cho bạn thời gian qua!

PHP:
Sub BCThg(Thg As Byte)
 Dim DatD As Date, DatC As Date
 Dim Sh As Worksheet, Rng As Range, sRng As Range, vRg As Range, Cls As Range, Cll As Range
 Dim SoNg As Integer, Jj As Integer, Col As Integer, NX As Integer
 Dim MyAdd As String
 
 Set Sh = ThisWorkbook.Worksheets("Report")
 Jj = Sh.[b6].CurrentRegion.Rows.Count       '<=|'
 Sh.[e6].Resize(Jj, 3).ClearContents         '<=|'
 Col = [iu5].End(xlToLeft).Column
 Range("E8").Resize(, Col).Copy
1 'Chép Tòn Nam Truóc'
 Sh.Range("E6").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
   False, Transpose:=True
 Application.CutCopyMode = False
 Set Rng = Range([a8], [A65500].End(xlUp))
 Rng.NumberFormat = "mm/dd/yyyy"
 If Thg > 1 Then
2 'Chép Tòn Các Tháng Truóc'
   DatD = DateSerial(Year(Date), 1, 1)
   DatC = DateSerial(Year(Date), Thg, 1)
   SoNg = DatC - DatD
   For Jj = 0 To SoNg - 1
      Set sRng = Rng.Find(Format(DatD + Jj, "mm/dd/yyyy"), , xlValues, xlWhole)
      If Not sRng Is Nothing Then
         MyAdd = sRng.Address
         Do
            If sRng.Row < 22 Then NX = 1 Else NX = -1
            Set vRg = sRng.Offset(, 4).Resize(, Col).SpecialCells(xlCellTypeConstants, 3)
            If Not vRg Is Nothing Then
               For Each Cls In vRg
                  For Each Cll In Sh.Range(Sh.[b6], Sh.[b65500].End(xlUp))
                     If Cll.Value = Cells(5, Cls.Column).Value Then
                        With Cll.Offset(, 3)
                           .Value = .Value + NX * Cls.Value
                        End With
                     End If
                  Next Cll
               Next Cls
            End If
            Set sRng = Rng.FindNext(sRng)
         Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
      End If
   Next Jj
 End If
3 'Chép Só Lieu Cua Tháng'
   DatD = IIf(Thg = 1, DateSerial(Year(Date), 1, 1), DatC)
   DatC = IIf(Thg = 1, DateSerial(Year(Date), 2, 1), DateSerial(Year(Date), Thg + 1, 1))
   SoNg = DatC - DatD
   For Jj = 0 To SoNg - 1
      Set sRng = Rng.Find(Format(DatD + Jj, "mm/dd/yyyy"))
      If Not sRng Is Nothing Then
         MyAdd = sRng.Address
         Do
            If sRng.Row < 22 Then NX = 1 Else NX = 2
            Set vRg = sRng.Offset(, 4).Resize(, Col).SpecialCells(xlCellTypeConstants, 3)
            If Not vRg Is Nothing Then
               For Each Cls In vRg
               
                  For Each Cll In Sh.Range(Sh.[b6], Sh.[b65500].End(xlUp))
                     If Cll.Value = Cells(5, Cls.Column).Value Then
                        With Cll.Offset(, 3 + NX)
                           .Value = .Value + Cls.Value
                        End With
                     End If
                  Next Cll
               
               Next Cls
            End If
            Set sRng = Rng.FindNext(sRng)
         Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
      End If
   Next Jj
   
   Sh.Select
End Sub

(Những mong là không fải gởi file lên!)
 
Upvote 0
quykh đã viết:
(1) Cho mình hỏi khi chép qua Report mình không muốn nó có đường gạch đậm thì chỉnh code sao hả bạn?

(2) Trong code của bạn định dạng là mm/dd/yyyy mình chỉnh lại dd/mm/yyyy có ảnh hưởng gì không bạn? Bạn cho phép mình là bạn của bạn để học hỏi thêm nhe?

(1) Bạn format Border mỗi lần 1 khác cho vùng [e8:w8] của trang 'ChiTiet' trước mỗi lần chạy macro xem sao.

(2) Bạn thêm dòng lệnh này vô trước dòng cuối chương trình
PHP:
   Next Jj
   Rng.NumberFormat = "DD/mm/yyyy"    '<=|'
   Sh.Select
End Sub

Bạn cho mình hỏi thêm nhe :
3/ mình chèn thêm dòng để nhập thêm hoặc xuất thêm.
4/mình muốn thêm mặt hàng nữa. thì có được không bạn?


(3) Chèn thêm dòng thì vô tư, nhưng fải chỉnh 1 chổ trong macro, như sau:

Hiện tại bạn thấy fân cách giữa fần nhập & xuất tại dòng 22; Để tăng nơi fân cách này thành 99, thì cũng fải sửa số 22 thành 99 trong macro, vậy bạn tìm & sửa thôi!

(4) Thêm mặt hàng nào bên 'ChiTiet' thì cũng giữ trật tự như vậy (nhưng theo trình tự từ trên xuống tại cột 'B:C' của trang 'Report'
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Nhờ Bác HYEN17 chỉnh dùm cháu ạ, cháu đã chỉnh lại shett "Chitiet" (thêm cột và có chỉnh lại mã số) Mong Bác giúp cháu!
 
Upvote 0
Bạn xem trong file đính kèm

Sao không tăng số dòng vùng nhập lên khải dĩ. . . ?
 

File đính kèm

  • gpeVatTu.rar
    19.9 KB · Đọc: 18
Upvote 0
Có phải tăng cái này không Thầy:
2/"chép tồn các tháng trước"
If SRng.Row< 22 thành 99
3/"chép số liêu của tháng"
If SRng.Row< 22 thành 99
Phải không Thầy
Cám ơn Thầy đã giúp Em
 
Upvote 0
File bạn đang sử dụng ở #7 có vấn đề tiềm ẩn gây khó trong quản lý

Đó là bạn không thể truy xuất số liệu của các tháng trước để xem lại.
& trong những trường hợp như vậy là cung cách quản lý chưa hệ thống hóa.

Chẳng nhễ, muốn xem vài tháng trước đó bạn lại lôi các báo cáo đã in ra giấy để xem xét ư?

Với cách quản lý tối ưu sẽ fải là muốn xem số liệu hoạt động của tháng nào trước đó, hay thậm chí quí nào trước đó đều được.
Cộng đồng sẽ sẵn lòng giúp bạn hoàn thiện thêm để bạn có thể:

Trước mắt là xem tháng nào cũng được, hễ bạn sẵn lòng không chối từ!

Chờ tin bạn.
 
Upvote 0
Bạn xem trong file kèm theo của mình

quykh đã viết:
Cám ơn bạn đã chỉ giáo.Mong bạn và cộng đồng giúp đỡ!
Hãy tuần tự chọn tháng tăng dần & sau mỗi tháng 1 kiểm số liệu.
 

File đính kèm

  • gpeVatTu.rar
    22.4 KB · Đọc: 7
Upvote 0
Thường người ta hay tạo trang 'DanhMuc' để chứa tồn các tháng

quykh đã viết:
Cám ơn Bạn nhiều. Nhưng cho mình hỏi thế thì mình có thể tạo một sheet" tổng hợp" để đưa số liệu tồn cuối của 12 tháng qua được không bạn. Chứ sheet " chi tiết" nhìn hơi "rối".

Bạn xem & kiểm theo file mới nha
 

File đính kèm

  • gpeVatTu.rar
    25.7 KB · Đọc: 23
Upvote 0
Báo cáo tháng bị sai

Sao Sai Bét Rồi!
Nhờ 02 bác và cộng đồng giúp em coi sao nó kỳ dzậy! Em đã tô màu vàng mấy ô mà nó không nhận ra đó. Các bác xem file đính kèm nhe. Chứ báo cáo kiểu này là chết chắc.À Em biết rồi, vì mấy ô đó em làm phép tính. Thế thì các bác giúp em với. Chứ chẵn lẻ cứ phải cộng trừ nhân chia ngoài trước rồi mới gỏ số vào à. Giúp em với
 

File đính kèm

  • BCThang.xls
    78 KB · Đọc: 10
Lần chỉnh sửa cuối:
Upvote 0
Dưới đây là macro mình ghi lại để chuyển toàn bộ công thức thành số liệu

PHP:
Sub CopyValue()
    Rows("9:18").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
End Sub

Ghi chú: Mới chỉ chuyển từ dòng 9 đến dòng 18; nếu muốn chuyển hoàn bộ thì ta tăng lên, miễn là trong vùng chọn không có ô nào đã trộn
 
Upvote 0
Cám ơn Thầy, Em copy chép vào code rồi vẫn không được!
 
Upvote 0
Mình vừa chạy macro trên file của bạn & thấy OK mà.

Macro như vầy:
PHP:
Sub BCThg(Thg As Byte)
 On Error GoTo GPE
 Dim DatD As Date, DatC As Date
 Dim Sh As Worksheet, Rng As Range, sRng As Range, vRg As Range, Cls As Range, Cll As Range
 Dim SoNg As Integer, Jj As Integer, Col As Integer, NX As Integer
 Dim MyAdd As String
 
 Set Sh = ThisWorkbook.Worksheets("Bao Cao")
 Jj = Sh.[b6].CurrentRegion.Rows.Count
  Sh.[e6].Resize(Jj, 3).ClearContents
 Col = [iu5].End(xlToLeft).Column
 Range("E8").Resize(, Col).Copy
1 'Chép Tòn Nam Truóc'
 Sh.Range("E6").PasteSpecial Paste:=xlPasteAllExceptBorders, Operation:=xlNone, SkipBlanks:= _
   False, Transpose:=True
 Application.CutCopyMode = False
 Set Rng = Range([a8], [A9999].End(xlUp))
 Rng.NumberFormat = "mm/dd/yyyy"
 If Thg > 1 Then
2 'Chép Tòn Các Tháng Truóc'
   DatD = DateSerial(Year(Date), 1, 1)
   DatC = DateSerial(Year(Date), Thg, 1)
   SoNg = DatC - DatD
   For Jj = 0 To SoNg - 1
      Set sRng = Rng.Find(Format(DatD + Jj, "mm/dd/yyyy"), , xlValues, xlWhole)
      If Not sRng Is Nothing Then
         MyAdd = sRng.Address
         Do
            If sRng.Row < 18 Then NX = 1 Else NX = -1
            Set vRg = sRng.Offset(, 4).Resize(, Col).SpecialCells(xlCellTypeConstants, 3)
            If Not vRg Is Nothing Then
               For Each Cls In vRg
                  For Each Cll In Sh.Range(Sh.[b6], Sh.[b65500].End(xlUp))
                     If Cll.Value = Cells(5, Cls.Column).Value Then
                        With Cll.Offset(, 3)
                           .Value = .Value + NX * Cls.Value
                        End With
                     End If
                  Next Cll
               Next Cls
            End If
            Set sRng = Rng.FindNext(sRng)
         Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
      End If
   Next Jj
 End If

3 'Chép Só Lieu Cua Tháng'
'  **    **    **    **    ** '
    Rows("9:18").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
'  **    **    **    **    ** '
   DatD = IIf(Thg = 1, DateSerial(Year(Date), 1, 1), DatC)
   DatC = IIf(Thg = 1, DateSerial(Year(Date), 2, 1), DateSerial(Year(Date), Thg + 1, 1))
   SoNg = DatC - DatD
   For Jj = 0 To SoNg - 1
      Set sRng = Rng.Find(Format(DatD + Jj, "mm/dd/yyyy"))
      If Not sRng Is Nothing Then
         MyAdd = sRng.Address
         Do
            If sRng.Row < 18 Then NX = 1 Else NX = 2
            
            Set vRg = sRng.Offset(, 4).Resize(, Col).SpecialCells(xlCellTypeConstants, 3)
            If Not vRg Is Nothing Then
               For Each Cls In vRg
                  For Each Cll In Sh.Range(Sh.[b6], Sh.[b65500].End(xlUp))
                     If Cll.Value = Cells(5, Cls.Column).Value Then
                        With Cll.Offset(, 3 + NX)
                           .Value = .Value + Cls.Value
                        End With
                     End If
                  Next Cll
               Next Cls
            End If
            Set sRng = Rng.FindNext(sRng)
         Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
      End If
   Next Jj
   Rng.NumberFormat = "DD/mm/yyyy"
   Sh.Select
ERR_:          Exit Sub
GPE:
   Select Case Err
   Case 1004
      Resume Next
   Case Else
      MsgBox Err, , Error:            GoTo ERR_
   End Select
End Sub

Thực ra file như của bạn thì các dòng lệnh từ 2 cho tới 3 là dư.
 
Upvote 0
Dư là sao hả bạn! Thế bạn có thể rút gọn lại không?
 
Upvote 0
Nói là dư vì các câu lệnh đó không dùng làm gì trong trường hợp của bạn.

Dư là sao hả bạn! Thế bạn có thể rút gọn lại không?

Macro đó là macro version đầu, khi bạn chỉ có lượng tồn đầu năm; để tổng hợp số liệu tháng nào đó trừ tháng 1 ta fải trãi qua 3 bước:
(1) Chép tồn đầu năm;
(2) Tính tồn trước ngày 1 của tháng báo cáo
(3) Tổng hợp số liệu trong tháng báo cáo cộng đại số với số tồn ở bước (2)

Nhưng một khi bạn luôn có hàng bên trang 'ChiTiet' để chép tồn trước đầu tháng thì sẽ giống như macro làm với số liệu tháng giêng hàng năm mà thôi. (Đã như vậy - tháng giêng- người ta không dùng bước (2) trong 3 bước nêu trên.

Mà sao bạn không thử áp dụng file đính kèm của bài 12 thử xem sao!

Thực ra mình cũng đã gộp 2 trang 'DMuc' & trang 'BCao' làm 1 rồi. Nhưng khi nào bạn thích ứng với file #12 thì mình sẽ gơi lên tặng bạn.
Chịu khó thay đổi thói quen 1 lần xem sao!
 
Upvote 0
file ở bài 12 là chi tiết từng ngày, mình đâu cần từng ngày. Chỉ cần từng tháng thôi. Bạn có thể gửi file gộp được không?
 
Upvote 0
(1) file ở bài 12 là chi tiết từng ngày, mình đâu cần từng ngày.
Chỉ cần từng tháng thôi.
(2) Bạn có thể gửi file gộp được không?

(1) Hình như bạn có sự nhầm lẫn thì fải; Trong #12, ở trang 'DMuc' là chứa 12 cột số liệu của tồn đầu các tháng báo cáo, chú không fải tổng hợp từng ngày đâu bạn;
Ở trang 'BCao' vẫn là báo cáo các tháng đó

(2) Bạn xem & vận hành thử theo file đính kèm; Nút tổng hợp theo tháng nằm ở trang 'BCao' đó nha.
 

File đính kèm

  • ChuyenDe.rar
    25.5 KB · Đọc: 14
Upvote 0
Web KT
Back
Top Bottom