首页 > 解决方案 > VBA 多个 For 循环 - 仅在前两次正常工作

问题描述

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

因此,此电子表格适用于我的工作,适用于屠宰场产量测试,我希望它拥有的数据库存储在隐藏的工作表上,随着时间的推移将平均化,这样我或其他人就可以回来使用它并每隔几次更新一次月,以使平均值更准确,并更好地了解某些肉块的盈利能力。

一旦循环填写了所有有效的数据,我就尝试将循环值设置回它们的起始值,我认为我已经解决了这个问题,直到我多次运行测试并发现第一次和第二次按预期工作从第三个开始但是它不会在下一行开始循环它只是继续通过范围

正在发生的事情的屏幕截图

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

标签: excelvba

解决方案


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

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

但是,如果您注意到,它每次迭代只运行一次。这意味着在一张空白纸上,它将在第一次运行的第一次迭代中评估为 false 并继续,在第二次运行的第一次迭代中,它将评估为 true 并向下移动一行到第 4 行,但在第一次迭代中在第三次运行时,它还将评估 true 并向下移动到第 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)并通过增量设置范围将该值放置在最右边的列中。


推荐阅读