VBA多个For循环-仅在前两次有效

时间:2019-01-23 17:19:04

标签: excel vba

因此,我已经在这小段代码上工作了几天,遇到了我无法弄清的障碍。基本上,我有一个嵌套的for循环,该循环应该从一张工作表中获取值并将其放入数据表中,以便可以保存这些值并随时间平均。 我希望将像这样的单元格M5-M35中的数据放入数据表中:从左至右A3-AC200,但是我也希望一旦M5-M35范围用完值并且当用户使用时循环就停止接下来按下按钮以存储数据,我希望循环从下一行开始。

因此,此电子表格适用于我的工作,适用于屠杀产量测试,我希望它将其拥有的数据库存储在一个隐藏的工作表中,该工作表会随着时间的推移而平均化,以便我或其他人可以返回到该工作表并进行更新每隔几个月就会使平均值更准确,并更好地了解某些割肉的获利能力。

一旦循环填充了所有有效的数据,我就尝试将循环值设置回其初始值,我认为自己可以解决问题,直到我多次运行测试并发现第一次和第二次从第三步开始按预期工作,但是它不会在下一行开始向下循环,它只会继续运行范围

Screen capture of what is happening

Sub subData1()

    Dim rng As Range
    Dim rcell As Range
    Dim ws As Worksheet
    Dim Tws As Worksheet

    Set Tws = Worksheets("Test")
    Set ws = Worksheets("data")

    For i = 3 To 200 'range is from cell A3 - A200

        'if start cell already has value go down a row
        If ws.Cells(i, 1).Value <> "" Then
            i = i + 1
        End If

        'set the range for data sheet
        Set rng = ws.Range(ws.Cells(i, 1), ws.Cells(i, 30).End(xlToRight))

        For f = 5 To 35

            For Each rcell In rng 'loop through each cell in data sheet range

                If rcell.Value = "" Then 'if cell is blank input data

                    If Tws.Cells(f, 13).Value <> "" Then

                        'Check the selected Cell has a value
                        rcell.Value = Tws.Cells(f, 13).Value
                        f = f + 1

                    End If

                Else

                    If f > 5 Then
                        MsgBox "Data Storage Updated", , "Data Storage"
                        f = 5
                        Exit Sub

                    'Else
                        'MsgBox "Value Must Be Greater Than Zero", , f
                        'f = 5
                        'Exit Sub

                    End If

                End If
            Next
        Next
    Next

End Sub

1 个答案:

答案 0 :(得分:0)

第一次和第二次工作的原因是因为这条线

If ws.Cells(i, 1).Value <> "" Then
    i = i + 1
End If

但是,如果您会注意到,它每次迭代只运行一次。这意味着在空白表上,它将在第一次运行的第一次迭代中评估为false并继续,在第二次运行的第一次迭代中,它将评估为true并向下移动到第4行,但是在第一次迭代中在第三次运行中,它还将评估为真,并向下移动到第4行,然后将数据从ws.Range(ws.Cells(i, 1), ws.Cells(i, 30).End(xlToRight))

开始放置

您需要将If-End If更改为一个函数,该函数将检索数据表A列中最后使用的行。另外,您可能不需要外部For-Next循环,因为这会循环遍历输出工作表,并且每行将输出相同的M5:M35值。

如果我正确理解了您的需求,我相信您可以利用它来完成您想要的

Dim rng As Range
Dim ws As Worksheet
Dim Tws As Worksheet

Dim endRow As Long

Set Tws = Worksheets("Test")
Set ws = Worksheets("data")

endRow = ws.Range("A" & Rows.Count).End(xlUp).Row + 1

Set rng = ws.Cells(endRow, 1)

For f = 5 To 35
    If Tws.Cells(f, 13).Value <> "" Then
        rng.Value = Tws.Cells(f, 13).Value
        Set rng = rng.Offset(0, 1)
    End If
Next

这样,每次单击连续按钮都将在新行中插入数据,循环遍历Tws.Cells(f,13)并通过递增设置范围将该值放置在最右边的列中。