在Excel VBA中的工作周中转换日期

时间:2019-02-06 09:34:21

标签: excel vba excel-formula

嗨,我有一列以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

但是我的下标超出范围异常。谁能告诉我这是什么错误?

1 个答案:

答案 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_DatesAll_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可能未正确启动,因此它不接受任何值