在每周工作时间在Excel VBA中转换日期

问题描述 投票:0回答:1

您好我有一个列中的日期存在于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

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

excel vba excel-formula
1个回答
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与和也ActiveSheeting的值,使得代码正在与一个Transpos[e]阵列(此致将已经从1D可能导致错误服用)的显式片参考。然后我ReDimed的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

这些问题,我发现其中:

  • 数组被声明为2D1D引用
  • 弱势区间参考意义的代码指的是ActiveSheet可能导致错误
  • 使用End(xlDown)但第一小区以上开始,导致范围,只选择一个小区(因此可能是默认为单元的值,而不是建立一个数组)范围选择
  • All_WorkWeek所以它不会接受任何值可能无法正常启动
© www.soinside.com 2019 - 2024. All rights reserved.