我目前正在使用Excel宏,该宏可生成每周数据。我必须准备多个报告,其中我的周开始日期不同,例如如果对于一个报告,我的星期开始日是“星期五”,而对于其他报告,我的星期开始日是“星期一”
目前,我正在分多个步骤进行此操作:
首先,我要从excel来源获取所有数据,并添加一个公式以获取特定一周内的所有记录。我已将“星期五”视为一周的第一天。
我按降序排列记录,并获得每个AZ列的唯一值。这样,我得到了每周的最新记录,这就是我一直在寻找的内容。
我为此使用的代码如下:
Range("Data").AdvancedFilter _
Action:=xlFilterCopy, _
CriteriaRange:=Range("$A$1:$A$2"), _
CopyToRange:=Range("$BB$4:$BD$4")
FilterDataLastRow = Cells.Find(What:="*", _
After:=Range("BA999999"), _
LookAt:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
' Sort data in descending order of date
' Range("WeeklyFilteredData").Sort Key1:=Range("$BB$4:$BB$999999"), Order1:=xlDescending, Header:=xlYes
Range("AW4:BE999999").Sort Key1:=Range("BC4:BC999999"), order1:=xlDescending, Header:=xlYes
' Assign Unique Key for each record row. We are using RowNum for same
Range("BA5:BA" & FilterDataLastRow).Formula = "=ROW(RC[-2])"
' Assign SearchKey to filter Out all the data belonging to same week
Range("AZ5:AZ" & FilterDataLastRow).Formula = "=(TEXT(RC[3],""yyyy""))&(TEXT(WEEKNUM(RC[3],15),""00""))"
' Get all data in User View
Range("A5:A" & FilterDataLastRow).Formula = "=VLOOKUP(RC[51],C[51]:C[55],2,FALSE)"
Range("B5:B" & FilterDataLastRow).Formula = "=VLOOKUP(RC[50],C[50]:C[54],3,FALSE)"
Range("C5:C" & FilterDataLastRow).Formula = "=VLOOKUP(RC[49],C[49]:C[53],4,FALSE)"
Range("E5:E" & FilterDataLastRow).Formula = "=VLOOKUP(RC[47],C[47]:C[51],5,FALSE)"
Cells.RemoveDuplicates Columns:=Array(1)
直到WEEKNUM 53都运行良好。2020年1月从星期三开始,这被认为是WEEKNUM“ 1”,对我的报告不正确。
当前,我得到的输出如下所示:
我需要修改我的代码以跳过2019年12月31日的数据(以红色突出显示,因为该数据将作为截至2019年2月1日的一周的一部分进行计算。
[请提出一种更好的方法将我的代码更新为enter code here
在给定的开始日期,您对周的定义是什么?
如果是从该日期开始的一年中的第一周,那么您可以更容易地从VBA DatePart
函数中得出它,例如
DatePart("ww", myDate, vbFriday, vbFirstFullWeek)
如果需要在工作表上将此功能用作函数或公式的一部分,请使用它代替工作表WEEEKNUM
函数,后者不太灵活。