Dò tìm ngày theo tháng

Liên hệ QC

nguyenhongphong

Thành viên hoạt động
Tham gia
12/3/08
Bài viết
126
Được thích
13
Mong các bạn chỉ giúp mình nên dùng hàm nào trong trường hợp này.+-+-+-+

Câu hỏi nằm trong attached file. Mong các bạn xem qua.

Cám ơn các bạn

P/S: Em không rõ là post bài này phù hợp ở rum này không? Nếu sai nhờ a/c Mod chuyển qua hàm thời gian giúp e.
 

File đính kèm

Bạn xem trong file có được không nhé!
 

File đính kèm

Lần chỉnh sửa cuối:
Ý của Bạn có phải là khi ô B2=Jan (chẳng hạn) thì B3=1; C3=31; D3=Jan?
 

File đính kèm

Em cũng xin thú thật,

E chưa từng đọc và tìm hiểu mấy cái VBA trong excel.

Nên nhìn thấy đoạn code e cũng sợ lắm.

Nếu a đã từng đọc qua link hướng dẫn căn bản về VBA. Xin a Thắng post lên giúp e.

Em xin quay lại bài giải của a Tiến 1 chút, vì e có chỗ còn thắc mắc.

=OFFSET(Sheet1!$B$6,,,DAY(DATE(Sheet1!$B$1,MATCH(Sheet1!$B$2,Sheet1!$C$6:$C$17,0)+1,0)),1)
E vẫn chưa hiểu tại sao hàm match đây +1 và ,1 cuối cùng của hàm offset là hàm sẽ dò cột của tháng: Jan,Feb,Mar,..., ko phải dò vào cột Ngày nữa. Nhưng kết quả của a Tiến lại rất chính xác theo ngày tháng năm.

Nhờ A/C hướng dẫn thêm giúp e
 
Lần chỉnh sửa cuối:
Em cũng xin thú thật,

E vẫn chưa hiểu tại sao hàm match đây +1 và ,1 cuối cùng của hàm offset là hàm sẽ dò cột của tháng: Jan,Feb,Mar,..., ko phải dò vào cột Ngày nữa. Nhưng kết quả của a Tiến lại rất chính xác theo ngày tháng năm.

Nhờ A/C hướng dẫn thêm giúp e
1/Theo mình hiểu không có ngày 0. Nếu ô đó nhập 0/3/2010 thì nó sẽ trở về ngày 28/2/2009 (Tức trở về ngày cuối tháng trước đó) (Thay vì nhập DATE(Sheet1!$B$1;MATCH(Sheet1!$B$2;Sheet1!$C$6:$C$17;0);28)=28/2/2014
Mà bạn nhập
DATE(Sheet1!$B$1;MATCH(Sheet1!$B$2;Sheet1!$C$6:$C$17;0)+1;0)=0/3/2014=28/2/2014
2/Còn cái số 1 ở hàm offset cuối cùng ấy là chiều rộng của mảng tính từ ô B6 sang phải (Bằng 1 từ là chỉ có 1 cột)
 
Em cũng xin thú thật,

E chưa từng đọc và tìm hiểu mấy cái VBA trong excel.

Nên nhìn thấy đoạn code e cũng sợ lắm.

Nếu a đã từng đọc qua link hướng dẫn căn bản về VBA. Xin a Thắng post lên giúp e.

Em xin quay lại bài giải của a Tiến 1 chút, vì e có chỗ còn thắc mắc.
=OFFSET(Sheet1!$B$6,,,DAY(DATE(Sheet1!$B$1,MATCH(S heet1!$B$2,Sheet1!$C$6:$C$17,0)+1,0)),1)
E vẫn chưa hiểu tại sao hàm match đây +1 và ,1 cuối cùng của hàm offset là hàm sẽ dò cột của tháng: Jan,Feb,Mar,..., ko phải dò vào cột Ngày nữa. Nhưng kết quả của a Tiến lại rất chính xác theo ngày tháng năm.

Nhờ A/C hướng dẫn thêm giúp e
Hàm MATCH(Sheet1!$B$2,Sheet1!$C$6:$C$17,0) để xem mấy chữ bạn chọn (JAN, FEB... DEC) tương ứng với số mấy (1, 2.... 12)
Ví dụ: Chọn FEB thì hàm Match(...) trả về giá trị = 2
Hàm DATE(Năm, Tháng + 1,0) trả về kết quả là ngày cuối tháng của Tháng
Vậy DAY(DATE(Năm, Tháng + 1,0)) trả về tổng số ngày trong Tháng
==> Offset(
Sheet1!$B$2.......) Trả về 1 vùng dử liệu tính từ cell B2 mở rộng số dòng đúng bằng tổng số ngày
Chỉ vậy thôi
Bạn tách riêng ra từng phần mà nghiên cứu ---> Bài toán dạng này đã từng đang trên diển đàn rất nhiều lần rồi ---> Nó được gọi là name động
 
Calendar này còn phải cải tiến thêm nhiều ---> Chức năng Copy/Paste bị "tèo" rồi
Khắc phục cái này đâu có gì khó. Vấn đề là một hướng làm khác.
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$A$1" Then
    Calendar1.Visible = True
ElseIf Calendar1.Visible = True Then
    Calendar1.Visible = False
End If
End Sub
 
Khắc phục cái này đâu có gì khó. Vấn đề là một hướng làm khác.
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$A$1" Then
    Calendar1.Visible = True
ElseIf Calendar1.Visible = True Then
    Calendar1.Visible = False
End If
End Sub
Vâng! Thì đâu có gì khó ---> Bạn thử copy cell A1 paste sang cell khác xem
 
Vâng! Thì đâu có gì khó ---> Bạn thử copy cell A1 paste sang cell khác xem
Thật sự là chẳng có gì khó cả. Vấn đề là cần tới đâu làm tới đó. Không nên bới móc quá nhiều.
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Application.CutCopyMode = 1 Then Exit Sub
If Target.Address = "$A$1" Then
    Calendar1.Visible = True
ElseIf Calendar1.Visible = True Then
    Calendar1.Visible = False
End If
End Sub
 
Thật sự là chẳng có gì khó cả. Vấn đề là cần tới đâu làm tới đó. Không nên bới móc quá nhiều.
---
Mỗi người có 1 cá tính, chú NDU thì lúc nào cũng muốn "thử thách" để ngày càng hoàn thiện, tôi biết chú ấy tuyệt đối không phải như thế đâu, mong bạn cảm thông, chúc 2 người vui vẻ và đóng góp nhiều ý kiến hay cho diển đàn.
 
Thật sự là chẳng có gì khó cả. Vấn đề là cần tới đâu làm tới đó. Không nên bới móc quá nhiều.
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Application.CutCopyMode = 1 Then Exit Sub
If Target.Address = "$A$1" Then
    Calendar1.Visible = True
ElseIf Calendar1.Visible = True Then
    Calendar1.Visible = False
End If
End Sub
Trời đất ---> Mình đang bàn về kỹ thuật ---> Mà đã gọi là kỹ thuật thì phải liên tục hoàn thiện chứ
Tôi tin chắc khi bạn xây dựng code bạn cũng chưa từng hình dung đến những trục trặc có thể xãy ra (tôi cũng thế thôi)
Không biết bạn thì sao, chứ riêng tôi, được người ta bơi móc là niềm hạnh phúc, vì qua đó tôi có thể hoàn thiện thêm thuận toán của riêng mình
---------------------
Bơi móc tiếp đây:
- Khi đang copy thì Calendar không ẩn khi con trỏ nằm ngoài cell A1
- Chẳng hiểu sao cell A1 lại ở dạng TEXT nhỉ (sao mà tính toán)
Nếu bạn cho rằng CHẲNG CÓ GÌ KHÓ CẢ thì xin mời hoàn thiện tiếp
Ẹc... Ẹc...
---------------------
(Code Selection_Change là món mà tôi cho là khó nhai nhất)
 
Lần chỉnh sửa cuối:
Trời đất ---> Mình đang bàn về kỹ thuật ---> Mà đã gọi là kỹ thuật thì phải liên tục hoàn thiện chứ
Tôi tin chắc khi bạn xây dựng code bạn cũng chưa từng hình dung đến những trục trặc có thể xãy ra (tôi cũng thế thôi)
Không biết bạn thì sao, chứ riêng tôi, được người ta bơi móc là niềm hạnh phúc, vì qua đó tôi có thể hoàn thiện thêm thuận toán của riêng mình
---------------------
Bơi móc tiếp đây:
- Khi đang copy thì Calendar không ẩn khi con trỏ nằm ngoài cell A1
- Chẳng hiểu sao cell A1 lại ở dạng TEXT nhỉ (sao mà tính toán)
Nếu bạn cho rằng CHẲNG CÓ GÌ KHÓ CẢ thì xin mời hoàn thiện tiếp
Ẹc... Ẹc...
---------------------
(Code Selection_Change là món mà tôi cho là khó nhai nhất)
Tôi chỉ là dân Amateur. Vì vậy, với tôi chỉ cần đáp ứng đủ nhu cầu đặt ra là được, không cần phải quá hoàn thiện.
PHP:
Private Sub Calendar1_AfterUpdate()
[A1].Value = Calendar1.Value
End Sub

PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Application.CutCopyMode = 1 And Calendar1.Visible = True Then
    Calendar1.Visible = False
    [A1].Copy
End If
If Target.Address = "$A$1" Then
    Calendar1.Visible = True
ElseIf Calendar1.Visible = True Then
    Calendar1.Visible = False
End If
End Sub
 

File đính kèm

Tôi chỉ là dân Amateur. Vì vậy, với tôi chỉ cần đáp ứng đủ nhu cầu đặt ra là được, không cần phải quá hoàn thiện.
PHP:
Private Sub Calendar1_AfterUpdate()
[A1].Value = Calendar1.Value
End Sub
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Application.CutCopyMode = 1 And Calendar1.Visible = True Then
    Calendar1.Visible = False
    [A1].Copy
End If
If Target.Address = "$A$1" Then
    Calendar1.Visible = True
ElseIf Calendar1.Visible = True Then
    Calendar1.Visible = False
End If
End Sub
Ai dám bảo bạn là Amateur khi bạn cho rằng bài này KHÔNG CÓ GÌ KHÓ
Thế là tương đối hoàn thiện rồi! (Bị hỏng ở chổ không copy chổ khác vào A1 được)
Bạn không thấy rằng nhờ có người bơi móc mà bạn nghiên cứu thêm được sao?
Ẹc... Ẹc...
Mời nghiên cứu tiếp nếu bạn vẫn còn cảm thấy... DỂ
 
Lần chỉnh sửa cuối:
Ai dám bảo bạn là Amateur khi bạn cho rằng bài này KHÔNG CÓ GÌ KHÓ
Thế là tương đối hoàn thiện rồi! (Bị hỏng ở chổ không copy chổ khác vào A1 được)
Bạn không thấy rằng nhờ có người bơi móc mà bạn nghiên cứu thêm được sao?
Ẹc... Ẹc...
Mời nghiên cứu tiếp nếu bạn vẫn còn cảm thấy... DỂ
A1 là cell định dạng ngày tháng và có một Control hỗ trợ nhập liệu rồi. Không lý gì lại cần phải copy dữ liệu từ một Cell khác nữa.
Tôi thì thiên về mục đích ứng dụng và có nghiên cứu thì cũng hướng về mục đích cuối cùng là ứng dụng.
PHP:
Private Sub Calendar1_AfterUpdate()
[A1].Value = Calendar1.Value
End Sub
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" And Calendar1.Visible = False Then
    Calendar1.Visible = True
    Calendar1.Value = [A1].Value
End If
End Sub
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Application.CutCopyMode = 1 And Calendar1.Visible = True Then
    Calendar1.Visible = False
    [A1].Copy
ElseIf Application.CutCopyMode = 1 And Target.Address = "$A$1" Then
    Exit Sub
End If
If Target.Address = "$A$1" Then
    Calendar1.Visible = True
ElseIf Calendar1.Visible = True Then
    Calendar1.Visible = False
End If
End Sub
 

File đính kèm

Ẹc... Ẹc... Càng lúc càng hoàn thiện nhỉ? Nhưng lổi cũng từ đó mà.. nhiều thêm
Được cái này nó lại... mất cái kia:
- Bây giờ thì copy nơi khác vào A1 được nhưng khi ấy cái Calendar nó không hiện ra (Copy/Paste xong rồi nó mới hiện)
- Copy tại 1 cell khác (chưa paste) rồi chọn vào A1, Calendar nó cũng... cóc hiện luôn
- Tệ hơn nữa: Copy 1 cell rổng, Paste vào A1 (làm 1 vài lần) sẽ có 1 thời điểm nào đó mà ta chọn vào Calendar, nó chẳng chịu điền dử liệu vào A1
Hic....

Không lý gì lại cần phải copy dữ liệu từ một Cell khác nữa.
Cũng không chắc là không có ai cần đến yêu cầu này đâu (tôi đã từng thấy khi người ta chỉnh sửa dử liệu)
có nghiên cứu thì cũng hướng về mục đích cuối cùng là ứng dụng.
Chính xác! Nhưng có phải là ứng dụng càng hoàn hảo thì càng tốt hơn không?
Xem ra càng lúc code càng dài thêm, tôi nghi ngờ bạn cải tiến 1 hồi thì đến lúc nào đó, thà không xài còn khỏe hơn (vì lổi càng nhiều và nhìn vào code đã thấy ngợp)
-------------------------------------
Đích mà mọi người luôn hướng tới đó là:
- Sự hoàn hảo của code
- Tốc độ xử lý ứng dụng
- Sụ đơn giản của code (mà ai cũng có thể làm được)

-------------------------------------
Mời bạn nghiên cứu tiếp nếu thấy có hứng thú! (Sorry nếu đã làm bạn nóng giận)
 
- Bây giờ thì copy nơi khác vào A1 được nhưng khi ấy cái Calendar nó không hiện ra (Copy/Paste xong rồi nó mới hiện)
- Copy tại 1 cell khác (chưa paste) rồi chọn vào A1, Calendar nó cũng... cóc hiện luôn
Nếu đã copy, sau đó đương nhiên phải paste. Có cần phải hiện Control chăng? Có ai copy để... chẳng làm gì cả ko?
- Tệ hơn nữa: Copy 1 cell rổng, Paste vào A1 (làm 1 vài lần) sẽ có 1 thời điểm nào đó mà ta chọn vào Calendar, nó chẳng chịu điền dử liệu vào A1
Tôi nghĩ bạn thừa sức biết đó không phải là lỗi của code.
 
Nếu đã copy, sau đó đương nhiên phải paste. Có cần phải hiện Control chăng? Có ai copy để... chẳng làm gì cả ko?
Tình huống thế này:
- Giả định rằng người dùng cho hiện Caledar lên để nhập liệu khi chọn từ A1 đến A100 và D1 đến D1
- Sau đó người ta phát hiện có sai sót trong cột A, người ta copy cột D sang paste vào cột A nhưng vẫn còn có 1 ít sai sót phải sửa bằng tay ---> Đương nhiên người ta cần cho hiện Calendar rồi
- Copy mà chẳng làm gì sau đó: CHUYỆN THƯỜNG! Ai chẳng có lần như thế
Đồng ý chứ?
Tôi nghĩ bạn thừa sức biết đó không phải là lỗi của code.
Tôi chẳng biết nữa ---> Lổi xuất hiện thì ta phải quy nó là do code gây ra
---------------------------------
Vấn đề xử lý Selection_Change thật không dể ăn như bạn đã nghĩ đâu, nhưng tất nhiên là người ta có phương pháp riêng, đơn giản và hiệu quả (và cũng tất nhiên không giống như bạn đã xử lý ---> Lòng thòng quá)
---------------------------------
Nói tóm lại: Tôi khẳng định rằng những lổi mà tôi nêu ra là hoàn toàn có thể xử lý được tất, thậm chí là rất đơn giản nữa ---> Bạn cứ nghiên cứu tiếp đi, đến khi nào hết chịu nổi thì thôi... Ẹc... Ẹc...
 
Web KT

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

Back
Top Bottom