使用excel vba迭代开始日期和结束日期
我正在编写一个excel VBA代码,我想在其中迭代开始-结束和结束日期并添加+2 表1中的情景和假设如下所示 单元格参考号I1=2018年7月13日 输入表 从A1到C17,单元格值带有列标题 stocks start end end date dummy1 dummy2 dummy3 dummy4 dummy5 dummy6使用excel vba迭代开始日期和结束日期,excel,vba,Excel,Vba,我正在编写一个excel VBA代码,我想在其中迭代开始-结束和结束日期并添加+2 表1中的情景和假设如下所示 单元格参考号I1=2018年7月13日 输入表 从A1到C17,单元格值带有列标题 stocks start end end date dummy1 dummy2 dummy3 dummy4 dummy5 dummy6 第一部分,下面的代码将第一次运行,并根据单元格“I1”中的日期修改所有日期 常规模块代码 Sub zi
第一部分,下面的代码将第一次运行,并根据单元格“I1”中的日期修改所有日期 常规模块代码
Sub zigZagRng(rng As Range)
Dim wb As Workbook
Dim ws As Worksheet
Dim i As Long, r As Long
Dim vDB As Variant, rngDB As Range
Dim currentValue As Date
Set wb = ThisWorkbook
Set ws = wb.Worksheets("Sheet1")
With ws
currentValue = rng.Value
r = .Range("a" & Rows.Count).End(xlUp).Row
Set rngDB = .Range(rng, "c" & r)
vDB = rngDB 'get Array from range(2 dimension)
vDB(1, 1) = currentValue
vDB(1, 2) = vDB(1, 1) + 2
For i = 2 To UBound(vDB, 1)
vDB(i, 1) = vDB(i - 1, 1) + 3
vDB(i, 2) = vDB(i, 1) + 2
Next i
End With
rngDB = vDB
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Target.Row > 1 And Target.Column = 2 Then
zigZagRng Target
End If
End Sub
第二部分,您需要将工作表1
工作表模块添加到工作表更改
事件中,因此每当有人更改B列中的值(开始-结束
)时,该行及以下的所有日期也将被修改
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long, LastRow As Long
' if a 'start end' was modifed, in column "B"
If Target.Column = 2 Then
Application.EnableEvents = False
LastRow = Cells(Rows.Count, "B").End(xlUp).Row
Range("C" & Target.Row).Value = DateAdd("d", 2, Target.Value) ' add 2 days to current row end date
For i = Target.Row + 1 To LastRow
Range("B" & i).Value = DateAdd("d", 1, Range("C" & i - 1).Value) ' current start equals previous end + 1
Range("C" & i).Value = DateAdd("d", 2, Range("B" & i).Value) ' current end equals current start + 2
Next i
End If
Application.EnableEvents = True
End Sub
试试这个
模块代码1'根据范围(“i1”)启动代码。
'模块代码2~~>要在工作表事件代码中调用的代码
Sub zigZagRng(rng As Range)
Dim wb As Workbook
Dim ws As Worksheet
Dim i As Long, r As Long
Dim vDB As Variant, rngDB As Range
Dim currentValue As Date
Set wb = ThisWorkbook
Set ws = wb.Worksheets("Sheet1")
With ws
currentValue = rng.Value
r = .Range("a" & Rows.Count).End(xlUp).Row
Set rngDB = .Range(rng, "c" & r)
vDB = rngDB 'get Array from range(2 dimension)
vDB(1, 1) = currentValue
vDB(1, 2) = vDB(1, 1) + 2
For i = 2 To UBound(vDB, 1)
vDB(i, 1) = vDB(i - 1, 1) + 3
vDB(i, 2) = vDB(i, 1) + 2
Next i
End With
rngDB = vDB
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Target.Row > 1 And Target.Column = 2 Then
zigZagRng Target
End If
End Sub
工作表事件代码
Sub zigZagRng(rng As Range)
Dim wb As Workbook
Dim ws As Worksheet
Dim i As Long, r As Long
Dim vDB As Variant, rngDB As Range
Dim currentValue As Date
Set wb = ThisWorkbook
Set ws = wb.Worksheets("Sheet1")
With ws
currentValue = rng.Value
r = .Range("a" & Rows.Count).End(xlUp).Row
Set rngDB = .Range(rng, "c" & r)
vDB = rngDB 'get Array from range(2 dimension)
vDB(1, 1) = currentValue
vDB(1, 2) = vDB(1, 1) + 2
For i = 2 To UBound(vDB, 1)
vDB(i, 1) = vDB(i - 1, 1) + 3
vDB(i, 2) = vDB(i, 1) + 2
Next i
End With
rngDB = vDB
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Target.Row > 1 And Target.Column = 2 Then
zigZagRng Target
End If
End Sub
假设您正在查找
DateAdd()
您可以说EndDate=DateAdd(“d”,2,StartDate)
,下一个开始日期将是StartDate=DateAdd(“d”,1,EndDate)
。检查谢谢Nesset,让我开始使用这个函数。谢谢Shai Rado的代码。工作如期进行。如果同一本书中有很多张纸(比如30到50张),请建议我。此工作表变更事件是否存在绩效滞后?稍后部署此解决方案后,我将与您分享另一个挑战…@Rod,因此您最终给出了另一个解决方案的“答案”?这两个解决方案对我都很好,但我不能同时标记“答案”。@Rod然后选择您决定使用的解决方案。我有两个工作簿。我正在使用这两种解决方案:-)感谢Dy.Lee的代码,它正在进行第一次迭代。但是,如果“开始日期”列中的任何值发生更改,则下一行不会更改。谢谢您的代码。现在开始工作了。你能告诉我在同一本工作簿中是否有很多页(比如30到50页)吗。此到期工作表\u更改事件是否存在任何性能滞后???您能否就此问题提供意见@Rod,对不起,我不知道解决您问题的有效方法。