Требования:
- показать в Textbox
txtDate
дату машины
- Чтобы рассчитать количество пятницу или четверг в месяце
txtDate
до даты машины
- К показать в текстовом поле
txtWeek
количество пятниц или четвергов в соответствии с предыдущей точкой
Предположение:
Sheet1
рабочей книги, содержащей процедуру имеет два TextBoxes
и один ComboBox
- Процедуры, будет вызвано событиями изменения
ComboBox
, когда пользователь выбирает день недели для подсчета
Скопируйте эту процедуру в модуле кода Sheet1
- Изменить событие для ComboBox
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
- Run это первый, нужно запустить только один раз
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
Я получаю ошибку компиляции для undefined "HowManyDays" – GregNH
Вы внедрили функцию из верхней части моего ответа? – Alex4336