[英]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.