Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用excel vba迭代开始日期和结束日期_Excel_Vba - Fatal编程技术网

使用excel vba迭代开始日期和结束日期

使用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

我正在编写一个excel VBA代码,我想在其中迭代开始-结束和结束日期并添加+2

表1中的情景和假设如下所示

单元格参考号I1=2018年7月13日

输入表 从A1到C17,单元格值带有列标题

stocks start end end date dummy1 dummy2 dummy3 dummy4 dummy5 dummy6
第一部分,下面的代码将第一次运行,并根据单元格“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,对不起,我不知道解决您问题的有效方法。