lọc dữ liệu với nhiều điều kiện và nhiều dữ liệu

Liên hệ QC

index2010

Thành viên mới
Tham gia
26/4/09
Bài viết
14
Được thích
0
Xin chào các anh chị
Tôi có một vấn đề cần nhờ sự giúp đỡ của diễn đàn.
Tôi muốn thực hiện 1 report để theo dõi tình trạng mua bán của 1 khách hàng (xem file đính kèm)
Vấn đề này có thể giải quyết bằng cách làm thủ công là filter sau đó copy and paste đến một sheet khác. tuy nhien cách này rất mất thời gian với 1 tệp dữ liệu tuong đối lớn và không smart lắm. Do vậy mong các anh chị chỉ giáo cho 1 đoạn code or 1 cách làm để tôi có thể thực hiện được công việc và học hỏi thêm.
Bên cạnh đó tôi cũng đang mày mò tự học viết marco and visual basic trong Excel va Access (Excel truoc) de thuc hien công việc quản lý của mình nên mong các anh chị giới thiệu cách học nhanh nhất cũng như một số bài code cụ thê có kèm minh hoạ. Tôi đang bat đầu mày mò với sách "Lap trinh với VBA trong Excel" của Anh Phan Tư Hướng. Quite newbie.
Trân trọng
 

File đính kèm

  • TEST.xls
    24 KB · Đọc: 215
Xin chào các anh chị
Tôi có một vấn đề cần nhờ sự giúp đỡ của diễn đàn.
Tôi muốn thực hiện 1 report để theo dõi tình trạng mua bán của 1 khách hàng (xem file đính kèm)
Vấn đề này có thể giải quyết bằng cách làm thủ công là filter sau đó copy and paste đến một sheet khác. tuy nhien cách này rất mất thời gian với 1 tệp dữ liệu tuong đối lớn và không smart lắm. Do vậy mong các anh chị chỉ giáo cho 1 đoạn code or 1 cách làm để tôi có thể thực hiện được công việc và học hỏi thêm.
Bên cạnh đó tôi cũng đang mày mò tự học viết marco and visual basic trong Excel va Access (Excel truoc) de thuc hien công việc quản lý của mình nên mong các anh chị giới thiệu cách học nhanh nhất cũng như một số bài code cụ thê có kèm minh hoạ. Tôi đang bat đầu mày mò với sách "Lap trinh với VBA trong Excel" của Anh Phan Tư Hướng. Quite newbie.
Trân trọng
Vậy thì tạo cái nút chép code này vào cho nó "zồ" tí nhé
Mã:
Private Sub CommandButton1_Click()
 Range("b5:h100").ClearContents
    With Sheets("data").Range("a1:g1000")
        .AutoFilter Field:=3, Criteria1:=Range("kh")
        .Copy [b5]
        .AutoFilter
    End With
End Sub
 

File đính kèm

  • TEST1111.rar
    13.8 KB · Đọc: 388
Nếu không thích VBA thì tham khảo file này
 

File đính kèm

  • report.xls
    47.5 KB · Đọc: 533
Xin cam on ban. De minh xem va hỏi lại ban sau nhé.
Big thanks again
 
Xin chao concogia,
Cam on rat nhieu, lan dau tien da nhan duoc su support của các anh chị trên forum.
Se cố gắng học hỏi từ các anh chị,
 
Them mot cach su dung khac bang hàm. Tuyet cú mèo.
Cam on nhieu.
Biển học thật mênh mông.
Học mấy trò này cảm thấy vui hơn di nhậu đấy he he
 
Them mot cach su dung khac bang hàm. Tuyet cú mèo.
Cam on nhieu.
Biển học thật mênh mông.
Học mấy trò này cảm thấy vui hơn di nhậu đấy he he
Làm bài này nếu gọi là tuyệt cú mèo nhất thì đó phải là PIVOTTABLE ---> Bạn đã thử chưa? (không code, không công thức)
 
Kinh chao bac
Pak co the post len cho em tham khao them.
Tuy nhien e so so luong transaction kha nhieu, khoang 50,000 - 70,000 row phai xu ly hang ngay. E nghi co the viet code thi xu ly nhanh hon chang?
Them nua day chi moi la 1 cong doan trong y tuong xu ly van de cua e
Mong pak chi giao them.
 
Kinh chao bac
Pak co the post len cho em tham khao them.
Bạn viết lại bài nhé - gõ tiếng Việt có dấu - nếu không sẽ bị xóa
Cái PivotTable này bạn dat_butmuc làm rất oách ---> Để bạn ấy làm giúp bạn nhé
---------------------------
Tuy nhien e so so luong transaction kha nhieu, khoang 50,000 - 70,000 row phai xu ly hang ngay. E nghi co the viet code thi xu ly nhanh hon chang?
Hãy tin rằng những công cụ có sẳn luôn là nhanh nhất
 
Kinh chao bac
Pak co the post len cho em tham khao them.
Tuy nhien e so so luong transaction kha nhieu, khoang 50,000 - 70,000 row phai xu ly hang ngay. E nghi co the viet code thi xu ly nhanh hon chang?
Them nua day chi moi la 1 cong doan trong y tuong xu ly van de cua e
Mong pak chi giao them.

Bạn xem file - có thể sử dụng đến 50,000 dòng (tôi đã đặt name động, nếu lớn hơn có thể chỉnh dữ liệu tùy dữ liệu của bạn)


Cái PivotTable này bạn dat_butmuc làm rất oách ---> Để bạn ấy làm giúp bạn nhé
To Ndu: có nhất thiết là phải "bán cái" không vậy? Những thứ này tôi còn phải học Bác, Bác lại paste sang không hà !
 

File đính kèm

  • TEST(1).xls
    32.5 KB · Đọc: 287
Bạn xem file - có thể sử dụng đến 50,000 dòng (tôi đã đặt name động, nếu lớn hơn có thể chỉnh dữ liệu tùy dữ liệu của bạn)
To Ndu: có nhất thiết là phải "bán cái" không vậy? Những thứ này tôi còn phải học Bác, Bác lại paste sang không hà !
Cám ơn bác nhiều, hôm nay mình mới vào lại, Cac anh chi nhiệt tình quá.
Cám ơn
 
Vậy thì tạo cái nút chép code này vào cho nó "zồ" tí nhé
Mã:
Private Sub CommandButton1_Click()
 Range("b5:h100").ClearContents
    With Sheets("data").Range("a1:g1000")
        .AutoFilter Field:=3, Criteria1:=Range("kh")
        .Copy [b5]
        .AutoFilter
    End With
End Sub

Các bác ơi
Giúp mình thêm 1 tí nữa nào. Sau khi có sheet report rồi thì phát sinh thêm yêu cầu nữa la chia thành 2 sheet, 1 sheet la Mua, trong đó tập hợp mỗi một mã sẽ chỉ xuất hiện 1 lần, phần khối lượng và giá trị là sumif của từng mã hàng hoá, giá thì lấy trung bình. Tương tư chi sheet Bán,
Xem thêm file đính kèm.
Trân trọng
 

File đính kèm

  • TEST1112.xls
    78.5 KB · Đọc: 66
Các bác ơi
Giúp mình thêm 1 tí nữa nào. Sau khi có sheet report rồi thì phát sinh thêm yêu cầu nữa la chia thành 2 sheet, 1 sheet la Mua, trong đó tập hợp mỗi một mã sẽ chỉ xuất hiện 1 lần, phần khối lượng và giá trị là sumif của từng mã hàng hoá, giá thì lấy trung bình. Tương tư chi sheet Bán,
Xem thêm file đính kèm.
Trân trọng

Sao không thấy ai giúp mình cái này với nhỉ. Chắc các anh chị lại busy qua rồi
 
Sao không thấy ai giúp mình cái này với nhỉ. Chắc các anh chị lại busy qua rồi
Cái này không một tí đâu
Chẳng hiểu giá bạn tính như thế nào nên giá.."hổng" làm (bạn tự thêm vào trong code theo cách tính của bạn)
Cái "nào" hiểu thì làm cái .."nào" thôi
Chép cái này vào cái nút
Mã:
Private Sub CommandButton1_Click()
 Range("b5:h100").ClearContents
    With Sheets("data").Range("a1:g1000")
        .AutoFilter Field:=3, Criteria1:=Range("kh")
        .Copy [b5]
        .AutoFilter
    End With
        With Range([b5], [h500].End(xlUp))
            .AutoFilter Field:=1, Criteria1:="BUY"
            .SpecialCells(xlCellTypeVisible).Copy Sheets("buy").Range("B3")
            .AutoFilter Field:=1, Criteria1:="sell"
            .SpecialCells(xlCellTypeVisible).Copy Sheets("sold").Range("B3")
            .AutoFilter
        End With
             With Sheets("buy").Range("buycat")
                .Offset(0, 6).FormulaR1C1 = "=SUMIF(buycat,RC[-6],buyKL)"
                .Offset(0, 6).Value = .Offset(0, 6).Value
                .Offset(0, 6).Cut .Offset(0, 2)
                .Offset(0, 7).FormulaR1C1 = "=SUMIF(buycat,RC[-7],buyGT)"
                .Offset(0, 7).Value = .Offset(0, 7).Value
                .Offset(0, 7).Cut .Offset(0, 4)
             End With
                With Sheets("buy")
                    Dim i As Long, Cll
                    Set Cll = Sheets("buy").Range("buycat")
                        For i = Cll.Rows.Count To 1 Step -1
                        If Application.WorksheetFunction.CountIf(Cll, Cll(i)) > 1 Then Sheets("buy").Rows(i + 3).Delete
                        Next
                End With
                    With Sheets("sold").Range("soldcat")
                        .Offset(0, 6).FormulaR1C1 = "=SUMIF(soldcat,RC[-6],soldKL)"
                        .Offset(0, 6).Value = .Offset(0, 6).Value
                        .Offset(0, 6).Cut .Offset(0, 2)
                        .Offset(0, 7).FormulaR1C1 = "=SUMIF(soldcat,RC[-7],soldGT)"
                        .Offset(0, 7).Value = .Offset(0, 7).Value
                        .Offset(0, 7).Cut .Offset(0, 4)
                    End With
        With Sheets("sold")
            Dim j As Long, Cl
            Set Cl = Sheets("sold").Range("soldcat")
                 For j = Cl.Rows.Count To 1 Step -1
                     If Application.WorksheetFunction.CountIf(Cl, Cl(j)) > 1 Then Sheets("sold").Rows(j + 3).Delete
                 Next
       End With
End Sub
 
Còn đây là ứng dụng DSUM() trong VBA

Sao không thấy ai giúp mình cái này với nhỉ. Chắc các anh chị lại busy qua rồi

PHP:
Option Explicit
Sub Buy()
 Dim WF, Sh As Worksheet, Cls As Range, Rng As Range
 Dim sCat As String, Cat As String
 Dim Rws As Long
  
 Set Sh = Sheets("buy"):               Sheets("Report").Select
 sCat = "GPE":                         Sh.[B3].CurrentRegion.Offset(1).Clear
 Set WF = Application.WorksheetFunction
 Set Rng = [b5].CurrentRegion:         Rws = Rng.Rows.Count
 For Each Cls In Range([B6], [b65500].End(xlUp))
   If UCase(Cls.Value) = "BUY" Then
      Cat = Cls.Offset(, 1).Value
      If InStr(sCat, Cat) < 1 Then
         sCat = sCat & Cat:            [iB2].Value = Cat
         With Sh.[b65500].End(xlUp).Offset(1)
            .Resize(, 7).Value = Cls.Resize(, 7).Value
            .Offset(, 3).Value = WF.DSum(Rng, [e5], Range("IA1:IB2"))
            .Offset(, 5).Value = WF.DSum(Rng, [G5], Range("IA1:IB2"))
         End With
      Else
      End If
   End If
 Next Cls
 Sh.Select
End Sub
 

File đính kèm

  • GPE.rar
    15.6 KB · Đọc: 88
Lần chỉnh sửa cuối:
Cái này không một tí đâu
Chẳng hiểu giá bạn tính như thế nào nên giá.."hổng" làm (bạn tự thêm vào trong code theo cách tính của bạn)
Cái "nào" hiểu thì làm cái .."nào" thôi
Chép cái này vào cái nút
Mã:
Private Sub CommandButton1_Click()
 Range("b5:h100").ClearContents
    With Sheets("data").Range("a1:g1000")
        .AutoFilter Field:=3, Criteria1:=Range("kh")
        .Copy [b5]
        .AutoFilter
    End With
        With Range([b5], [h500].End(xlUp))
            .AutoFilter Field:=1, Criteria1:="BUY"
            .SpecialCells(xlCellTypeVisible).Copy Sheets("buy").Range("B3")
            .AutoFilter Field:=1, Criteria1:="sell"
            .SpecialCells(xlCellTypeVisible).Copy Sheets("sold").Range("B3")
            .AutoFilter
        End With
             With Sheets("buy").Range("buycat")
                .Offset(0, 6).FormulaR1C1 = "=SUMIF(buycat,RC[-6],buyKL)"
                .Offset(0, 6).Value = .Offset(0, 6).Value
                .Offset(0, 6).Cut .Offset(0, 2)
                .Offset(0, 7).FormulaR1C1 = "=SUMIF(buycat,RC[-7],buyGT)"
                .Offset(0, 7).Value = .Offset(0, 7).Value
                .Offset(0, 7).Cut .Offset(0, 4)
             End With
                With Sheets("buy")
                    Dim i As Long, Cll
                    Set Cll = Sheets("buy").Range("buycat")
                        For i = Cll.Rows.Count To 1 Step -1
                        If Application.WorksheetFunction.CountIf(Cll, Cll(i)) > 1 Then Sheets("buy").Rows(i + 3).Delete
                        Next
                End With
                    With Sheets("sold").Range("soldcat")
                        .Offset(0, 6).FormulaR1C1 = "=SUMIF(soldcat,RC[-6],soldKL)"
                        .Offset(0, 6).Value = .Offset(0, 6).Value
                        .Offset(0, 6).Cut .Offset(0, 2)
                        .Offset(0, 7).FormulaR1C1 = "=SUMIF(soldcat,RC[-7],soldGT)"
                        .Offset(0, 7).Value = .Offset(0, 7).Value
                        .Offset(0, 7).Cut .Offset(0, 4)
                    End With
        With Sheets("sold")
            Dim j As Long, Cl
            Set Cl = Sheets("sold").Range("soldcat")
                 For j = Cl.Rows.Count To 1 Step -1
                     If Application.WorksheetFunction.CountIf(Cl, Cl(j)) > 1 Then Sheets("sold").Rows(j + 3).Delete
                 Next
       End With
End Sub

Bác concogia ơi
Cho tui hỏi chút xíu, bác define name của cai range "buycat" ở dãy nào trong sheet "buy". Tương tự là "soldcat"
Tui chạy nó báo lỗi chỗ cái name này.
Cám ơn bác nhiều. Mong bác trả lời thât sớm vì tui cũng cần gấp lắm.
 
Bác concogia ơi
Cho tui hỏi chút xíu, bác define name của cai range "buycat" ở dãy nào trong sheet "buy". Tương tự là "soldcat"
Tui chạy nó báo lỗi chỗ cái name này.
Cám ơn bác nhiều. Mong bác trả lời thât sớm vì tui cũng cần gấp lắm.
"Xó- zì", mình quên kèm file cho bạn
Đừng buồn nhé
 

File đính kèm

  • TEST-uni.rar
    18.9 KB · Đọc: 58
"Xó- zì", mình quên kèm file cho bạn

Đừng buồn nhé

Cám ơn bác concogia,
Mình xin làm rõ thêm 1 số ý sau:
1. Trong sheet "buy" thì mình sẽ làm việc so sánh lãi lỗ giữa giá mua của từng mã hàng so với giá của mã hàng đó trên thị trường thì tôi có thể update bằng vlookup đươc. Còn gía ỏ sheet "buy" chính là giá bình quân gia quyền tính bằng tổng giá trị mua chia cho tổng khối lượng mua.
2. Trong sheet "sold" thì việc so sánh thực tế lãi lỗ giữa giá bán thực tế của từng mã hànng sẽ được so sánh với giá bình quân gia quyền mua của chính mã hàng đó của các đợt mua trước. Ví dụ mã hàng ABC bán 100 đơn vị với giá 15, bình quân gia quyền giá mua của mã ABC được tham chiếu chính từ sheet "buy".
3. Bác có thể giải thích cụ thể đoạn code. Tôi có paste lên đây để nhờ bác chỉ giáo thêm.
Private Sub CommandButton1_Click()
Range("b5:h100").ClearContents ” Xóa nội dung ở vùng b5:h100”
With Sheets("data").Range("a1:g1000") “ Chọn vùng a1:g1000 ở sheet “data”
.AutoFilter Field:=3, Criteria1:=Range("kh") “ Lọc theo điều kiện “kh” với nội dung ở vùng a1:g1000”
.Copy [b5] “Copy sang ô b5 của sheet “report”, sao tôi chua thấy đoạn code copy nội dung rồi mới paste sang ô b5 tại sheet “report”
.AutoFilter “ chưa hiểu”
End With
With Range([b5], [h500].End(xlUp))
.AutoFilter Field:=1, Criteria1:="BUY"
.SpecialCells(xlCellTypeVisible).Copy Sheets("buy").Range("B3") “chưa hiểu rõ”
.AutoFilter Field:=1, Criteria1:="sell"
.SpecialCells(xlCellTypeVisible).Copy Sheets("sold").Range("B3")
.AutoFilter
End With
With Sheets("buy").Range("buycat")
.Offset(0, 6).FormulaR1C1 = "=SUMIF(buycat,RC[-6],buyKL)" “chưa hiểu rõ, tôi chỉ hiểu hàm sumif là theo vùng buycat và vùng buyKL nhưng chưa hiểu tham chiếu RC[-6] cũng như offset(0,6).FormularR1C1. Tôi chưa rõ là offset (0,6) la so với cell nào, activecell?


.Offset(0, 6).Value = .Offset(0, 6).Value “chưa hiểu rõ”
.Offset(0, 6).Cut .Offset(0, 2) “chưa hiểu rõ”
.Offset(0, 7).FormulaR1C1 = "=SUMIF(buycat,RC[-7],buyGT)" “chưa hiểu rõ”
.Offset(0, 7).Value = .Offset(0, 7).Value “chưa hiểu rõ”
.Offset(0, 7).Cut .Offset(0, 4) “chưa hiểu rõ”
End With
With Sheets("buy")
Dim i As Long, Cll “chưa hiểu rõ”

Set Cll = Sheets("buy").Range("buycat") “chưa hiểu rõ”

For i = Cll.Rows.Count To 1 Step -1 “chưa hiểu rõ”

If Application.WorksheetFunction.CountIf(Cll, Cll(i)) > 1 Then Sheets("buy").Rows(i + 3).Delete “chưa hiểu rõ”

Next
End With
With Sheets("sold").Range("soldcat")
.Offset(0, 6).FormulaR1C1 = "=SUMIF(soldcat,RC[-6],soldKL)"
.Offset(0, 6).Value = .Offset(0, 6).Value
.Offset(0, 6).Cut .Offset(0, 2)
.Offset(0, 7).FormulaR1C1 = "=SUMIF(soldcat,RC[-7],soldGT)"
.Offset(0, 7).Value = .Offset(0, 7).Value
.Offset(0, 7).Cut .Offset(0, 4)
End With
With Sheets("sold")
Dim j As Long, Cl
Set Cl = Sheets("sold").Range("soldcat")
For j = Cl.Rows.Count To 1 Step -1
If Application.WorksheetFunction.CountIf(Cl, Cl(j)) > 1 Then Sheets("sold").Rows(j + 3).Delete
Next
End With
End Sub
 
Xin chào các anh chị
Tôi có một vấn đề cần nhờ sự giúp đỡ của diễn đàn.
Tôi muốn thực hiện 1 report để theo dõi tình trạng mua bán của 1 khách hàng (xem file đính kèm)
Vấn đề này có thể giải quyết bằng cách làm thủ công là filter sau đó copy and paste đến một sheet khác. tuy nhien cách này rất mất thời gian với 1 tệp dữ liệu tuong đối lớn và không smart lắm. Do vậy mong các anh chị chỉ giáo cho 1 đoạn code or 1 cách làm để tôi có thể thực hiện được công việc và học hỏi thêm.
Bên cạnh đó tôi cũng đang mày mò tự học viết marco and visual basic trong Excel va Access (Excel truoc) de thuc hien công việc quản lý của mình nên mong các anh chị giới thiệu cách học nhanh nhất cũng như một số bài code cụ thê có kèm minh hoạ. Tôi đang bat đầu mày mò với sách "Lap trinh với VBA trong Excel" của Anh Phan Tư Hướng. Quite newbie.
Trân trọng

Bạn cài A-Tools Free
http://www.bluesofts.net/Products/AddIns/A-Tools/A-Tools_Free.exe

Sau khi cài xong, bạn tải file tôi đính kèm rồi mở ra. Để học cách làm, bạn hãy xem các video clip trong trang tôi gửi, và đọc tài liệu hướng dẫn đi kèm.
 

File đính kèm

  • TEST.xls
    31 KB · Đọc: 54
Bac concogia oi
Đợi bác mấy hôm này rồi, giúp mình thêm môt tí nữa đi.
Cám ơn
 
Web KT
Back
Top Bottom