Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel-VBA每月的第一个工作日_Excel_Vba - Fatal编程技术网

Excel-VBA每月的第一个工作日

Excel-VBA每月的第一个工作日,excel,vba,Excel,Vba,我有一个工作簿\u open宏,如下所示 Private Sub Workbook_Open() Sheets("Staff List").Activate If Range("G1") = "Yes" Then Sheets(Format(Now, "mmmm")).Activate Range("A1").Select Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False End If End Sub G1中

我有一个工作簿\u open宏,如下所示

Private Sub Workbook_Open()
Sheets("Staff List").Activate

If Range("G1") = "Yes" Then

Sheets(Format(Now, "mmmm")).Activate

Range("A1").Select
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False

End If

End Sub
G1中的公式如下:

=如果(或(今天()=工作日(EOMONTH(今天(),-1),1,0),今天()=工作日(EOMONTH(今天(),-1),2,0)),“是”,“否”)

所以,看看今天是一个月的第一个工作日还是第二个工作日。如何消除引用G1的需要,而将公式直接计算到VBA中

非常感谢

试试看

If Evaluate("=IF(OR(TODAY()=WORKDAY(EOMONTH(TODAY(),-1),1,0),TODAY()=WORKDAY(EOMONTH(TODAY(),-1),2,0)),""Yes"",""No"")") = "Yes" Then 
感谢@jeeped帮助我将其重新表述为:

If Evaluate("OR(TODAY()=WORKDAY(EOMONTH(TODAY(),-1),1,0),TODAY()=WORKDAY(EOMONTH(TODAY(),-1),2,0))") Then 
试一试

感谢@jeeped帮助我将其重新表述为:

If Evaluate("OR(TODAY()=WORKDAY(EOMONTH(TODAY(),-1),1,0),TODAY()=WORKDAY(EOMONTH(TODAY(),-1),2,0))") Then 
试试看

一个月的第0天是上个月的月。

试试看


每月的第0天是前一个月的月。

一种不使用工作表功能的方法:

Function WorkdayOfMonth(ByVal dtInput As Date) As Integer
    Dim dt As Date
    Dim i As Integer
    If Weekday(dtInput, vbMonday) < 6 Then
        For dt = DateSerial(Year(dtInput), Month(dtInput), 1) To dtInput Step 1
            If Weekday(dt, vbMonday) < 6 Then i = i + 1
        Next dt
        WorkdayOfMonth = i
    Else
        WorkdayOfMonth = 0
    End If
End Function

Sub Test()
    If WorkdayOfMonth(Date) > 0 and WorkdayOfMonth(Date) <= 2 Then
        'do stuff
    End If
End Sub
函数WorkdayOfMonth(ByVal dtInput作为日期)为整数
Dim dt作为日期
作为整数的Dim i
如果工作日(dtInput,vbMonday)<6,则
对于dt=DateSerial(年(dtInput),月(dtInput),1)到dtInput步骤1
如果工作日(dt,vbMonday)<6,则i=i+1
下一个dt
WorkdayOfMonth=i
其他的
WorkdayOfMonth=0
如果结束
端函数
子测试()

如果WorkdayOfMonth(Date)>0且WorkdayOfMonth(Date)不使用工作表函数的方法:

Function WorkdayOfMonth(ByVal dtInput As Date) As Integer
    Dim dt As Date
    Dim i As Integer
    If Weekday(dtInput, vbMonday) < 6 Then
        For dt = DateSerial(Year(dtInput), Month(dtInput), 1) To dtInput Step 1
            If Weekday(dt, vbMonday) < 6 Then i = i + 1
        Next dt
        WorkdayOfMonth = i
    Else
        WorkdayOfMonth = 0
    End If
End Function

Sub Test()
    If WorkdayOfMonth(Date) > 0 and WorkdayOfMonth(Date) <= 2 Then
        'do stuff
    End If
End Sub
函数WorkdayOfMonth(ByVal dtInput作为日期)为整数
Dim dt作为日期
作为整数的Dim i
如果工作日(dtInput,vbMonday)<6,则
对于dt=DateSerial(年(dtInput),月(dtInput),1)到dtInput步骤1
如果工作日(dt,vbMonday)<6,则i=i+1
下一个dt
WorkdayOfMonth=i
其他的
WorkdayOfMonth=0
如果结束
端函数
子测试()

如果WorkdayOfMonth(Date)>0且WorkdayOfMonth(Date)@jeeped:If Not Evaluate(=或(今天()=工作日(EOMONTH(TODAY(),-1),1,0),TODAY()=WORKDAY(EOMONTH(TODAY(),-1),2,0)),那么我不知道你可以删除“=”是的。。。我想这是因为我在打印一些东西之后,我需要将评估切换为“否”。忘了换回去。好的。我的错。@jeeped:If Not Evaluate(=或(今天()=工作日(EOMONTH(TODAY(),-1),1,0),TODAY()=工作日(EOMONTH(TODAY(),-1),2,0))),然后我不知道你可以删除“=”是的。。。我想这是因为我在打印一些东西之后,我需要将评估切换为“否”。忘了换回去。好的。我的坏。喜欢这个,也可以在.VBS脚本中使用。喜欢这个,也可以在.VBS脚本中使用。