要求:
- 要在文本框
txtDate
显示机器
- 之日起计算的
txtDate
月份周五或周四的数量,直到机器
- 之日起显示在文本框
txtWeek
周五或周四的数量按照前一点
个假设:
- 含有程序的工作簿的
Sheet1
有两个TextBoxes
和一个ComboBox
- 该程序将由
ComboBox
的变化事件,触发当用户选择工作日来算
将此程序复制到代码模块Sheet1
- 更改组合框的事件
Private Sub CmbBox1_Change()
Dim sWkDy As String
Dim dDte1 As Date
Dim bDayC As Byte
Dim bThu As Boolean, bFri As Boolean
Rem Set Weekday
sWkDy = Me.CmbBox1.Value
Select Case sWkDy
Case "Thursday": bThu = True
Case "Friday": bFri = True
Case Else: Exit Sub
End Select
Rem Set First date of the current month
dDte1 = 1 + WorksheetFunction.EoMonth(Date, -1)
Rem Counts the weekdays
bDayC = Dte_Days_Count_To_Today(dDte1, blThu:=bThu, blFri:=bFri)
Rem Set Current Date in `txtDate`
'Using format `mmm-dd-yyyy` to ease reading of the date independently of the format (American or International)
Me.TxtDate.Value = Format(Date, "mmm-dd-yyyy") 'change as required
Rem Set count of weekdays `txtWeek`
'Using this format to directly show the weekdays counted
Me.TxtWeek.Value = "Count of " & sWkDy & "s: " & bDayC 'change as required
End Sub
复制标准模块中的这些程序
'Ensure these Keywords are at the top of the module
Option Explicit
Option Base 1
此过程设置的可用选项中Combobox
- 运行此第一,需要运行一次
Private Sub CmbBox1_Set()
Dim aWkDys As Variant
aWkDys = [{"Thursday", "Friday"}]
With Me.CmbBox1
.ColumnCount = 1
.List() = aWkDys
End With
End Sub
此函数计算da的数量ys从输入日期dDteInp
输入日期到机器的实际日期TODAY
。结果是使用算术演算生成的,避免循环遍历范围中的每个日期。这也给了一次如计算各种平日的选项:从给定的日期算周四和周五到今天这样Call Dte_Days_Count_To_Today(dDteInp, blThu:=True, blFri:=True)
Public Function Dte_Days_Count_To_Today(dDteInp As Date, _
Optional blSun As Boolean, Optional blMon As Boolean, _
Optional blTue As Boolean, Optional blWed As Boolean, _
Optional blThu As Boolean, Optional blFri As Boolean, _
Optional blSat As Boolean)
Dim aDaysT As Variant, bDayT As Byte 'Days Target
Dim bDayI As Byte 'Day Ini
Dim iWeeks As Integer 'Weeks Period
Dim bDaysR As Byte 'Days Remaining
Dim bDaysA As Byte 'Days Additional
Dim aDaysC(7) As Integer 'Days count
Rem Set Days Base
aDaysT = Array(blSun, blMon, blTue, blWed, blThu, blFri, blSat)
bDayI = Weekday(dDteInp, vbSunday)
iWeeks = Int((Date - dDteInp + 1)/7)
bDaysR = (Date - dDteInp + 1) Mod 7
Rem Set Day Target Count
For bDayT = 1 To 7
bDaysA = 0
aDaysC(bDayT) = 0
If aDaysT(bDayT) Then
If bDaysR = 0 Then
bDaysA = 0
ElseIf bDayI = bDayT Then
bDaysA = 1
ElseIf bDayI < bDayT Then
If bDayI + bDaysR - 1 >= bDayT Then bDaysA = 1
Else
If bDayI + bDaysR - 8 >= bDayT Then bDaysA = 1
End If
Rem Target Day Total
aDaysC(bDayT) = iWeeks + bDaysA
End If: Next
Rem Set Results - Total Days
Dte_Days_Count_To_Today = WorksheetFunction.Sum(aDaysC)
End Function
推荐阅读以下网页获得的资源有了更深的了解叫它使用:
Option keyword, Variables & Constants, Data Type Summary,
Optional keyword, Function Statement, For...Next Statement,
If...Then...Else Statement, Control and Dialog Box Events,
Select Case Statement, WorksheetFunction Object (Excel)
任何解释的downvote?这对我来说非常合适。 – Alex4336
我得到了一个编译错误的未定义“HowManyDays” – GregNH
你是否从我的答案的顶部实现了功能? – Alex4336