Tìm thứ 6 ngày 13 trong một thời đoạn! (2 người xem)

Liên hệ QC

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

thanhphuongvip

Mới học VBA, hỏi ngu anh chị đừng chửi ạ
Tham gia
16/1/10
Bài viết
136
Được thích
23
Câu này hồi trước có học rồi, giờ tự nhiên lục lại thì quên mất. Câu hỏi là: Tính xem từ ngày 1/1/2000 đến 1/1/2014 có bao nhiêu ngày thứ 6 ngày 13?
Bạn nào đã giải rồi tư vấn cho mình xíu :)
 
Câu này hồi trước có học rồi, giờ tự nhiên lục lại thì quên mất. Câu hỏi là: Tính xem từ ngày 1/1/2000 đến 1/1/2014 có bao nhiêu ngày thứ 6 ngày 13?
Bạn nào đã giải rồi tư vấn cho mình xíu :)
Thử xem cách này có giống hồi trước không:
 

File đính kèm

Thử xem cách này có giống hồi trước không:
+) Làm sao để liệt kê tất các tháng nào, năm nào có có ngày 13 bạn nhỉ? (ngày kết quả sẽ có dạng 13/mm/yyyy)
+) Tôi đang nghĩ phát triển bài toán của bạn thanh phuongvip thành 1 dạng khác là tìm ngày biết thứ bất kỳ, tìm thứ của 1 ngày bất kỳ, ngày ra kết quả có dạng dd/mm/yyyy, thứ ra có dạng "Hai, Ba, Bốn, Năm, Sáu, Bảy, CN". Mong bạn có thể phát triển ý tưởng của tôi bằng công thức. Cám ơn bạn!
 
+) Làm sao để liệt kê tất các tháng nào, năm nào có có ngày 13 bạn nhỉ? (ngày kết quả sẽ có dạng 13/mm/yyyy)
+) Tôi đang nghĩ phát triển bài toán của bạn thanh phuongvip thành 1 dạng khác là tìm ngày biết thứ bất kỳ, tìm thứ của 1 ngày bất kỳ, ngày ra kết quả có dạng dd/mm/yyyy, thứ ra có dạng "Hai, Ba, Bốn, Năm, Sáu, Bảy, CN". Mong bạn có thể phát triển ý tưởng của tôi bằng công thức. Cám ơn bạn!
Mình mới làm ý 1:
Mã:
Public Function ThuSau(ByVal NgayDau As Date, ByVal NgayCuoi As Date) As String
Dim i As Long, k As Long, Tam As String
For i = NgayDau To NgayCuoi
    If Weekday(i, vbSunday) = 6 Then
        If Day(i) = 13 Then
            Tam = Tam & ", " & Format(i, "dd/mm/yyyy")
            k = k + 1
        End If
    End If
Next i
If k > 0 Then ThuSau = "Có " & k & " ngày: " & Mid(Tam, 2)
End Function
 

File đính kèm

Thử xem cách này có giống hồi trước không:
Công thức vận dụng hay quá.
A2: ngày bắt đầu
B2: ngày kết thúc
{=SUM(IF((WEEKDAY(ROW(INDIRECT(A2&":"&B2)))=6)*(DAY(ROW(INDIRECT(A2&":"&B2)))=13),1,""))}

Mình thêm kiểu sumproduct
=SUMPRODUCT((WEEKDAY(ROW(INDIRECT(A2&":"&B2)))=6)*(DAY(ROW(INDIRECT(A2&":"&B2)))=13))
 
Hay là công thức này --=0
Mã:
=SUMPRODUCT(--(TEXT(ROW(INDIRECT(A2&":"&B2)),"ddd-dd")="Fri-13"))
 
Mình mới làm ý 1:
Mã:
Public Function ThuSau(ByVal NgayDau As Date, ByVal NgayCuoi As Date) As String
Dim i As Long, k As Long, Tam As String
For i = NgayDau To NgayCuoi
    If Weekday(i, vbSunday) = 6 Then
        If Day(i) = 13 Then
            Tam = Tam & ", " & Format(i, "dd/mm/yyyy")
            k = k + 1
        End If
    End If
Next i
If k > 0 Then ThuSau = "Có " & k & " ngày: " & Mid(Tam, 2)
End Function
Để kết quả ra lần lượt tại các cell ví dụ tại cột E chẳng hạn (hiện 1 textbox để chọn vị trí đặt kết quả) thì phải chỉnh code thế nào vậy bạn?
 
Cảm ơn các bạn. Đúng là diễn đàn nhiều cao thủ thật.
 
Sao công thức của bạn ra kết quả trên máy tôi =0 nhỉ?
Có thể vì nó chỉ áp dụng cho những người dùng tiếng anh thôi, chứ ngôn ngữ khác là thua.

Ví dụ như máy của bạn dùng tiếng Việt khi format "ddd" nó sẽ ra "hai" chứ không phải "Mon"
 
Có thể vì nó chỉ áp dụng cho những người dùng tiếng anh thôi, chứ ngôn ngữ khác là thua.

Ví dụ như máy của bạn dùng tiếng Việt khi format "ddd" nó sẽ ra "hai" chứ không phải "Mon"
admin cho tôi hỏi cách để dùng trên máy tính có Region and Language/Formats/Vietnamese (Vietnam)?
 
Câu này hồi trước có học rồi, giờ tự nhiên lục lại thì quên mất. Câu hỏi là: Tính xem từ ngày 1/1/2000 đến 1/1/2014 có bao nhiêu ngày thứ 6 ngày 13?
Bạn nào đã giải rồi tư vấn cho mình xíu :)

Nếu chỉ để sử dụng thì lập bảng gồm các cột: Thứ; Ngày; Tháng; Năm ( Cái này download từ trang của Mr Hồ Ngọc Đức thì phải )
Sau đó dùng autofilter hoặc dùng hàm để đếm cho nhẹ cái đầu
------
Nếu tìm hiểu về cách tính toán thì lại là vấn đề khác
 
admin cho tôi hỏi cách để dùng trên máy tính có Region and Language/Formats/Vietnamese (Vietnam)?
Trong thảo luận bạn không cần gọi tôi là admin vì tôi cũng không khá hơn thành viên thường bao nhiêu.

Tôi vừa thử trên máy tôi thì công thức đó sửa lại thế này:

=SUMPRODUCT(--(TEXT(ROW(INDIRECT(A2&":"&B2)),"ddd-dd")="Sáu-13"))

Đổi luôn cả dấu ngăn cách thập phân --> dẫn tới thay đổi ngăn cách đối số trong công thức từ , sang ;
=SUMPRODUCT(--(TEXT(ROW(INDIRECT(A2&":"&B2));"ddd-dd")="Sáu-13"))
 
Lần chỉnh sửa cuối:
Câu này hồi trước có học rồi, giờ tự nhiên lục lại thì quên mất. Câu hỏi là: Tính xem từ ngày 1/1/2000 đến 1/1/2014 có bao nhiêu ngày thứ 6 ngày 13?
Bạn nào đã giải rồi tư vấn cho mình xíu :)
Bạn nắm nguyên tắc
Nếu ngáy đầu tiên của tháng là ngày Chủ Nhật thì trong tháng đó sẽ có Thứ Sáu ngày 13
VD: Chủ Nhật ngày 1/3/2015
 
admin cho tôi hỏi cách để dùng trên máy tính có Region and Language/Formats/Vietnamese (Vietnam)?
Bạn sửa lại công thức thành như thế này sẽ không bị ảnh hưởng từ cài đặt của hệ thống.
Mã:
 =SUMPRODUCT(--(TEXT(ROW(INDIRECT(A2&":"&B2)),"[$-9]ddd-dd")="Fri-13"))
 
Mình liệt kê tới 25 ngày 13 trong giai đoạn trên thuộc thứ sáu

Để kết quả ra lần lượt tại các cell ví dụ tại cột E chẳng hạn (hiện 1 textbox để chọn vị trí đặt kết quả) thì phải chỉnh code thế nào vậy bạn?
PHP:
Option Explicit
Sub LietKeThúSáuNgày13()
 Dim J As Long, fDat As Date, lDat As Date
 
 fDat = [A1].Value:             lDat = [A2].Value
 If Day(fDat) < 13 Then
    fDat = DateSerial(Year(fDat), Month(fDat), 13)
 Else
    fDat = DateSerial(Year(fDat), Month(fDat) + 1, 13)
 End If
 Do
    If fDat > lDat Then Exit Do
    With Cells(Cells.Rows.Count, "C").End(xlUp).Offset(1)
        If Weekday(fDat) = 6 Then
            .Value = fDat
        End If
    End With
    fDat = DateSerial(Year(fDat), 1 + Month(fDat), 13)
 Loop
End Sub

1. 10/2000;
2. 04/01
3. 07/01
4. 09/02
5. 12/02
6. 06/03
. . . .
23. 09/13
24. 12/13
25. 06/14
 
PHP:
Option Explicit
Sub LietKeThúSáuNgày13()
 Dim J As Long, fDat As Date, lDat As Date
 
 fDat = [A1].Value:             lDat = [A2].Value
 If Day(fDat) < 13 Then
    fDat = DateSerial(Year(fDat), Month(fDat), 13)
 Else
    fDat = DateSerial(Year(fDat), Month(fDat) + 1, 13)
 End If
 Do
    If fDat > lDat Then Exit Do
    With Cells(Cells.Rows.Count, "C").End(xlUp).Offset(1)
        If Weekday(fDat) = 6 Then
            .Value = fDat
        End If
    End With
    fDat = DateSerial(Year(fDat), 1 + Month(fDat), 13)
 Loop
End Sub

1. 10/2000;
2. 04/01
3. 07/01
4. 09/02
5. 12/02
6. 06/03
. . . .
23. 09/13
24. 12/13
25. 06/14
Sao em copy code của bác vào modul mà không tài nào chạy được code. Mà code của phuoccam =thusau(A2;B2) vẫn chạy được.
 
Cho mình góp vui với:

=SUMPRODUCT(--(WEEKDAY(DATE(YEAR(A2),ROW(INDIRECT("1:"&DATEDIF(A2,B2,"m"))),1),1)=1))

Enter
 
Sao em copy code của bác vào modul mà không tài nào chạy được code. Mà code của phuoccam =thusau(A2;B2) vẫn chạy được.

Bạn chú í dòng lệnh này nè:
PHP:
 fDat = [A1].Value:             lDat = [A2].Value
Có nghĩa là ở 2 ô này chứa ngày đầu & cuối của giai đoạn cần tính/thống kê.
Chúc thành công.
 
Bạn chú í dòng lệnh này nè:
PHP:
 fDat = [A1].Value:             lDat = [A2].Value
Có nghĩa là ở 2 ô này chứa ngày đầu & cuối của giai đoạn cần tính/thống kê.
Chúc thành công.
Em copy toàn bộ code vào file mà. Xong em nhấn Alt+Q rồi tại 1 cell em nhấn =Lietke mà không hiện ra tên hàm trong Sub, nếu ở code của phuoccam thì nhấn =thu là hiện ra ngay tên hàm.
 
Web KT

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

Back
Top Bottom