Excel VBA – 查找具有variables名称的文件(星期几function)

我有一个脚本,其中包括加载与date相对应的variables文件名的文件。 它可以在过去7天内加载date罚款,但是,我需要它加载date过去。

脚本将在星期五上午运行,我需要它整个星期,以及整个前一周。 目前,前一个星期五(7天前)将上涨至前一天(星期四)。

我需要的是上个星期一到上星期四的正确代码。

上周一拉的代码如下。 我试过改变date – 1到date – 2,但这是不对的。 我知道,vbMonday应该对应于过去7天内的date(如果我理解正确的话。可能是一个简单的东西,我失踪了,但没有select似乎工作。

(仅供参考,所有variables均已声明,只是省略,因此更容易看到发生的情况)

LastMondayDate = Format(Date - (Weekday(Date - 1, vbMonday)), "mdyy") 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:

Weekday函数返回1到7之间的数字,代表一周的7天。 Weekday(Date, vbMonday)指定星期一将是具有数字1的那一天,即星期的第一天。 Weekday(Date - 1, vbMonday)将始终指定一个星期一。 指定另一天更改公式中的-1

Date - Weekday(Date - 1, vbMonday)连续7天指定同一天,因为随着date的提前(每天+ 1),从工作日中减去的工作日也是如此。 星期二到星期一,它将指定当周的星期一。 然后它会跳到下一个星期一。

为了捕捉更早的星期一,只需修改date组件。 Date - 7 - Weekday(Date - 1, vbMonday)将与刚刚描述的完全相同,但是过去7天还是如此。

你可以尝试这样的事情:

 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个星期一的date。 然后,如果适用,将i作为inputvariables的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参考 – https://msdn.microsoft.com/en-us/library/hcxe65wz(v=vs.90).aspx

编辑:正如@Robin Mackenzie的评论所build议的那样,该函数可以扩展为使这一天成为一个variables。 喜欢这个:

 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)会给我们上个星期一。

这里试试这个

 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 

这可以在一周的任何一天运行,并获得前两个星期。 它说“'做你的东西”的部分是你放置行动代码的地方。 我做了一些string操作,强制它们检查date值,看看当前文件是否在你想检查的date范围内。 这没有testing,但我100%的工作。 此外,你需要设置pathvariables,但我相信它的100%== strFilePath。

我认为将LastMondayDate,LastTuesdayDate,LastWednesdayDate中的代码更容易一些:FirstDayToGet。 请注意以下只是逻辑。 这个逻辑会打开你从开始date到当前date所需要的所有date文件,或者如果当前date过于宽泛,你可以添加一个结束date

 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 , "mdyy") & ".xls" Do events End function 

这个函数返回从numDays天前的date值,直到昨天的date,包括在内。 它不考虑像假期或周末等exception。你应该做的是使用这个函数来build立文件名,然后使用Dir函数来testing文件的存在,并且(显然)如果文件不存在,不要尝试打开或处理它,只是继续下一个迭代。

 Function GetFileNames(numDays As Long, optional dFormat as String = "mdyy") '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 

以下是您可以testing的方法:

 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个文件名,而无需创build14个variables/工作簿对象:

 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