与“选择案例”相结合的循环

Posted

技术标签:

【中文标题】与“选择案例”相结合的循环【英文标题】:Loop with "Select Cases" combined 【发布时间】:2016-01-19 02:33:02 【问题描述】:

我尝试组合一个简单的循环代码并选择案例以返回所需的用户结果(我知道代码不正确)。在 J 列中,我有从 2012 年到 2017 年的一系列年份,具体取决于 J 列中的年份,我希望将 U 列中的数据剪切到 AG 并将其粘贴到正确的位置。

我想出的代码如下;

Sub Move_data()

Dim rng As Range
Dim LR As Long
LR = Range("J1048576").End(xlUp).Row
Set rng = Range(Cells(2, 10), Cells((LR), 10))

For x = 2 To LR Step 1
Select Case Range("J" & x).Value2
        Case 2012
            Range("BU" & x).Cut
            Range("IH" & x).Paste
            Range("U" & x, ":CG" & x).Cut
            Range("AH" & x).PasteSpecial
            ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1
        Case 2013
            Range("BU" & x).Cut
            Range("IH" & x).Paste
            Range("U" & x, ":CG" & x).Cut
            Range("AU" & x).PasteSpecial
            ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1
        Case 2014
            Range("BU" & x).Cut
            Range("IH" & x).Paste
            Range("U" & x, ":CG" & x).Cut
            Range("BH" & x).PasteSpecial
            ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1
        Case 2015
            Range("BU" & x).Cut
            Range("IH" & x).Paste
            Range("U" & x, ":CG" & x).Cut
            Range("BU" & x).PasteSpecial
            ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1
        Case 2016
            Range("BU" & x).Cut
            Range("IH" & x).Paste
            Range("U" & x, ":CG" & x).Cut
            Range("CH" & x).PasteSpecial
            ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1
        Case 2017
            Range("BU" & x).Cut
            Range("IH" & x).Paste
            Range("U" & x, ":CG" & x).Cut
            Range("CU" & x).PasteSpecial
            ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1

           End Select

             x = x + 1
            Else
            End If
            Next x


            End Sub

另外我觉得循环遍历每一行可能没有时间效率,因为文件中有超过 1000 行,排序和选择所有相同的年份并一次移动所有数据可能会更快。 (但我不确定如何做到这一点)

非常感谢任何有关代码调整的帮助或实现此目标的最佳方法的指导!我附上了一张图片,以指导我想要实现的目标。

【问题讨论】:

【参考方案1】:

虽然这不能完全满足您的需求,但它会让您了解如何开始使用表格。这将检测表中的唯一值(而不是设置案例示例),然后尝试跟踪它。您必须将数据源转换为表格 (listobject),还有一些其他内容需要修改(尝试使用 cmets 突出显示它们。查看代码并随时提问有用的话有什么问题。

数据源(表格)

代码

Option Explicit

Sub tableLoop()
    Dim ws As Worksheet
    Dim tbl As ListObject
    Dim i As Integer: Dim NoRow As Integer
    Dim arr() As Variant
    Dim c

    With Application
        .ScreenUpdating = False
    End With

    Set ws = ActiveSheet
    Set tbl = ws.ListObjects(1)

    On Error Resume Next
    ws.ShowAllData
    On Error GoTo 0

    ' first we will sort the table into order on year
    With tbl.Sort
        .SortFields.Clear
        ' Change the Range to match your table and year column)
        .SortFields.Add Key:=Range("Table1[[#All],[Project Year]]"), SortOn:=xlSortOnValues, _
            Order:=xlAscending, DataOption:=xlSortNormal
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    ' Get unique values in project year and put into array

    With tbl.ListColumns(1).DataBodyRange
        .AdvancedFilter Action:=xlFilterInPlace, Unique:=True
    End With
    i = 0
    For Each c In tbl.ListColumns(1).DataBodyRange.SpecialCells(xlCellTypeVisible)
        ReDim Preserve arr(0 To i)
        arr(i) = c.Value
        i = i + 1
    Next c

    ' Change this loop for however you want the output to be
    For i = 1 To UBound(arr)
        Debug.Print arr(i)
        With tbl
            .Range.AutoFilter Field:=1, Criteria1:=arr(i)
            .ListColumns(2).DataBodyRange.SpecialCells(xlCellTypeVisible).Copy
        End With
        With ws
            NoRow = i
            .Cells(NoRow, 5) = arr(i)
            .Cells(NoRow, 6).PasteSpecial Paste:=xlPasteValues, Transpose:=True
            On Error Resume Next
            .ShowAllData
            On Error GoTo 0
        End With
    Next i

    With Application
        .ScreenUpdating = True
    End With

End Sub

输出

【讨论】:

【参考方案2】:

在我匆忙查看您的代码时,似乎只有 Range(...).PasteSpecial 行在不同情况下有所不同。您可以消除Select Case 结构,而是创建一个包含PasteSpecial 列的数组:cols = "AH", "AU", "BH", "BU", "CH", "CU"。然后你可以选择TheCol = cols(year-2011)的列。

另一种方式:由于列是规则间隔的(相隔 13),您可以按列号:col_num = 13*(year-2011) + 21。然后使用Range.Cells(x, col_num)之类的东西。

希望有帮助

【讨论】:

以上是关于与“选择案例”相结合的循环的主要内容,如果未能解决你的问题,请参考以下文章

将ZMQ事件循环与QT / Pyforms事件循环相结合

scss 一个SCSS循环,将垂直(产品供应)与图标和彩色背景相结合。

具有多个条件的选择案例函数未循环

将“for”循环与 if-else 语句相结合,每个“if”语句中都有多个条件

避免插入与选择相结合的 SQL 死锁

Django:在模型选择中将惰性翻译与标记安全相结合