从给定日期获取周数的VBA代码

从给定日期获取周数的VBA代码,vba,excel,Vba,Excel,我正在使用Excel 2010 我希望将给定日期从格式mm/dd/yyyy转换为格式Wyy“weeknumber” 例如,4/10/2017将变为W1715,因为这是2017年第15周 下图是我正在处理的excel表格。我想将LT-Verification-计划日期列中的日期转换为上述LT-Verification-计划周数列中的周数格式 编辑:因为这是一个更大的VBA过程的一部分,所以我需要它在VBA中,而不是在单元格公式中 我编写了以下代码: Public Sub WeekNumbers()

我正在使用Excel 2010

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

例如,
4/10/2017
将变为
W1715
,因为这是2017年第15周

下图是我正在处理的excel表格。我想将
LT-Verification-计划日期
列中的日期转换为上述
LT-Verification-计划周数
列中的周数格式

编辑:因为这是一个更大的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…)在列中显示周数


我认为你不需要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

这可以通过单元格公式轻松实现:

="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
有,所以如果你不知道你的射程,我就留给你了


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

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

Set myRange = Range("A1:AZ1" & lastRow)
让我们想象一下,您现在有了
lastRow=20

myRange.Address = "A1:AZ120"
这显然是错误的,你不应该在
AZ
后面加
1
。另外,我也不知道您为什么选择了列
AZ
,如果您所有的日期数据都在列
A
,您应该使用

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

您所实现的循环使用偏移量,因此列
B
中的值将更改以反映列A中的值。然后,您不能根据列
B
设置列
C

VBA
中,您可以使用
Format
函数获取字符串
“\wyww”
是您正在寻找的格式,其中
\
用于逃避对第一个
W
字符的解释,并将其视为一个普通字符

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

必须正确设置循环的范围。如果您的日期在标题为“LT验证-计划日期”的列中,您可以尝试以下操作:

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
Dim ws As工作表

设置ws=ActiveSheet'您尝试了什么?请参见此处获得一些帮助:请参见此处了解如何提问:使用公式很容易做到这一点。你试过什么了吗?查看MSDN页面和(超链接)。您开始更改问题的范围。如果您有成功执行格式化的代码,请接受下面的最佳答案。要查找该列,您应该使用类似于
rw=ActiveSheet.Rows(1).Find(what:=“LT-Verification-Planned Date”,lookat:=xlwhole)。column
。如果你需要更多的帮助,可以专门问一个单独的问题。我想你是对的,我需要问一个关于范围的单独问题。但是,即使我设置了范围(特定于本周),查找周数的错误仍然存在。您是否尝试了我的答案(编辑2)中的修复?谢谢您的回复!但是,该文件必须运行并从其他文件导入数据,并且在每周有人运行时自动更新。所以,我需要使用VBA代码来自动化这个过程。这样设置公式是行不通的,所有的单元格都会使用
A1
作为它们的输入…这非常有效。但是,我需要自动化整个过程来填充整个列而不仅仅是一个单元格。
Public Sub-WeekNumbers()将lastRow设置为整数lastRow=Range(“A1:AZ1”)。查找(“*”,xlByRows,xlPrevious)。将myRange设置为Range Set myRange=Range(“A1:AZ1”&lastRow)将myCell设置为myRange中每个myCell的范围。偏移量(0,1).Value=“W”&Right(Year(myCell.Value),2)和Application.WorksheetFunction.WeekNum(myCell.Value)下一个myCell End Sub
您希望我如何处理这堆代码?很抱歉造成混乱。我试图编辑它,并有一个断线。但是,我不能这样做。请容忍我,直到我弄明白为止!不能在注释中添加换行符。如果这扩展了您的问题,请将其作为编辑插入(单击问题标签下方的编辑)谢谢!代码运行,但没有更新任何内容。而且它没有显示任何错误@Pooja这是因为设置范围的代码是错误的。我还以为Wolfie正在努力呢。我将编辑以澄清。@A.S.H:请参阅编辑我的问题。我试图更好地解释我实际上在寻找什么&我也解释了范围问题。@Pooja好的,那么您想要查找的列的名称是什么,是否总是
“LT verfication-Planned Date”
?它总是排在第一行吗?不用谷歌就能找到答案。玩弄代码<代码>myCell.Offset(,1).Value=格式(myCell.Value,“\Wyy”)&格式(ISOweeknum(myCell.Value),“00”)
。谢谢你的帮助!:)