Lọc sinh nhật

Liên hệ QC

BuiQuangThuan

❆❆❆❆❆❆❆❆❆❆❆❆
Tham gia
17/12/10
Bài viết
2,477
Được thích
2,933
Giới tính
Nam
Chào các thầy cô.
Hiện tại em đang có công việc mà chưa thông
Mong mọi người chỉ giúp ạ
Đầu vào em có 2 file:
1- file data (gồm sheet Master) chứa dữ liệu
2- file Form chứ kết quả sau khi lọc (Hình minh họa)1589981622743.png
Mục đích: Lọc ra các nhân viên có ngày tháng sinh nhật từ ngày A đến ngày B với điều kiện vẫn đi làm bình thường
Ban đầu em có ý định là lấy dữ liệu từ file data. Sau đó lọc theo điều kiện từ ngày tháng A đến ngày tháng B ( do Kỳ tính lương của công ty từ nửa tháng nọ tới nửa tháng kia chứ không phải là 1 tháng nguyên)
Nhưng vướng cái em không tìm được điều kiện thích hợp để làm (+ khó quá)
Sau đó có chuyển hướng lọc theo tháng và có viết được đoạn code sau:
Mã:
Sub ABC()
  Dim cn As Object, rs As Object
  Dim sFile, oFile, sh As Worksheet, S, fRow&, eRow&
  Dim sArr(), Res(), i&, sR&, tmp$, K&
  Application.ScreenUpdating = False
  Set sh = Sheets("Sinh Nhat")
  With sh
  eRow = .Range("B" & Rows.Count).End(xlUp).Row
  tmp = .Range("D3").Value
  End With
  If eRow >= 5 Then sh.Range("A6:G10000").ClearContents
 
  sFile = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls*),*.xlsx", _
                                        Title:="Select File", MultiSelect:=True)
  If VarType(sFile) = vbBoolean Then MsgBox ("Chua chon File du lieu"): Exit Sub
  Set cn = CreateObject("adodb.connection")
  For Each oFile In sFile
    If Val(Application.Version) < 12 Then
      cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & oFile & ";Extended Properties=""Excel 8.0;HDR=No"";")
    Else
      cn.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & oFile & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";")
    End If
    fRow = sh.Range("D" & Rows.Count).End(xlUp).Row + 1
    Set rs = cn.Execute("select * from [Master$C5:P65000] where f2 is not null")
    If Not rs.EOF() Then
      sArr = rs.GetRows
      sR = UBound(sArr, 2)
      ReDim Res(0 To sR, 0 To 6)
      For i = 0 To sR
        If Month(sArr(10, i)) = tmp Then
            If sArr(6, i) = "" Then
                K = K + 1
                Res(K - 1, 0) = K:
                Res(K - 1, 1) = sArr(0, i): Res(K - 1, 2) = sArr(1, i)
                Res(K - 1, 3) = sArr(10, i): Res(K - 1, 6) = sArr(7, i)
            End If
        End If
      Next i
    End If
    rs.Close:    cn.Close
    If K > 0 Then sh.Range("A6:G6").Resize(K) = Res
  Next
  Set cn = Nothing: Set rs = Nothing
  Application.ScreenUpdating = True
End Sub
Khi em có thêm điều kiện
Mã:
 If sArr(6, i) = "" Then
Thì thấy chạy đoạn code trên không có động tĩnh gì cả mà không biết đang bị sai chỗ nào.
Vậy nên nhờ thầy cô chỉ giúp là em đang làm sai chỗ nào được không ạ
Nếu có thể thì gợi ý giúp em theo hướng từ ngày tháng A đến ngày tháng B với.
Em xin cám ơn nhiều
 

File đính kèm

  • data.xlsb
    9 KB · Đọc: 13
  • Form1.xlsb
    20.8 KB · Đọc: 13
Chào các thầy cô.
Hiện tại em đang có công việc mà chưa thông
Mong mọi người chỉ giúp ạ
Đầu vào em có 2 file:
1- file data (gồm sheet Master) chứa dữ liệu
2- file Form chứ kết quả sau khi lọc (Hình minh họa)View attachment 237685
Mục đích: Lọc ra các nhân viên có ngày tháng sinh nhật từ ngày A đến ngày B với điều kiện vẫn đi làm bình thường
Ban đầu em có ý định là lấy dữ liệu từ file data. Sau đó lọc theo điều kiện từ ngày tháng A đến ngày tháng B ( do Kỳ tính lương của công ty từ nửa tháng nọ tới nửa tháng kia chứ không phải là 1 tháng nguyên)
Nhưng vướng cái em không tìm được điều kiện thích hợp để làm (+ khó quá)
Sau đó có chuyển hướng lọc theo tháng và có viết được đoạn code sau:
Mã:
Sub ABC()
  Dim cn As Object, rs As Object
  Dim sFile, oFile, sh As Worksheet, S, fRow&, eRow&
  Dim sArr(), Res(), i&, sR&, tmp$, K&
  Application.ScreenUpdating = False
  Set sh = Sheets("Sinh Nhat")
  With sh
  eRow = .Range("B" & Rows.Count).End(xlUp).Row
  tmp = .Range("D3").Value
  End With
  If eRow >= 5 Then sh.Range("A6:G10000").ClearContents

  sFile = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls*),*.xlsx", _
                                        Title:="Select File", MultiSelect:=True)
  If VarType(sFile) = vbBoolean Then MsgBox ("Chua chon File du lieu"): Exit Sub
  Set cn = CreateObject("adodb.connection")
  For Each oFile In sFile
    If Val(Application.Version) < 12 Then
      cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & oFile & ";Extended Properties=""Excel 8.0;HDR=No"";")
    Else
      cn.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & oFile & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";")
    End If
    fRow = sh.Range("D" & Rows.Count).End(xlUp).Row + 1
    Set rs = cn.Execute("select * from [Master$C5:P65000] where f2 is not null")
    If Not rs.EOF() Then
      sArr = rs.GetRows
      sR = UBound(sArr, 2)
      ReDim Res(0 To sR, 0 To 6)
      For i = 0 To sR
        If Month(sArr(10, i)) = tmp Then
            If sArr(6, i) = "" Then
                K = K + 1
                Res(K - 1, 0) = K:
                Res(K - 1, 1) = sArr(0, i): Res(K - 1, 2) = sArr(1, i)
                Res(K - 1, 3) = sArr(10, i): Res(K - 1, 6) = sArr(7, i)
            End If
        End If
      Next i
    End If
    rs.Close:    cn.Close
    If K > 0 Then sh.Range("A6:G6").Resize(K) = Res
  Next
  Set cn = Nothing: Set rs = Nothing
  Application.ScreenUpdating = True
End Sub
Khi em có thêm điều kiện
Mã:
 If sArr(6, i) = "" Then
Thì thấy chạy đoạn code trên không có động tĩnh gì cả mà không biết đang bị sai chỗ nào.
Vậy nên nhờ thầy cô chỉ giúp là em đang làm sai chỗ nào được không ạ
Nếu có thể thì gợi ý giúp em theo hướng từ ngày tháng A đến ngày tháng B với.
Em xin cám ơn nhiều
Thử sửa.
Mã:
If sArr(6, i) = "" Then
thành thế này xem sao.
Mã:
If TypeName(sArr(6, i)) = "Null" Then
 
Upvote 0
Thử sửa.
Mã:
If sArr(6, i) = "" Then
thành thế này xem sao.
Mã:
If TypeName(sArr(6, i)) = "Null" Then
Lúc viết em cũng thử các kiểu null rồi empy mà nó cứ trơ ra. Vâng. Để mai em thử. Cám ơn anh nhiều ạ. Ngoài cách đó ra em muốn lọc theo dạng ngày tháng A đến ngày tháng B có khả thi không anh?
 
Upvote 0
Lúc viết em cũng thử các kiểu null rồi empy mà nó cứ trơ ra. Vâng. Để mai em thử. Cám ơn anh nhiều ạ. Ngoài cách đó ra em muốn lọc theo dạng ngày tháng A đến ngày tháng B có khả thi không anh?

Bạn đã dùng ADO để lấy dữ liệu sao không cho điều kiện lọc vô câu lệnh "SELECT..." luôn cho nhanh.
Vd: "Select * From TenRange Where [ConLamViec]=True And (NgaySinh Between ... And...)"
Tôi thấy nhiều bạn thích dùng "HDR=No" và dùng các tên Field đại diện như F1, F2, F3...nhỉ. Cái này giống giống cái gọi là "magic number" khi dùng cho các tham số của câu lệnh ADO. Tôi thấy nó không tường minh gì cả. Sau này khi cái nguồn dữ liệu thay đổi thứ tự các cột, đi kiếm cái F2, F3 là gì cột nào cũng mất thời gian.
 
Upvote 0
Thì sửa chổ.
Mã:
If Month(sArr(10, i)) = tmp Then
Nhưng nó dính cả phần ngày nữa anh ạ. Chẳng hạn em muốn lọc từ ngày 15/05 đến ngày 15/06. Mà tính sửa chỗ như anh nói. Lại thấy nó sai sai gì ấy ạ
Bài đã được tự động gộp:

Bạn đã dùng ADO để lấy dữ liệu sao không cho điều kiện lọc vô câu lệnh "SELECT..." luôn cho nhanh.
Vd: "Select * From TenRange Where [ConLamViec]=True And (NgaySinh Between ... And...)"
Tôi thấy nhiều bạn thích dùng "HDR=No" và dùng các tên Field đại diện như F1, F2, F3...nhỉ. Cái này giống giống cái gọi là "magic number" khi dùng cho các tham số của câu lệnh ADO. Tôi thấy nó không tường minh gì cả. Sau này khi cái nguồn dữ liệu thay đổi thứ tự các cột, đi kiếm cái F2, F3 là gì cột nào cũng mất thời gian.
Cám ơn anh ạ. Thực ra em không hiểu hết ADO. Nên dường như dập khuôn của các anh chị, thấy cô đi trước. Nếu không phiền. Có thể nhờ anh cho nó tầm mắt được không ạ.
Em cảm ơn trước.
 
Upvote 0
Nhưng nó dính cả phần ngày nữa anh ạ. Chẳng hạn em muốn lọc từ ngày 15/05 đến ngày 15/06. Mà tính sửa chỗ như anh nói. Lại thấy nó sai sai gì ấy ạ
Thử vầy xem có được không?
Mã:
If sArr(10, i) >= #15/5/2020# And sArr(10, i) <= #15/6/2020# Then
 
Upvote 0
Nhưng điều kiện như vậy . Có nhân viên nào sinh năm 2020 mà đi làm được đâu anh.
Bạn mắc cười vậy? đó là ví dụ mà, bạn muốn 1900 thì sửa thành 1900 ai biểu bạn bê nguyên xi vào. Thôi tôi không trao đổi với bạn về chủ đề này nửa. Tôi kết thúc ở đây.
 
Upvote 0
Bạn mắc cười vậy? đó là ví dụ mà, bạn muốn 1900 thì sửa thành 1900 ai biểu bạn bê nguyên xi vào. Thôi tôi không trao đổi với bạn về chủ đề này nửa. Tôi kết thúc ở đây.
Em xin lỗi vì trêu anh không đúng thời điểm. Tại lúc đầu em cũng nghĩ rằng anh cho ví dụ của 1 năm. Nhưng nhân viên mỗi người sinh 1 năm.
Dù sao cũng cám ơn anh rất nhiều về những chỉ dẫn cho em.
Thành thật xin lỗi về câu nói làm anh khó chịu
 
Upvote 0
Mình có cách lọc bỡi AdvancedFilter thông qua hàm tự tạo như trong file; Bạn tham khảo & chúc vui!
 

File đính kèm

  • LocNgayThang.xlsm
    20.4 KB · Đọc: 14
Upvote 0
Chào các thầy cô.
Hiện tại em đang có công việc mà chưa thông
Mong mọi người chỉ giúp ạ
Đầu vào em có 2 file:
1- file data (gồm sheet Master) chứa dữ liệu
2- file Form chứ kết quả sau khi lọc (Hình minh họa)View attachment 237685
Mục đích: Lọc ra các nhân viên có ngày tháng sinh nhật từ ngày A đến ngày B với điều kiện vẫn đi làm bình thường
Ban đầu em có ý định là lấy dữ liệu từ file data. Sau đó lọc theo điều kiện từ ngày tháng A đến ngày tháng B ( do Kỳ tính lương của công ty từ nửa tháng nọ tới nửa tháng kia chứ không phải là 1 tháng nguyên)
Nhưng vướng cái em không tìm được điều kiện thích hợp để làm (+ khó quá)
Sau đó có chuyển hướng lọc theo tháng và có viết được đoạn code sau:
Mã:
Sub ABC()
  Dim cn As Object, rs As Object
  Dim sFile, oFile, sh As Worksheet, S, fRow&, eRow&
  Dim sArr(), Res(), i&, sR&, tmp$, K&
  Application.ScreenUpdating = False
  Set sh = Sheets("Sinh Nhat")
  With sh
  eRow = .Range("B" & Rows.Count).End(xlUp).Row
  tmp = .Range("D3").Value
  End With
  If eRow >= 5 Then sh.Range("A6:G10000").ClearContents

  sFile = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls*),*.xlsx", _
                                        Title:="Select File", MultiSelect:=True)
  If VarType(sFile) = vbBoolean Then MsgBox ("Chua chon File du lieu"): Exit Sub
  Set cn = CreateObject("adodb.connection")
  For Each oFile In sFile
    If Val(Application.Version) < 12 Then
      cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & oFile & ";Extended Properties=""Excel 8.0;HDR=No"";")
    Else
      cn.Open ("provider=Microsoft.ACE.OLEDB.12.0;data source=" & oFile & ";mode=Read;extended properties=""Excel 12.0;hdr=no"";")
    End If
    fRow = sh.Range("D" & Rows.Count).End(xlUp).Row + 1
    Set rs = cn.Execute("select * from [Master$C5:P65000] where f2 is not null")
    If Not rs.EOF() Then
      sArr = rs.GetRows
      sR = UBound(sArr, 2)
      ReDim Res(0 To sR, 0 To 6)
      For i = 0 To sR
        If Month(sArr(10, i)) = tmp Then
            If sArr(6, i) = "" Then
                K = K + 1
                Res(K - 1, 0) = K:
                Res(K - 1, 1) = sArr(0, i): Res(K - 1, 2) = sArr(1, i)
                Res(K - 1, 3) = sArr(10, i): Res(K - 1, 6) = sArr(7, i)
            End If
        End If
      Next i
    End If
    rs.Close:    cn.Close
    If K > 0 Then sh.Range("A6:G6").Resize(K) = Res
  Next
  Set cn = Nothing: Set rs = Nothing
  Application.ScreenUpdating = True
End Sub
Khi em có thêm điều kiện
Mã:
 If sArr(6, i) = "" Then
Thì thấy chạy đoạn code trên không có động tĩnh gì cả mà không biết đang bị sai chỗ nào.
Vậy nên nhờ thầy cô chỉ giúp là em đang làm sai chỗ nào được không ạ
Nếu có thể thì gợi ý giúp em theo hướng từ ngày tháng A đến ngày tháng B với.
Em xin cám ơn nhiều
Bạn xem thử.
 

File đính kèm

  • Form1.xlsb
    19.4 KB · Đọc: 15
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom