嗨,我有一列以yyyy-mm-dd h:mm:ss格式显示日期的列。 我想将它们转换为工作周。
我尝试过
For DateCounter = 1 To UBound(All_Submitted_Dates)
All_workweek(DateCounter) = WorksheetFunction.WeekNum(All_Submitted_Dates(DateCounter))
Next DateCounter
但是我的下标超出范围异常。谁能告诉我这是什么错误?
答案 0 :(得分:1)
直接从范围分配数组将最终导致2D
数组而不是1D
。为了克服这个问题,您可以引用它例如All_Submitted_Dates(DateCounter, 1)
或Transpose
您的输入。
如果您将输入数据保存在单个列中,则只需Transpose
一次即可
With Application
All_Submitted_Dates = .Transpose(Range("K2", Range("K1").End(xlDown)))
End With
但是,如果您的数据位于多列中,则需要将其Transpose
进行翻倍以获取1D
数组
With Application
All_Submitted_Dates = .Transpose(.Transpose(Range("K2", Range("K1").End(xlDown))))
End With
然后,您就可以像在其余代码中一样引用数组了
评论后更新 我认为您的问题是综合考虑的(但是这可能是由于您没有在问题中包含信息)。您能否看一下下面的代码。
我已将All_Submitted_Dates
和All_WorkWeek
声明为变体。然后,我为All_Submitted_Dates
设置了一个显式的工作表引用(您可能会从ActiveSheet
中提取,可能会导致错误),还Transpos[e]
设置这些值,以便代码可以使用1D
数组。然后,我ReDim
编辑了All_WorkWeek
数组,以便其大小与All_Submitted_Dates
相匹配。然后,如上所述,您已经使用了For
循环。但是,我建议使用Lbound(All_Submitted_Dates)
而不是1,尽管这没什么大不了,但这是一个好习惯。
您将需要参考存储输入数据的工作表来更新With Sheet1
块,但是,在我的测试中,此工作按预期进行。
Dim All_Submitted_Dates As Variant, All_WorkWeek As Variant
Dim DateCounter As Long
' Update with your sheet reference
With Sheet1
All_Submitted_Dates = Application.Transpose(.Range(.Range("K2"), .Cells(.Rows.Count, "K").End(xlUp)))
End With
ReDim All_WorkWeek(LBound(All_Submitted_Dates) To UBound(All_Submitted_Dates))
For DateCounter = 1 To UBound(All_Submitted_Dates)
All_WorkWeek(DateCounter) = WorksheetFunction.WeekNum(All_Submitted_Dates(DateCounter))
Next DateCounter
我在哪里发现的问题
2D
,并引用为1D
ActiveSheet
可能会导致错误End(xlDown)
进行范围选择,但从第一个单元格上方开始,导致Range仅选择一个单元格(因此可能默认为cell的值,而不是创建数组)All_WorkWeek
可能未正确启动,因此它不接受任何值