sử dụng hàm month trong VBA???

Liên hệ QC

tamhoncuada10313

Thành viên thường trực
Tham gia
7/4/08
Bài viết
221
Được thích
65
Lọc kết quả sử dụng hàm month nhưng không được

Các bác xem em sai chỗ nào với.Sao em ko lọc được những người sinh cùng tháng
 

File đính kèm

Trong sheet DS, tại cell E4 bạn sửa công thức lại thành:
=IF(AND(C4<>"",MONTH(C4)=thang*1),MAX($E$3:E3)+1,"")
Kéo fill xuống
Chú ý:
-Có điều kiện C4<>"" để loại những người không ghi ngày tháng năm sinh (Excel sẽ hiểu lầm là tháng 1)
-Có điều kiện thang*1 vì tháng là dạng TEXT, còn MONTH(C4)NUMBER, không so sánh được
Nói thêm: Nếu bạn không muốn có cái vụ *1 trong công thức thì hãy chuyển ComboBox này thành loại ComboBox của thanh Forms đi nha
 
Lần chỉnh sửa cuối:
Upvote 0
Tui ko rành lắm về công thức nhưng tui thấy bạn nhập ngày tháng ko theo nguyên tắc nào hết thì làm sao lọc được. Bạn thử nhập tất cả cùng 1 loại xem, chẳng hạn như ngày ngày, tháng tháng, năm năm có lẽ sế được đấy.
 
Upvote 0
Tui ko rành lắm về công thức nhưng tui thấy bạn nhập ngày tháng ko theo nguyên tắc nào hết thì làm sao lọc được. Bạn thử nhập tất cả cùng 1 loại xem, chẳng hạn như ngày ngày, tháng tháng, năm năm có lẽ sế được đấy.
Nói chính xác hơn là NGÀY THÁNG NĂM trong file đã được gõ tầm bậy tầm bạ hết trơn, cái thì dạng DATE, còn cái thì dạng TEXT
Việc nhập THÁNG trước hay NGÀY trước phụ thuộc vào Setting trong Control Panel của từng máy... Tuy nhiên bạn cũng có 1 cách nhập luôn luôn chính xác trên mọi máy tính, đó là nhập theo dạng yyyy/mm/dd
Ví dụ: cần nhập ngày 4 tháng 6 năm 2008 thì nên nhập theo thứ tự 2008/6/4
Bảo đãm không bao giờ sai
 
Upvote 0
Xem giùm em lệnh viết như thế này đúng chưa
Month(nv.Offset(0, 1)) = Sheet4.cbthang.Value
-cbthang : tên của Combo Box chứa danh sách các tháng.
-nv là tên biến
-mục đích câu lệnh này là dịch sang phải 1 cột (cột đc chỉ đến là cột ngày tháng năm), sau đó sẽ lấy giá trị tháng của cột được dịch đến so sánh với giá trị trong combo box.
Mong các bác giúp!
 
Upvote 0
Xem giùm em lệnh viết như thế này đúng chưa
Month(nv.Offset(0, 1)) = Sheet4.cbthang.Value
-cbthang : tên của Combo Box chứa danh sách các tháng.
-nv là tên biến
-mục đích câu lệnh này là dịch sang phải 1 cột (cột đc chỉ đến là cột ngày tháng năm), sau đó sẽ lấy giá trị tháng của cột được dịch đến so sánh với giá trị trong combo box.
Mong các bác giúp!
Hỏng hiểu! Trong file bạn đang dùng công thức cơ mà, sao lại có code VBA ở đây nữa?
Bạn muốn gì hãy nói rõ thêm 1 chút
 
Upvote 0
Tớ muốn chuyển qua VBA vì muốn người sử dụng chỉ việc ấn nút để lọc ra những người sinh cùng tháng. Nếu có thêm người mới thì chỉ việc nhập dữ liệu chứ không cần phải kéo công thức

Tôi có một câu hỏi nhỏ muốn hỏi các bác:tôi muốn dùng hàm month(serial number) để lấy giá trị của 1 cell và so sánh với giá trị trong combo box thì phải làm thế nào?và ta tham chiếu từ một ô khác để đến được ô cần dùng hàn month để lấy giá trị.
Ví dụ ô C1 là ô biểu thức ngày tháng năm(đây là ô sẽ dùng hàm month để trích ra tháng cần so sánh) nhưng ta lại bắt đầu từ A1 cơ. Tôi chỉ biết là dùng hàm offset để tham chiếu từ A1 đến C1 nhưng khi viết hàm thì lại bị lỗi.
Mã:
Month(nv.Offset(0, 1)) = Sheet4.cbthang.Value
lệnh trên viết như thế đúng chưa?
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
sheet("sheet4").cells(1,3)=Sheet4.cbthang.Value
Bạn viết như trên dễ hiểu hơn và tránh cái name nv bạn khai báo có hợp lệ và đúng ô a1 không (Mặt khác từ ô A1 tham chiếu đến ô C1 phải là
Range("A1").offset(0,2) như bạn viết là ô B1
Lưu ý sử dụng hàm nội tại của Excel phải viết
Application.WorksheetFunction.Month(...
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử code này xem (tuy chưa được hay lắm)
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
   Dim NS As Range, Clls As Range
   Dim k As Integer
   If Target.Address = "$C$4" Then
     [A6:D1000].ClearContents
     Set NS = Sheet1.Range("C4:C" & Sheet1.[C65536].End(xlUp).Row)
     k = 6
     For Each Clls In NS
       If Month(Clls) = Sheet2.[C4] And Clls <> "" Then
          Sheet2.Cells(k, 1).Value = k - 5
          Sheet2.Cells(k, 2).Resize(1, 3).Value = Clls.Offset(, -1).Resize(1, 3).Value
          k = k + 1
       End If
     Next Clls
   End If
End Sub
Khi có người mới nhập vào sheet DS thì code này chắc chắn cập nhật
 

File đính kèm

Upvote 0
Xin đưa lên 1 giãi pháp khác mà tôi nghĩ là nhanh hơn rất nhiều! Thuật toán của nó là:
-Sort DS trước theo tháng
-Filter theo điều kiện tháng đã chọn
-Copy phần danh sách đã Filter và paste sang sheet SN
Code như sau:
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
   Dim DS As Range, NS As Range, Loc As Range
   Dim Luu As Variant
   Application.ScreenUpdating = False
   If Target.Address = "$C$4" Then
     [A6:D1000].ClearContents
     Set DS = Sheet1.[A3].CurrentRegion
     Set NS = Sheet1.Range("C4:C" & Sheet1.[B65536].End(xlUp).Row)
     Luu = DS.Value
     NS.NumberFormat = "mmm"
     DS.Sort Key1:=Sheet1.[C4], Order1:=1, Header:=1, _
     OrderCustom:=4, Orientation:=1, DataOption1:=xlSortNormal
     DS.AutoFilter Field:=3, Criteria1:=Sheet1.[J3]
     DS.SpecialCells(xlCellTypeVisible).Copy: [A5].PasteSpecial xlPasteValues
     [A6] = "1": [A7] = "2"
     [A6:A7].AutoFill Destination:=Range("A6:A" & [B65536].End(xlUp).Row)
     Sheet1.AutoFilterMode = False
     NS.NumberFormat = "dd/mm/yyyy"
     DS.Value = Luu
     Target.Select
   End If
End Sub
 

File đính kèm

Upvote 0
Sửa giùm em đoạn mã sau với. Đoạn mã này sẽ so sánh lần lượt từng giá trị trong sheet1 xem hàng nào thỏa mãn điều kiện có tháng là tháng nhập vào ô C4 của sheet 2 thì sẽ hiện thị lên sheet2.
Sub Sinhnhat()
Dim irow As Integer, i As Integer, tim As Boolean, nv As Range
'irow = Sheet2.Range("B6").End(xlDown).Row
'Sheet2.Range("A6:C" & irow).Clear
tim = False
i = 5
Application.ScreenUpdating = False
irow = Sheet1.Range("B4").End(xlDown).Row
For Each nv In Sheet1.Range("b4:b" & irow) 'nv ở đây được gán cho cột tên nhân viên, offset nv sang phải 1 cột sẽ được sang ô ngày tháng năm sinh, sang phải 2 cột là bộ phận làm việc
If Application.WorksheetFunction.Month(nv.Offset(0, 1)) = Sheet2.Range("C4") Then
tim = True
End If
If tim = True Then
i = i + 1
Sheet2.Range("a" & i) = i - 5
Sheet2.Range("b" & i) = nv
Sheet3.Range("c" & i) = nv.Offset(0, 2)
End If
Next nv
Application.ScreenUpdating = True
Set nv = Nothing
End Sub

Thêm nữa, làm thế nào để gọi hàm month ra. Khi em viết Application.WorksheetFunction.... nhưng không thấy hiện hàm month
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom