首页 > 解决方案 > VBA中难以控制的时间循环

问题描述

我有一张超过 20,000 行的员工表。他们所有的 SSN 都在 Y 列中。每个人的行数未知。L 列中包含月份 # 的 1-12。数据从第 8 行开始。我在开始时将 DataRow 设置为 8。文件按 SSN 排序。我要做的是在“输出”选项卡的 AJ 到 AU 列中写一个“Y”,以表示员工在 L 列中是否有该月的一行。这很有效。

我的问题是我需要遍历每个员工,跟踪“原始数据”选项卡上的每条记录以获取一个行数,但要知道 SSN 何时更改,以便在写入“输出”选项卡时增加 OutputRow。我对大多数 VBA 结构都很满意。

但我有一个逻辑问题。使用 Do While 或 Do Until 并比较各行之间的 SSN 仅获取一名员工的记录,然后结束。如果我使用 For Each 或 For Next,我仍然需要比较记录之间的 SSN 以确定它们何时更改。

这是相关的代码。为简洁起见,我缩短了案例陈述列表。我真的不需要代码语法帮助。(好吧,我对数组一无所知。)我只是陷入了设计这个狭窄的方式。我确信有更好的方法我没有考虑。你有什么建议?

Do Until IsEmpty(Sheets("Orig Data").Range("A" & DataRow + 1)) = True
    Do While Sheets("Orig Data").Range("Y" & DataRow) = Sheets("Orig Data").Range("Y" & DataRow - 1)

        Select Case Range("L" & DataRow).Value
            Case "1"
                Sheets("Output").Range("AJ" & OutputRow) = "Y"

            Case "2"
                Sheets("Output").Range("AK" & OutputRow) = "Y"

            Case "3"
                Sheets("Output").Range("AL" & OutputRow) = "Y"

        End Select
        DataRow = DataRow + 1
    Loop 'until changes person
    DataRow = DataRow + 1
    OutputRow = OutputRow + 1
Loop 'until Blank

我的意图是将记录写入“输出”选项卡,该选项卡的末尾附加了 12 列。我最终应该为每个员工创建一份记录。当作为一次性提供程序接口的一部分完成时,我们将通过此过程运行多个文件。

标签: excelvbaloops

解决方案


敲了敲我的头,走了一会儿,我就可以开始工作了。我就是只见树木不见森林。我只需要进行一些重组并依靠 IF 语句来进行一些检查。对于那些真正注重细节的人,是的,Case 语句中有列更改,因为我发现一列不会出现在最终文件中。这就是它的样子:

                Do Until IsEmpty(Sheets("Orig Data").Range("A" & DataRow + 1)) = True

                    Select Case Range("K" & DataRow).Value
                        Case "1"
                            Sheets("Output").Range("AI" & OutputRow) = "Y"

                        Case "2"
                            Sheets("Output").Range("AJ" & OutputRow) = "Y"

                        Case "3"
                            Sheets("Output").Range("AK" & OutputRow) = "Y"    
                    End Select

                        If Sheets("Orig Data").Range("Y" & DataRow) <> Sheets("Orig Data").Range("Y" & DataRow + 1) Then
                            OutputRow = OutputRow + 1
                            DataRow = DataRow + 1
                            Worksheets("Orig Data").Range("A" & DataRow & ":AH" & DataRow).Copy Worksheets("Output") _
                            .Range("A" & OutputRow & ":AH" & OutputRow)
                        Else
                            DataRow = DataRow + 1
                            If IsEmpty(Sheets("Orig Data").Range("A" & DataRow + 1)) = True Then
                                MsgBox "Done"
                                Exit Sub
                            End If
                        End If
                    Loop

推荐阅读