Cách lọc dữ liệu có điều kiện trong Macro (2 người xem)

Liên hệ QC

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

Có lẽ đã đúng cả 3 yêu cầu của bạn.

Trước tiên cảm ơn bạn đã bỏ thời gian ra giúp mình.
mong muốn 1: khi chọn vùng dữ liệu xong thì file name sẽ lấy luôn dữ liệu trong ô B2 của sheet hiện hành đó làm tên.
mm2: ok
mm3: ý mình muốn là khi click vào Cell A1 ở tất cả các sheet đều có thể hiển thị form.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cho phép mình gác lại file trên nhé:

giờ mình phải làm trực tiếp trên file nguồn, nhưng không biết phải làm thế nào
chi tiếp cụ thể nhờ các bạn xem trong file đính kemd giúp mình với nhé.

Mong nhận được sự giúp đỡ của các Thầy và các bạn.

tại file > hơn 1M nên mình đã up lên mediafire:
http://www.mediafire.com/download/7r2xz7ry2ioq95l/Material.xlsx
 
Cho phép mình gác lại file trên nhé:

giờ mình phải làm trực tiếp trên file nguồn, nhưng không biết phải làm thế nào
chi tiếp cụ thể nhờ các bạn xem trong file đính kemd giúp mình với nhé.

Mong nhận được sự giúp đỡ của các Thầy và các bạn.

tại file > hơn 1M nên mình đã up lên mediafire:
http://www.mediafire.com/download/7r2xz7ry2ioq95l/Material.xlsx

cột F==>chỉ có "plan", ko có "stock"
cột E==> "assay"
cột D==> ">0"
[TABLE="width: 402"]
[TR]
[TD]SU8E-10W01AI-01X[/TD]
[TD="align: right"]2600[/TD]
[TD]Assy3[/TD]
[TD]Plan[/TD]
[TD="align: right"]1380[/TD]
[/TR]
[TR]
[TD]SU8E-10W05MI-01A[/TD]
[TD="align: right"]4500[/TD]
[TD]Assy3[/TD]
[TD]Plan[/TD]
[TD="align: right"]1300[/TD]
[/TR]
[TR]
[TD]SU8C-12H03AS-01X[/TD]
[TD="align: right"]2600[/TD]
[TD]Assy3[/TD]
[TD]Plan[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]SU8C-12H04AS-01X[/TD]
[TD="align: right"]400[/TD]
[TD]Assy3[/TD]
[TD]Plan[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]SU6C-12H12AS-01X[/TD]
[TD="align: right"]848[/TD]
[TD]Assy1[/TD]
[TD]Plan[/TD]
[TD="align: right"]0[/TD]
[/TR]
[TR]
[TD]SU8E-11H04MI-01A[/TD]
[TD="align: right"]6000[/TD]
[TD]Assy3[/TD]
[TD]Plan[/TD]
[TD][/TD]
[/TR]
[/TABLE]
 
cột F==>chỉ có "plan", ko có "stock"
cột E==> "assay"
cột D==> ">0"
[TABLE="width: 402"]
[TR]
[TD]SU8E-10W01AI-01X[/TD]
[TD="align: right"]2600[/TD]
[TD]Assy3[/TD]
[TD]Plan[/TD]
[TD="align: right"]1380[/TD]
[/TR]
[TR]
[TD]SU8E-10W05MI-01A[/TD]
[TD="align: right"]4500[/TD]
[TD]Assy3[/TD]
[TD]Plan[/TD]
[TD="align: right"]1300[/TD]
[/TR]
[TR]
[TD]SU8C-12H03AS-01X[/TD]
[TD="align: right"]2600[/TD]
[TD]Assy3[/TD]
[TD]Plan[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]SU8C-12H04AS-01X[/TD]
[TD="align: right"]400[/TD]
[TD]Assy3[/TD]
[TD]Plan[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]SU6C-12H12AS-01X[/TD]
[TD="align: right"]848[/TD]
[TD]Assy1[/TD]
[TD]Plan[/TD]
[TD="align: right"]0[/TD]
[/TR]
[TR]
[TD]SU8E-11H04MI-01A[/TD]
[TD="align: right"]6000[/TD]
[TD]Assy3[/TD]
[TD]Plan[/TD]
[TD][/TD]
[/TR]
[/TABLE]

Với sheet ' 2 ' thì điều kiện lấy dữ liệu trong sheet ' Actual ' :
cột F==>chỉ lấy dữ liệu với "Stock"
cột E==>chỉ lấy dữ liệu với "assy"
cột D==> chỉ lấy dữ liệu với ">0"

Còn sheet ' 2-2' thì điều kiện lấy dữ liệu trong sheet 'Total 19.15'
Cột FK (stock balance...) lấy dữ liệu '>0'

Nhờ bạn giúp. cảm ơn bạn
 
Mã:
Public Sub helloAtual()
Dim lr As Long, rngC As Range, lrSheet1 As Long
lr = Sheet8.UsedRange.SpecialCells(xlCellTypeLastCell).Row
With Sheet1
    .[Z1].ClearContents
    .[Z2].Value = "=AND(ATual!D9>0,ATual!E9=""Assy"",ATual!F9=""Stock"")"
    Sheet8.Range("D8:F" & lr).AdvancedFilter xlFilterInPlace, .[Z1:Z2]
    On Error Resume Next
    Set rngC = Sheet8.Range("C9:C" & lr).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    If rngC Is Nothing Then Exit Sub
    lrSheet1 = WorksheetFunction.Max(.Range("C4").CurrentRegion.SpecialCells(xlCellTypeLastCell).Row, 5)
    .Range("C5:H" & lrSheet1).ClearContents
    rngC.Copy
    .[C5].PasteSpecial xlPasteValues
    Sheet8.Range("D9:D" & lr).SpecialCells(xlCellTypeVisible).Copy
    .[F5].PasteSpecial xlPasteValues
    lrSheet1 = .[F4].End(xlDown).Row
    .Range("D5:D" & lrSheet1).Value = 1111000570
    .Range("G5:G" & lrSheet1).Value = "CBU"
    .Range("E5:E" & lrSheet1).Value = Format(Date, "yyyyMMdd")
    .Range("H5:H" & lrSheet1).Value = Format(Date, "yyyyMMdd")
    Sheet8.Range("D8:F" & lr).AutoFilter
    .[Z2].ClearContents
End With
End Sub

Mã:
Public Sub hello0915()
Dim lr As Long, rngC As Range, lrS2 As Long
lr = Sheet4.UsedRange.SpecialCells(xlCellTypeLastCell).Row
Sheet4.Range("FJ7:FK" & lr).AutoFilter 2, ">0"
On Error Resume Next
Set rngC = Sheet4.Range("X8:X" & lr).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If rngC Is Nothing Then Exit Sub
With Sheet2
    lrS2 = WorksheetFunction.Max(.Range("C4").CurrentRegion.SpecialCells(xlCellTypeLastCell).Row, 5)
    .Range("C5:H" & lrS2).ClearContents
    rngC.Copy
    .[C5].PasteSpecial xlPasteValues
    Sheet4.Range("FK8:FK" & lr).SpecialCells(xlCellTypeVisible).Copy
    .[F5].PasteSpecial xlPasteValues
    lrS2 = .[F4].End(xlDown).Row
    .Range("D5:D" & lrS2).Value = 1111000570
    .Range("G5:G" & lrS2).Value = "CBU"
    .Range("E5:E" & lrS2).Value = Format(Date, "yyyyMMdd")
    .Range("H5:H" & lrS2).Value = Format(Date, "yyyyMMdd")
    Sheet4.Range("FJ7:FK" & lr).AutoFilter
End With
End Sub
 
Tuyệt thật,

Cám ơn bạn nhiều lắm.
doveandrose


có thể cho mình địa chỉ email hay cái gì đó liên lạc để nói chuyện được không?
 
Tuyệt thật,

Cám ơn bạn nhiều lắm.
doveandrose


có thể cho mình địa chỉ email hay cái gì đó liên lạc để nói chuyện được không?

chứ hiện tại bạn không liên lạc được với tôi ?
ngày nào tôi cũng vào diễn đàn . bạn muốn gì cứ việc ghi vào đây tự nhiên tôi biết
 
Tuyệt thật,

Cám ơn bạn nhiều lắm.
doveandrose


có thể cho mình địa chỉ email hay cái gì đó liên lạc để nói chuyện được không?
mong muốn 3 chép vào workSheet nha
Mã:
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If Not Intersect([A1:A1], Target) Is Nothing Then
    With UserForm1
      .StartUpPosition = 0
      .Top = [D18].Top - 50
      .Left = [D18].Left + 20
      .Show
    End With
  End If
End Sub
 
Lần chỉnh sửa cuối:
mong muốn 3 chép vào workSheet nha
Mã:
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If Not Intersect([A1:A1], Target) Is Nothing Then
    With UserForm1
      .StartUpPosition = 0
      .Top = [D18].Top - 50
      .Left = [D18].Left + 20
      .Show
    End With
  End If
End Sub

cám ơn langtuchungtinh nhé, mình đã làm theo và ok
 
chứ hiện tại bạn không liên lạc được với tôi ?
ngày nào tôi cũng vào diễn đàn . bạn muốn gì cứ việc ghi vào đây tự nhiên tôi biết

hi, cám ơn bạn.

mình có 2 sheet nữa cần convert dữ liệu, các bạn giúp mình nhé:
Vì file > 1 MB nên mình up lên mediafire, các bạn down về giúp mình.
2 sheet 2 và 2-2 mình đã làm theo và ok. còn sheet 6, 7 nhờ bạn.

http://www.mediafire.com/download/b654r651qhxaxhq/Material_New.xlsm
 
hi, cám ơn bạn.

mình có 2 sheet nữa cần convert dữ liệu, các bạn giúp mình nhé:
Vì file > 1 MB nên mình up lên mediafire, các bạn down về giúp mình.
2 sheet 2 và 2-2 mình đã làm theo và ok. còn sheet 6, 7 nhờ bạn.

http://www.mediafire.com/download/b654r651qhxaxhq/Material_New.xlsm

các cột PLAN_START_DATE ,PLAN_END_DATE,QTY lấy đâu ra mà dữ liệu lên tới tháng 9 ????
 
Đấy là dữ liệu mình dán để mình họa, mình lấy từ dữ liệu mình test.
Theo file thì nó là tháng 7 cậu nhé

Mã:
Public Sub hello6()
hello67 Sheet5
End Sub

Mã:
Public Sub hello67(targetWS As Worksheet, Optional ByVal endDate As Variant, _
Optional ByVal startRow As Integer = 5, Optional ByVal startCol As String = "C")
Dim lr As Long, arr As Variant, r As Long, c As Long, k As Long, arrRS As Variant, today As Variant
lr = Sheet8.UsedRange.SpecialCells(xlCellTypeLastCell).Row
arr = Sheet8.Range("C8:AM" & lr).Value
today = Format(Date, "yyyyMMdd")
If IsMissing(endDate) Then endDate = Sheet8.[AM8].Value
If IsEmpty(endDate) Then endDate = -1
ReDim arrRS(1 To 500000, 1 To 6)
For r = 2 To UBound(arr) Step 1
    If arr(r, 4) = "Stock" Then
        If InStr(arr(r, 3), "Assy") > 0 Then
            If IsNumeric(arr(r, 2)) Then
                If arr(r, 2) > 0 Then
                    For c = 6 To UBound(arr, 2) Step 1
                        If arr(1, c) <= endDate Then
                            If IsNumeric(arr(r, c)) Then
                                If arr(r, c) > 0 Then
                                    k = k + 1
                                    arrRS(k, 1) = arr(r, 1)
                                    arrRS(k, 2) = 1111000570
                                    arrRS(k, 3) = arr(1, c)
                                    arrRS(k, 4) = arr(1, c)
                                    arrRS(k, 5) = arr(r, c)
                                    arrRS(k, 6) = today
                                End If
                            End If
                        End If
                    Next
                End If
            End If
        End If
    End If
Next
With targetWS
    lr = WorksheetFunction.Max(.Range(startCol & startRow - 1).CurrentRegion.SpecialCells(xlCellTypeLastCell).Row, startRow)
    .Range(startCol & startRow & ":" & startCol & lr).Resize(, 6).ClearContents
    If k > 0 Then .Range(startCol & startRow).Resize(k, 6) = arrRS
End With
End Sub

trong cửa số VBA double-click vào Sheet6(7) dán cái này vào
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$2" Then
    hello67 Sheet6, Target.Value, 7, "B"
End If
End Sub
 
Sheet 6 mình chạy ok , nhưng sheet7 thì báo lỗi cậu ạ Capture.JPG
 
Lọc hay quá! Lúc nào mình nhờ lại các bạn lọc giúp mình file ngày xưa mình không làm được trên Access nhé!
 
cái sub hello67 là để dùng chung giữa 2 sheet "6" và "7"
nên phải chèn thêm 1 module mới
bỏ sub hello67 vào trong module mới đó

Dovean, cậu kiểm tra lại điều kiện lấy giúp mình, 2 sheet này điều kiện là khác nhau nên mình nghĩ code chỉ đúng với sheet "6" mà không đúng với sheet "7"

[TABLE="width: 422"]
[TR]
[TD]Điều kiện lọc DL của sheet "7"
Convert từ sheet Atual[/TD]
[/TR]
[TR]
[TD]Điều kiện lấy dữ liệu :[/TD]
[/TR]
[TR]
[TD] Cột F8 : lấy dữ liệu với Actual[/TD]
[/TR]
[TR]
[TD] Cột E8 lấy dữ liệu với Assy (Riêng assy không thôi chứ không có assy1,2,3..)[/TD]
[/TR]
[TR]
[TD]Vùng dữ liệu là : H8 : AM:8[/TD]
[/TR]
[TR]
[TD][/TD]
[/TR]
[TR]
[TD]Mong muốn : Khi người dùng chọn ngày tháng thì sẽ list các dữ[/TD]
[/TR]
[TR]
[TD]liệu từ ngày được chọn trở về đầu tháng có trong[/TD]
[/TR]
[TR]
[TD]vùng dữ liệu tương ứng với item trong Cột C[/TD]
[/TR]
[TR]
[TD][/TD]
[/TR]
[TR]
[TD]Ví dụ : mình chọn ngày tháng là 20150712 thì sẽ list[/TD]
[/TR]
[TR]
[TD] tất cả các dữ liệu từ ngày 12/7 trở về 30/06[/TD]
[/TR]
[TR]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[/TR]
[/TABLE]
 
Web KT

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

Back
Top Bottom