[英]VBA Weekday function returns different value from Excel Weekday function
[英]Excel VBA - Find file with variable name (weekday function)
我有一个脚本,除其他外,该脚本可以加载具有与日期对应的变量文件名的文件。 它可以加载最近7天内的日期,但是,我需要它加载超过此日期的日期。
该脚本将在星期五早上运行,我需要它来拉整整整整一周的时间,再加上整整一周的时间。 目前,它将把前一个星期五(7天前)拉到前一天(星期四)。
我需要的是正确的代码,可以将其从上周一拖到上周四。
上周一要提取的代码如下。 我尝试将Date-1更改为Date-2,但这是不对的。 我知道vbMonday应该对应于过去7天内的日期(如果我理解正确的话。可能是我遗漏的一件简单的事情,但似乎没有任何选择可行。
(仅供参考,所有变量都已声明,因此省略了,因此更容易看到正在发生的情况)
LastMondayDate = Format(Date - (Weekday(Date - 1, vbMonday)), "m.d.yy")
fullFileNameLastMonday = strFilePath & LastMondayDate & ".xls"
If Dir(fullFileNameLastMonday) = "" Then
MsgBox "File for last Monday doesn't exist!"
GoTo ExitLastMonday
End If
Set wbkLastMonday = Workbooks.Open(fullFileNameLastMonday, False, True)
.......Do stuff.......
wbkLastMonday.Close SaveChanges:=False
ExitLastMonday:
您可以尝试如下操作:
Public Sub LoveMondays()
Dim i As Long
For i = 1 To 15
Debug.Print DateAdd("ww", i * -1, Date - (Weekday(Date, vbMonday) - 1))
Next i
End Sub
它提供了最近15个星期一的日期。 然后,如果适用,将i
作为输入变量的Debug.Print函数将很有用。
例如:
Public Function MondaysWeekBack(lngWeekBack As Long) As Date
MondaysWeekBack = DateAdd("ww", lngWeekBack * -1, Date - (Weekday(Date, vbMonday) - 1))
End Function
因此,对于当前一周,您可以这样获取星期一: MondaysWeekBack(0)
和先前的MondaysWeekBack(1)
。
这是DateAdd
的Microsoft参考DateAdd
( v= DateAdd
编辑:正如@Robin Mackenzie的注释中所建议的那样,该函数可以扩展为使日也为变量。 像这样:
Public Function WeekdayWeekBack(lngWeekBack As Long, _
Optional lngWeekday As Long = 2) As Date
WeekdayWeekBack = DateAdd("ww", lngWeekBack * -1, Date - (Weekday(Date, lngWeekday) - 1))
End Function
然后,如果我们要最后一个星期日,则应该像WeekdayWeekBack(0,1)
或WeekdayWeekBack(0,vbSunday)
。 默认情况下,星期一是星期一,因此WeekdayWeekBack(0)
会给我们最后一个星期一。
Weekday函数返回1到7之间的数字,代表一周中的7天。 Weekday(Date, vbMonday)
指定星期一将是数字1的一天,即一周的第一天。 Weekday(Date - 1, vbMonday)
将始终指定星期一。 要指定另一天,请更改公式中的-1
。
Date - Weekday(Date - 1, vbMonday)
连续7天指定同一天,因为随着日期的增加(每天+ 1),从中减去的Weekday也是如此。 从星期二到下周星期一,它将指定当前星期的星期一。 然后它将跳到下一个星期一。
为了捕获更早的星期一,只需修改日期部分。 Date - 7 - Weekday(Date - 1, vbMonday)
的功能与上述完全相同,但比过去多了7天。
在这里试试
Private Sub that()
Dim LastDate As Date
Dim NewDate As Date
Dim path As String
Dim filename As String
Select Case Weekday(Now())
Case Is = 2
LastDate = Format(DateAdd("d", -14, Date), "mm-dd-yyyy")
Case Is = 3
LastDate = Format(DateAdd("d", -14, Date), "mm-dd-yyyy")
Case Is = 4
LastDate = Format(DateAdd("d", -15, Date), "mm-dd-yyyy")
Case Is = 5
LastDate = Format(DateAdd("d", -16, Date), "mm-dd-yyyy")
Case Is = 6
LastDate = Format(DateAdd("d", -18, Date), "mm-dd-yyyy")
End Select
NewDate = LastDate + 11
path = "" & "\"
filename = Dir(path & "*.xl??")
Do While Len(filename) > 0
this = Mid(filename, InStrRev(filename, "\") + 1, InStrRev(filename, "."))
this = Left(this, InStr(this, ".") - 1)
If CDate(this) >= LastDate And CDate(this) <= NewDate Then
' do your stuff
End If
Loop
End Sub
该程序可以在一周的任何一天运行,并可以获取前两周的时间。 说“做自己的事情”的部分是放置操作代码正文的位置。 我进行了一些字符串操作,通过检查当前文件是否在您要检查的日期范围内,将它们强制设置为日期值。 这未经测试,但我100%可以正常工作。 另外,您需要设置path变量,但是我确定它的100%==要设置为strFilePath。
我认为将代码从LastMondayDate,LastTuesdayDate,LastWednesdayDate更改为更容易一些:FirstDayToGet。 请注意以下仅是逻辑。 此逻辑将打开从开始日期到当前日期所需的所有日期文件-或者,如果当前日期太宽,则可以添加结束日期
Sub logicOnlyNotActualCode()
FirstDayToGet = datepicker or textbox value date or cell value date
toooooday = date() ' or some end date
for I = FirstDayToGet to FirstDayToGet + (toooooday - FirstDayToGet)
run get_date_report(FirstDayToGet)
FirstDayToGet = dateAdd("d",1,FirstDayToGet)
next i
End Sub
您的函数将类似于:
function get_date_report(FirstDayToGet as date)
dim get_report as string
get_report = strFilePath & Format(FirstDayToGet , "m.d.yy") & ".xls"
Do events
End function
此函数返回从numDays
到昨天的日期(含)的日期值。 它不考虑假日或周末等异常情况。您应该使用此函数生成文件名,然后使用Dir
函数测试文件是否存在,(显然)检查文件是否存在,不要尝试打开或处理它,只需继续下一个迭代。
Function GetFileNames(numDays As Long, optional dFormat as String = "m.d.yy")
'Function returns a string array (len = numDays) of formatted date values
'beginning from numDays days ago, until yesterday's date.
ReDim filenames(1 To numDays) As String
Dim LastDate As Date, i As Long
LastDate = Date 'Returns TODAY's date
'Use DateAdd function to calculate the last numDays:
For i = 1 To numDays
filenames(i) = Format(DateAdd("d", -(numDays) + i - 1, LastDate), dFormat)
Next
GetFileNames = filenames
End Function
您可以通过以下方法进行测试:
Sub TestMe()
Dim a
a = GetFileNames(1) 'Should return an array of len=1, yesterday's date only
MsgBox a(1)
a = GetFileNames(14) 'Should return an array of len=14, fourteen days prior to and including Yesterday
End Sub
这是在不创建14个变量/工作簿对象的情况下获取所有14个文件名的方法:
Dim dateVals
dateVals = GetFileNames(14)
现在,对数组进行一些操作(例如打开相应的工作簿并以某种方式处理它们:
Dim val, Dim wb as Workbook
For Each val in DateVals
If Dir(strFilePath & val & ".xls") <> "" Then
Set wb = Workbooks.Open(strFilePath & val & ".xls")
'Do something with the workbook
wb.Close
End If
Next
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.