Excel VBA /公式。在当月的每个星期五填充一系列单元格

时间:2018-07-27 16:47:35

标签: excel vba excel-vba excel-formula

所以标题有点混乱,但是我试图做以下事情:

我的单元格范围从Q8:Q12,T8:T12,Q16:Q20和T16:T20

我正在尝试让这些单元格填充本月每个星期五的日期。本质上,使用7月(当前月份)看起来像这样:

Q8/T8 = 06/07
Q9/T9 = 13/07
Q10/T10 = 20/07
Q11/T11 = 27/07
Q12/T12 = -

Q / T12空白的原因是要处理一年中有5个星期五而不是4个星期五的月份。这是一种错误处理方式。

我有一个当前在A9单元格中跟踪月份的单元格,公式如下所示:

=TEXT(NOW(),"mmmm")

我不太确定该如何在逻辑上进行处理。 VBA或Formula都能在我眼中发挥作用。

理想情况下,因为我在7月,8月等每个月都有不同的工作表。上面的公式根据当前的月份而变化。我需要将Q8:Q12或A9单元格中的Formula / VBA脚本转换为填充日期范围单元格Q8:Q12之后的值。

任何人都有任何想法。对不起,这个问题有点麻烦

3 个答案:

答案 0 :(得分:3)

将其放在第一个单元格中,并抄下5

=IFERROR(AGGREGATE(15,6,ROW(INDEX(A:A,EOMONTH(TODAY(),-1)+1):INDEX(A:A,EOMONTH(TODAY(),0)))/(WEEKDAY(ROW(INDEX(A:A,EOMONTH(TODAY(),-1)+1):INDEX(A:A,EOMONTH(TODAY(),0))),1)=6),ROW(1:1)),"-")

然后格式化为您的规格。

可能会有更优雅的公式,但这就是我想到的。

enter image description here

答案 1 :(得分:3)

这是一个宏版本,不需要Range(“ A9”)中的日期值...

Dim SoM As Date
Dim EoM As Date
Dim rw As Long

SoM = DateSerial(Year(Now), Month(Now) + 0, 1)

EoM = DateSerial(Year(Now), Month(Now) + 1, 0)

rw = 8
While SoM < EoM
    If Weekday(SoM) = vbFriday Then
        Cells(rw, 17).Value = SoM
        Cells(rw, 17).NumberFormat = "m/d/yyyy"
        rw = rw + 1
    End If
    SoM = SoM + 1
Wend

答案 2 :(得分:2)

我制作了一个可以在任何日期范围内使用的用户定义函数,然后通过一些公式演示了如何将其应用于此示例。这将说明每年的转换。

enter image description here

Function DAYOFWEEKFREQUENCY(ByVal dayOfWeekType As String, ByVal startDate As String, ByVal endDate As String) As Long
    Dim myStartDate As Date
        myStartDate = CDate(startDate)

    Dim myEndDate As Date
        myEndDate = CDate(endDate)

    Dim includeStartDate As Long
        includeStartDate = 1

    Dim daysBetweenDatesInclusive As Long
        daysBetweenDatesInclusive = Application.WorksheetFunction.Days(endDate, startDate) + includeStartDate

    Dim vbStartDay As Long
        vbStartDay = Weekday(startDate)

    Dim dateCheckedIncremented As Date
        dateCheckedIncremented = myStartDate

    For dayCounter = 1 To daysBetweenDatesInclusive
        If Weekday(dateIncrementedChecked) = dayOfWeekType Then
            DAYOFWEEKFREQUENCY = DAYOFWEEKFREQUENCY + 1
        End If
        dateIncrementedChecked = DateAdd("d", 1, dateIncrementedChecked)
    Next
End Function