【问题标题】:nested loops not working, cant exit inner loop嵌套循环不起作用,无法退出内部循环
【发布时间】:2017-01-08 08:21:30
【问题描述】:

我尝试使用定义的范围循环通过自动过滤器来复制数据,然后循环通过我想要粘贴值数据的范围数组。

当内部循环继续执行并且所有范围都具有相同的值时,我遇到了问题。

认为我需要以某种方式将其压缩为 1 个循环,但我一生无法弄清楚如何让两者在同一个循环中一起递增?

Sub TrendTables()

Dim rng As Range, dailyTrendrng As Long, c As Range
Dim lastrow As Long

Dim aTrendRng(1 To 16) As Range

Set aTrendRng(1) = Sheets("Daily Trends").Range("A2")
Set aTrendRng(2) = Sheets("Daily Trends").Range("K2")
Set aTrendRng(3) = Sheets("Daily Trends").Range("A29")
Set aTrendRng(4) = Sheets("Daily Trends").Range("K29")
Set aTrendRng(5) = Sheets("Daily Trends").Range("A56")
Set aTrendRng(6) = Sheets("Daily Trends").Range("K56")
Set aTrendRng(7) = Sheets("Daily Trends").Range("A83")
Set aTrendRng(8) = Sheets("Daily Trends").Range("K83")
Set aTrendRng(9) = Sheets("Daily Trends").Range("A110")
Set aTrendRng(10) = Sheets("Daily Trends").Range("K110")
Set aTrendRng(11) = Sheets("Daily Trends").Range("A137")
Set aTrendRng(12) = Sheets("Daily Trends").Range("K137")
Set aTrendRng(13) = Sheets("Daily Trends").Range("A164")
Set aTrendRng(14) = Sheets("Daily Trends").Range("K164")
Set aTrendRng(15) = Sheets("Daily Trends").Range("A191")
Set aTrendRng(16) = Sheets("Daily Trends").Range("K191")


'clear ranges on Daily Trends tab
Set rng = Sheets("Daily Trends").Range("A2:S24, A29:S51, A56:S78, A83:S105, A110:S132, A137:S159, A164:S186, A191:S213")
rng.ClearContents

'turn off any previous filters
If Sheets("daily dump").AutoFilterMode Then
    Sheets("daily dump").AutoFilter.Range.AutoFilter
End If


With Sheets("daily dump")
    lastrow = .Cells(Rows.Count, "A").End(xlUp).Row
End With

Set c = Sheets("mapping").Range("BG1:BG16")

For Each c In Sheets("mapping").Range("BG1:BG16")

Sheets("daily dump").Range("A4:P" & lastrow).AutoFilter Field:=4, Criteria1:="=" & c.Value
Sheets("daily dump").Range("A4:P" & lastrow).SpecialCells(xlCellTypeVisible).Copy

    For dailyTrendrng = LBound(aTrendRng) To UBound(aTrendRng)
        aTrendRng(dailyTrendrng).PasteSpecial xlValues
    Next


''''''this is where i want to go back to my first "FOR LOOP"


Next

End Sub

【问题讨论】:

  • 我是否正确理解您要将范围(至少一行高和 16 列 (A-P) 宽)复制到单个单元格?因为这就是它的样子。或者您想粘贴值根据顺序,例如从单元格 A 在过滤范围内的结果到aTrendRng(1),从单元格 B 到 aTrendRng(2) 等等?您可以删除行 Set c = Sheets("mapping").Range("BG1:BG16"),因为 c 用作 for 中的范围的实例每个循环。
  • 希望根据 aTrendRng 数组定义的范围按顺序粘贴值。
  • 我想根据 aTrendRng 数组定义的顺序粘贴值。又名循环过滤范围,复制过滤范围,运行内部循环以确定粘贴值的位置,重复外部迭代 1x,重复内部循环交互 1x,等等。
  • 您的评论行 (''''''this is where i want to go back to my first "FOR LOOP") 您的第一个 For 循环中。
  • 正如@Rufus 所说,您将至少一行复制 16 列到目标单元格。所以第二次通过你的循环(目的地的左上角是K2),你将写下你在第一次迭代中写的信息的大约一半(当左上角是A2)。您真的要每次复制 16 列吗?您有 16 个目标单元格(尽管这只是一个“角落”)、16 个条件和 16 列,这似乎很可疑。因此,也许可以提供一个屏幕截图,说明您的数据是什么样的以及您想要实现的目标。

标签: excel nested-loops vba


【解决方案1】:

如果您确信您复制的范围将始终适合 27 行 x 10 列的目标区域,则以下代码已被重构为仅使用单个循环:

Sub TrendTables()

    Dim rng As Range, dailyTrendrng As Long, c As Range
    Dim lastrow As Long
    Dim mappingRow As Long
    Dim aTrendRng As Variant

    aTrendRng = Array("A2", "K2", _
                      "A29", "K29", _
                      "A56", "K56", _
                      "A83", "K83", _
                      "A110", "K110", _
                      "A137", "K137", _
                      "A164", "K164", _
                      "A191", "K191")

    'clear ranges on Daily Trends tab
    Set rng = Worksheets("Daily Trends").Range("A2:S24, A29:S51, A56:S78, A83:S105, A110:S132, A137:S159, A164:S186, A191:S213")
    rng.ClearContents

    With Worksheets("daily dump")
        'turn off any previous filters
        If .AutoFilterMode Then
            .AutoFilter.Range.AutoFilter
        End If

        lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row

        mappingRow = 1
        For dailyTrendrng = LBound(aTrendRng) To UBound(aTrendRng)
            'This line could be used if we wanted to get rid of "mappingRow", but
            'it's a bit harder to understand
            '.Range("A4:P" & lastrow).AutoFilter Field:=4, Criteria1:="=" & Worksheets("mapping").Range("BG" & (dailyTrendrng - LBound(aTrendRng) + 1)).Value
            'so we will use the following line instead
            .Range("A4:P" & lastrow).AutoFilter Field:=4, Criteria1:="=" & Worksheets("mapping").Range("BG" & mappingRow).Value
            .Range("A4:P" & lastrow).SpecialCells(xlCellTypeVisible).Copy
            Worksheets("Daily Trends").Range(aTrendRng(dailyTrendrng)).PasteSpecial xlValues

            mappingRow = mappingRow + 1
        Next
    End With

End Sub

主要变化是:

  • 我创建了一个额外的变量 (mappingRow) 来指向“映射”表中的每个单元格。 (我包含了一个注释掉的行,它可以在没有额外变量的情况下实现相同的效果,但使用额外变量可能更容易理解。)这是实现您所需要的真正的唯一更改想要。

  • 我只存储了 16 个目标范围地址,而不是 16 个不同的范围对象。似乎这样维护起来会更容易一些。

  • 我将Rows.Count 更改为.Rows.Count,以便它引用“daily_dump”工作表而不是活动工作表。

  • 我在所有地方都使用Worksheets 而不是Sheets - Sheets 集合包括Chart 表,因此当您知道 表明您正在使用Worksheet,并且仅在您不确定您引用的是Worksheet 还是Chart 时才使用Sheets

【讨论】:

  • 非常感谢您的帮助,这一切都很好。这绝对给了我一些东西来回顾和了解你在做什么以及为什么。非常感谢你。实际上,我在使用您注释掉的选项时,因为映射计数器没有增加。非常感谢您的帮助并提供此替代方案!!!
  • @geoTheNeo - 哎呀 - 我忘了在代码中包含 mappingRow = mappingRow + 1 行 - 我现在已经编辑了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 2023-03-08
  • 2018-07-13
  • 2013-09-11
  • 1970-01-01
相关资源
最近更新 更多