hướng dẫn 1 bài tập khó về tìm kiếm

Liên hệ QC

truongduchoa

Thành viên mới
Tham gia
13/11/06
Bài viết
19
Được thích
4
Nghề nghiệp
Kinh Doanh
mình đang vướng 1 vần đề cần nhờ các cao thủ chỉ giáo như sau :

sheet1 liệt kê các hóa đơn phát sinh trong ngày theo hàng
VD :
ngày sohd masp soluong so tien
1 01 a 10 20
1 01 b 10 20
1 02 a 20 40
1 03 b 10 20
1 03 c 50 100

trong sheets 2 mình muốn làm như sau
NGAY : 1 (chỉ cần chọn ở đây là số hóa đơn sẽ xuất hiện ở dưới)

so hd so tien
01 40
02 40
03 120

về so tien thì mình biết cách rồi, nhưng vấn đề ở đây là làm sao biết được trong ngày đó có bao nhiêu hóa đơn và liệt kê nó ra như trong sheets 2

Mong các bạn chỉ giáo.. mình cần gấp lắm
 
Tôi có 1 file ví dụ này tự viết, không biết có giúp ích được được gì cho bạn o? Bạn nghiên cứu thử xem nhé!
Trong file tôi viết có 2 hàm: 1 hàm là Tinhtongtheocot và 1 hàm Tinhtongtheovung. Về cơ bản đều cho đáp số giống nhau cho mỗi trường hợp, nhưng hàm Tinhtongtheocot bị nhược điểm sẽ cho ra kết qua khác nếu thêm nhiều hàng trống xen kẽ vào.(Tôi cũng chưa biết tại sao, tiện thể nhờ các Pác cao thủ chỉ giùm).

Xin lỗi các ban nhé, viết vội nên quên đưa pass: 6250256
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
mình đang vướng 1 vần đề cần nhờ các cao thủ chỉ giáo như sau :

sheet1 liệt kê các hóa đơn phát sinh trong ngày theo hàng
VD :
ngày sohd masp soluong so tien
1 01 a 10 20
1 01 b 10 20
1 02 a 20 40
1 03 b 10 20
1 03 c 50 100

trong sheets 2 mình muốn làm như sau
NGAY : 1 (chỉ cần chọn ở đây là số hóa đơn sẽ xuất hiện ở dưới)

so hd so tien
01 40
02 40
03 120

về so tien thì mình biết cách rồi, nhưng vấn đề ở đây là làm sao biết được trong ngày đó có bao nhiêu hóa đơn và liệt kê nó ra như trong sheets 2

Mong các bạn chỉ giáo.. mình cần gấp lắm

Bạn dùng Pivot Table như đính kèm.
 

File đính kèm

Tiện thể nhờ chỉ giùm, thì xin chỉ dùm 1 phương cách:

Tôi có 1 file ví dụ này tự viết, không biết có giúp ích được được gì cho bạn o?!
Trong file tôi viết có 2 hàm: 1 hàm là Tinhtongtheocot và 1 hàm Tinhtongtheovung. Về cơ bản đều cho đáp số giống nhau cho mỗi trường hợp, nhưng hàm Tinhtongtheocot bị nhược điểm sẽ cho ra kết qua khác nếu thêm nhiều hàng trống xen kẽ vào.(Tôi cũng chưa biết tại sao, tiện thể nhờ các Pác chỉ giùm).

Gộp thành 1 hàm cho bạn luôn đây:

PHP:
Option Explicit
Function TinhTong(VungTinh As Range, LooKupValue As String, Optional Cot As Boolean = True)
 If VungTinh.Columns.Count <> 2 Then
   TinhTong = "Khong Ap Dung Duoc":       Exit Function
 Else
   Dim Clls As Range, Rng As Range
   If Cot Then
      Set Rng = Range(VungTinh.Cells(1, 1), Cells(65500, _
              VungTinh.Cells(1, 1).Column).End(xlUp))
      For Each Clls In Rng
         If Clls.Value = LooKupValue Then
            TinhTong = TinhTong + Clls.Offset(, 1).Value
         End If
      Next Clls
   Else
      Set Rng = VungTinh.Cells(1, 2).Resize(VungTinh.Rows.Count)
      For Each Clls In Rng
         If Clls.Value = LooKupValue Then TinhTong = TinhTong + Clls.Offset(, -1).Value
      Next Clls
   End If
 End If
End Function

Khi đó cú pháp hàm để tính tổng theo cột (tại 'E6' sẽ là :
=TinhTong(B:C,B6)
& tính theo vùng (tại ô phải kế bên) sẽ có cú pháp dài hơn:
=TinhTong(A5:B18,B6,FALSE)

Chúc vui!
 
Lần chỉnh sửa cuối:
Xin lỗi các ban nhé, viết vội nên quên đưa pass: 6250256

Hàm tính theo cột của bạn có thể sửa lại như sau:
PHP:
Function SumForCol(VungCotSo As Range, VungTenPhong As Range, Tenphong As String) As Single
Dim Jj As Long, j, SoHang As Long
Dim Tong As Single
SoHang = WorksheetFunction.CountA(VungCotSo)
SoHang = WorksheetFunction.CountA(VungTenPhong) + SoHang
Tong = 0
For Jj = 1 To SoHang
   If VungTenPhong(Jj) = Tenphong Then
      Tong = Tong + VungCotSo(Jj)
   End If
Next Jj
SumForCol = Tong
End Function
 
Hàm tính theo cột của bạn có thể sửa lại như sau:
PHP:
Function SumForCol(VungCotSo As Range, VungTenPhong As Range, Tenphong As String) As Single
Dim Jj As Long, j, SoHang As Long
Dim Tong As Single
SoHang = WorksheetFunction.CountA(VungCotSo)
SoHang = WorksheetFunction.CountA(VungTenPhong) + SoHang
Tong = 0
For Jj = 1 To SoHang
   If VungTenPhong(Jj) = Tenphong Then
      Tong = Tong + VungCotSo(Jj)
   End If
Next Jj
SumForCol = Tong
End Function
Cái này chỉ cần lọc có Đ/K ( advanced filter ) là dc thôi. Nhiều khi phức tạp vấn đề e rằng lại khó hiểu ( khó ứng dụng ) cho người cần hỏi.
 
Cái này chỉ cần lọc có Đ/K ( advanced filter ) là dc thôi. Nhiều khi phức tạp vấn đề e rằng lại khó hiểu ( khó ứng dụng ) cho người cần hỏi.
Nếu dùng advanced filter thì nói làm gì, mục đích đưa ra vừa tách lọc và đếm số lượng mà không làm thay đổi hiện trạng, bạn nên hiểu người dùng cần gì.
 
Mọi người bàn cãi nhiều mà sao không thấy "tác giả" nói gì nhỉ?
Ngoài những cách như trên, không biết truongduchoa còn muốn như thế nào khác không ?
 
Mình cảm ơn các bạn nhiều lắm. Vấn đề đó mình đã giải quyết được rồi từ sự giúp đỡ của các bạn
Nhưng hiện nay mình lại có 1 vấn đế mới phát sinh như sau :
Mình có 2 sheets:
Sheets 1 như sau :
ngày - số HĐ - mã hàng - so luong - Tình trạnh
01 - 123 - a - 10 - XB (Xuất bán)
01 - 123 - a - 5 - XKM (Xuất KM)
01 - 234 - b - 20 - XB
01 - 345 - a - 30 - XB
01 - 456 - b - 40 - XB
02 - 567 - a - 25 - XB
02 - 678 - b - 20 - XB
...

Mình muốn sheets 2 sẽ có kết quả như sau : sau khi mình chọn ngày cần xem
VD : mình chọn ngày 01
Mã hàng - Xuat bán - Xuất KM - TỔng CỘng
a - 40 - 5 - 45
b - 60 - 60


Mong các bạn chỉ giáo !
 
Hãy chọn ngày trong s2!B1

Mình có 2 sheets:
Sheets 1 như sau :
ngày - số HĐ - mã hàng - so luong - Tình trạnh
01 - 123 - a - 10 - XB (Xuất bán)
01 - 123 - a - 5 - XKM (Xuất KM)
01 - 234 - b - 20 - XB
01 - 345 - a - 30 - XB
01 - 456 - b - 40 - XB
02 - 567 - a - 25 - XB
02 - 678 - b - 20 - XB
...
Mình muốn sheets 2 sẽ có kết quả như sau : sau khi mình chọn ngày cần xem
VD : mình chọn ngày 01
Mã hàng - Xuat bán - Xuất KM - TỔng CỘng
a - 40 - 5 - 45
b - 60 - 60
Mong các bạn chỉ giáo !

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, [B1]) Is Nothing Then
   Dim Sh As Worksheet, Rng As Range
   Dim jJ As Long, eRw As Long
      
   Set Sh = Sheets("S1"):              eRw = Sh.[a65500].End(xlUp).Row + 5
   Set Rng = Sh.Range("A1:E" & eRw):   Application.ScreenUpdating = False
   
   Sh.Columns("F:N").EntireColumn.Hidden = False

   Rng.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sh.Range( _
        "G1:G2"), CopyToRange:=Sh.Range("G4:K4"), Unique:=False
   Set Rng = Sh.Range("H4:K" & eRw)
   Rng.Sort Key1:=Sh.[I5], Order1:=xlAscending, Key2:=Sh.[K5] _
      , Order2:=xlAscending, Key3:=Sh.[J5], Order3:=xlAscending, Header:=xlGuess
      
   Rng.Cells(1, 2).Resize(eRw).AdvancedFilter Action:=xlFilterCopy, _
      CopyToRange:=Sh.[M1], Unique:=True
   Range("A4:D" & eRw).ClearContents
   eRw = Sh.[M65500].End(xlUp).Row
   For jJ = 2 To eRw
      Sh.[j2].Value = Sh.Cells(jJ, "M").Value
      With [a65500].End(xlUp).Offset(1, 1)
         .Offset(, -1).Value = Sh.[j2].Value
         .Value = Sh.[h2].Value
         .Offset(, 1).Value = Sh.[l2].Value
         .Offset(, 2) = .Value + .Offset(, 1).Value
      End With
   Next jJ
   Sh.Columns("G:M").EntireColumn.Hidden = True
 End If
End Sub

(Lần sau bạn nên đưa file giả lập lên; Sẽ đỡ tốn thời gian bạn chờ đợi cũng như thời gian của Cộng đồng. Xin cảm ơn đã đọc)
 

File đính kèm

Cảm ơn bạn về sự giúp đỡ này !
Mình sẽ rút kinh nghiệm về các bài sau.
 
Đúng là không có dữ liệu nên cũng không xem thử. Mượn file của bác SA_DQ làm bằng công thức cho bạn tham khảo.
 

File đính kèm

Cho mình hỏi về hàm SumIf(a,b,c) và hàm Sum(If(d,1,0)*if(e,1,0)*...) mình không hiểu bao giờ thì dùng tuyệt đối các đối số khi nào không cần,bạn giải thích rõ về các hàm này giùm mình ?
 
Web KT

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

Back
Top Bottom