从给定日期

时间:2017-04-11 13:33:02

标签: excel vba excel-vba

我正在使用Excel 2010.

我希望将给定日期从格式mm/dd/yyyy转换为格式Wyy"weeknumber"

例如,4/10/2017将成为W1715,因为它是2017年的第15周。

下面显示的图片是我正在处理的excel表。我想将LT Verification - Planned Date列中的日期转换为上面提到的周数格式LT Verification - Planned Week Numbers

编辑:因为这是更大的VBA流程的一部分,我需要它在VBA中,而不是单元格公式。

我写了以下代码:

Public Sub WeekNumbers()

Dim lastRow As Integer
    lastRow = Range("A1:AZ1").Find("*", , , , xlByRows, xlPrevious).Row

Dim myRange As Range
    Set myRange = Range("A1:AZ1" & lastRow)

Dim myCell As Range
    For Each myCell In myRange

myCell.Offset(0, 1).Value = "W" & Right(Year(myCell.Value), 2) & Application.WorksheetFunction.WeekNum(myCell.Value)**

 Next myCell

 End Sub

此代码在myCell.Offset(0, 1).Value = "W" & Right(Year(myCell.Value), 2) & Application.WorksheetFunction.WeekNum(myCell.Value)

时给出错误

这里我有一个excel工作簿,每周都会更新。因此,每次更新时,它都会运行一个宏来从另一个文件导入数据。执行周数活动&创建一个数据透视表。

因此,工作表名称每周都会更改。此外,列标题可能在不同的周内位于不同的列中。此外,行数也可能每周都会改变。

所以,我需要指定列&行范围根据周数据动态调整。 并根据列标题而不是列名称(A或B或Z ...)列中的周数字。

Excel Table

3 个答案:

答案 0 :(得分:3)

使用单元格公式可以轻松实现:

="W" & RIGHT(YEAR(A1),2) & WEEKNUM(A1)

A1可以由包含日期的单元格替换。

在VBA中,这相当于

With Thisworkbook.Sheets("Sheet1")
    .Range("A2").Value = "W" & Right(Year(.Range("A1").Value), 2) & Application.WorksheetFunction.WeekNum(.Range("A1").Value)
End With

修改

要填充整个范围,您可以遍历单元格,按上述方式应用VBA计算。

Dim myRange as Range
Set myRange = Thisworkbook.Sheets("Sheet1").Range("A1:A10")

Dim myCell as Range
For Each myCell in myRange
    myCell.Offset(0,1).Value = "W" & Right(Year(myCell.Value), 2) & Application.WorksheetFunction.WeekNum(myCell.Value)
Next myCell

many methods for finding the last row in a range,如果您不知道自己的射程,我会留给您。

编辑2 :响应您的错误编辑。

您已使用以下行来定义范围:

Set myRange = Range("A1:AZ1" & lastRow)

让我们成像lastRow = 20,你现在有了

myRange.Address = "A1:AZ120"

这显然是错误的,你不应该在1之后拥有AZ。另外,我不知道你为什么要进入专栏AZ,如果你的所有日期数据都在A列中,你应该使用

Set myRange = Range("A1:A" & lastRow)

您实现的循环使用偏移量,因此列B中的值会更改以反映A列中的值。然后,您无法根据列{{1}设置列C }}!

答案 1 :(得分:2)

VBA中,您可以使用Format函数获取字符串。 "\Wyyww"是您要查找的格式,其中\用于转义对第一个W字符的解释并将其作为一个字符。< / p>

myCell.Offset(0,1).Value = Format(myCell.Value, "\Wyyww")

更多

您必须正确设置循环的范围。如果您的日期位于包含标题"LT Verificiation - Planned Date"的某个列中,您可以尝试以下操作:

Dim ws As Worksheet
Set ws = ActiveSheet ' <-- you can change this into something explicit like Sheets(someIndex)...

Dim myCell As Range
Set myCell = ws.Rows(1).Find("LT Verificiation - Planned Date")
For Each myCell In ws.Range(myCell.Offset(1), ws.Cells(ws.Rows.Count, myCell.Column).End(xlUp))
    If IsDate(myCell.value) Then myCell.Offset(, 1).value = Format(myCell.value, "\Wyyww")
Next myCell

答案 2 :(得分:0)

我认为你不需要VBA,试试这个公式:

=RIGHT(YEAR(A1),2)&WEEKNUM(A1)&"W"

当然,如果您坚持使用VBA,则可以随时将Excel公式转换为VBA代码。在这种情况下:

Dim rngInput As Range
Dim rngOutput As Range
With Application.WorksheetFunction
    rngOutput.Value = .Right(.Year(rngInput.Value), 2) & .Weeknum(rngInput.Value) & "W"
End With

或者你甚至可以设置公式和插入值,就像这样

Dim rngInput As Range
Dim rngOutput As Range
rngOutput.Formula = "=RIGHT(YEAR(" & rngInput.Address(False, False) & "),2)&WEEKNUM(" & rngInput.Address(False, False) & ")&""W"""
rngOutput.Value = rngOutput.Value