2017-03-14 204 views
0

以下代码仅适用于c = 2,但我希望它也适用于其他值。下面是我想要运行它的Excel表格。在Excel VBA中嵌套for循环

Date PickupCost StorageCost DeliveryCost 
1/1/2017 140  35   0 
1/8/2017 80  20   0 
1/10/2017 0   0   149 
1/30/2017 35   8   0 

我要填写每个日期失踪,但只在第3栏(StorageCost)值的数据需要在其他失踪日期值前一天的StorageCost值相同。

Dim j, p, w, c As Long 
Dim date1, date2 As Date 
j = Cells(Rows.Count, 1).End(xlUp).Row 
w = 2 
For c = w To j 
    date1 = Range("A" & w).Value 
    date2 = Range("A" & (w + 1)).Value 
    p = DateDiff("d", date1, date2) 
    For w = 2 To p 
     Range("A" & (c + 1)).EntireRow.Insert 
     ActiveSheet.Cells(c + 1, 1).Value = (ActiveSheet.Cells(c, 1).Value) + 1 
     ActiveSheet.Cells(c + 1, 2).Value = 0 
     ActiveSheet.Cells(c + 1, 3).Value = ActiveSheet.Cells(c, 3).Value 
     ActiveSheet.Cells(c + 1, 4).Value = 0 
     c = c + 1 
    Next w 
    w = w + 1 
    ActiveSheet.Range("A1").Select 
    j = Cells(Rows.Count, 1).End(xlUp).Row 
Next c 
+0

什么是C应该是和你在哪里初始化呢? –

+0

c是基于哪个循环需要运行的次数的计数器,以便需要计算在前一行的行和日期的每个日期组合之间的间隙。它是根据w的值初始化的。 –

+0

请解释你想要做得更好 - 我不明白。 “数据缺失”是否为0值?你能举一个你想要结果的例子吗? – user1274820

回答

1

你的主要问题是,一旦你确定你的For c = w To j环路,则它将只运行,直到它到达当你定义的for循环j值了。 如果你想要一个端点,能够适应在运行时更改的行数的循环,你应该使用Do Until循环,就像这样:

Dim p As Long 
Dim c, w As Integer 
Dim date1, date2 As Date 

c = 2 
Do Until c = Cells(Rows.Count, 1).End(xlUp).Row 
    date1 = Range("A" & c).Value 
    date2 = Range("A" & (c + 1)).Value 
    p = DateDiff("d", date1, date2) 
    For w = c To c + p - 2 
     Range("A" & (w + 1)).EntireRow.Insert 
     ActiveSheet.Cells(w + 1, 1).Value = (ActiveSheet.Cells(c, 1).Value) + 1 
     ActiveSheet.Cells(w + 1, 2).Value = 0 
     ActiveSheet.Cells(w + 1, 3).Value = ActiveSheet.Cells(c, 3).Value 
     ActiveSheet.Cells(w + 1, 4).Value = 0 
     c = c + 1 
    Next w 
    c = c + 1 
Loop 
+0

非常感谢。它完全按照我的要求工作。 –