【问题标题】:loop not iterating through list vba循环不遍历列表 vba
【发布时间】:2017-04-26 13:03:20
【问题描述】:

列表似乎只选择列表中的第一个单元格,有人可以告诉我哪里出错了吗?

每次我运行它时,它都会将列表中的第一个单元格分配给 ATL 选项卡中的单元格(然后将运行许多公式)并复制我想要的范围并粘贴到最终选项卡上。我希望它这样做,但它不会将列表向下移动到其他单元格。我有大约 40 个应该迭代的单元格,但它根本行不通。有什么想法吗?

Dim x As Integer
Dim List As Range
Dim intcount As Integer
Dim DCs As Worksheet
Dim Form As Worksheet
Dim Final As Worksheet
Dim DCdata As String
Dim wsList As String
Dim rnglistrange As Range


With ThisWorkbook
    Set DCs = .Sheets("List1")
    Set Form = .Sheets("ATL")
    Set Final = .Sheets("Final")
End With

DCs.Select

    intcount = DCs.Cells(Rows.Count, "A").End(xlUp).Row '--Get last row of list.
    Set List = DCs.Range("A1:A" & intcount) '--Qualify our list.

For Each rnglistrange In List '--For every name in list...
        Form.Select
        Range("A2") = List.Value
        Range("A632:N646").Copy
    Final.Select
    ActiveCell.SpecialCells(xlLastCell).Select
    Selection.End(xlToLeft).Select
    Selection.Offset(2, 0).Select
    ActiveCell.Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
Next

【问题讨论】:

    标签: vba excel loops foreach


    【解决方案1】:

    问题出在:

    Range("A2") = List.Value
    

    这只会将List range 的第一个值放在单元格“A2”中

    当你想放的时候:

    Range("A2") = rnglistrange
    

    这会将 current List 单元格 Value 放入单元格 A2 中

    但您可能还想考虑对代码进行这种重构,其主要目标是避免 Select/Selection/Activate/ActiveXXX 模式,支持完全限定的范围引用,而不是松散控制您实际引用的内容并提高性能(和屏幕闪烁)

    Option Explicit
    
    Sub main()
        Dim listRng As Range, listCell As Range
        Dim DCs As Worksheet, Form As Worksheet, Final As Worksheet
    
        With ThisWorkbook 
            Set DCs = .Worksheets("List1")
            Set Form = .Worksheets("ATL")
            Set Final = .Worksheets("Final")
        End With
    
        With DCs
            Set listRng = .Range("A1", .Cells(Rows.count, "A").End(xlUp)) '--Qualify our list.
        End With
    
        For Each listCell In listRng '--For every name in list...
            With Form
                .Range("A2") = listCell
                .Range("A632:N646").Copy
            End With
            With Final
                With .Cells(Rows.count, "A").End(xlUp).Offset(2)
                    .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                    :=False, Transpose:=False
                    .PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
                    SkipBlanks:=False, Transpose:=False
                End With
            End With
        Next
    End Sub
    

    【讨论】:

    • 哇,谢谢,真漂亮。我绝对想不出那个!哈哈。我很感激!
    • 不客气。那么现在你可以做到这一点了。还有更多
    【解决方案2】:

    您列表的第 25 行显示:

    Range("A2") = List.Value
    

    将该行更改为:

    Range("A2") = rnglistrange.Value
    

    然后您会看到它正在遍历“列表”范围的单元格。

    【讨论】:

      猜你喜欢
      • 2017-10-19
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      相关资源
      最近更新 更多