我正在使用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 ...)列中的周数字。
答案 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