【问题标题】:How do I set the value of a do while inner loop, nested in a for loop?如何设置嵌套在 for 循环中的 do while 内部循环的值?
【发布时间】:2019-05-08 14:26:06
【问题描述】:

我有一份从客户的 SharePoint 下载的报告。该报告的长度取决于我运行它的站点和时间范围。大多数项目遇到的情况是,它们的信息在每个项目的一行中很好地排列在列中,但是在存在拆分决策的情况下,它将决策分为多行,并且不会在这些行中保留其他必要的信息。我正在尝试拆分配置并通过以下行查找循环以复制数量并根据它们的配置将它们粘贴到列中。

我设置了外循环并且它可以工作。当我设置内部循环时,它不会获取外部循环的值并向其添加 1 行。

Sub Split_Dispositions_One_Line()
    Dim LastRow As Integer
    Dim i As Integer
    i = x + i
    LastRow = Worksheets("Data").UsedRange.Rows.Count
    With Worksheets("Data")
        For x = 1 To LastRow
            If InStr(Range("Y" & x).Value, "Split Disposition") Then
                Do While Application.WorksheetFunction.IsText(Range("AI" & i).Value)
                    If InStr(Range("AI" & i).Value, "Release to Good Inventory") Then
                        Range("AH" & i).Copy Range("AK" & x)
                    ElseIf InStr(Range("AI" & i).Value, "Donate") Then
                        Range("AH" & i).Copy Range("AL" & x)
                    ElseIf InStr(Range("AI" & i).Value, "Destroy, Landfill") Then
                        Range("AH" & i).Copy Range("AM" & x)
                    ElseIf InStr(Range("AI" & i).Value, "Destroy, Animal Feed") Then
                        Range("AH" & i).Copy Range("AN" & x)
                    ElseIf InStr(Range("AI" & i).Value, "Return To Plant") Then
                        Range("AH" & i).Copy Range("AO" & x)
                    End If
                Loop
            End If
        Next x
    End With
End Sub

我的目标是遍历行,当我在 Y 列中遇到“Split Disposition”时,它将进入内部循环,从 Y 中找到“Split Disposition”的位置下降 1 行并循环遍历那些行,如果 AI 包含文本,它将复制 AH 中的值并将其粘贴到与原始行中的 AH 对应的列,在该列中它在 Y 列中找到“Split Disposition”。这些行的数量各不相同,但它们始终为一一个接一个。

如果循环在单元格 Y5 中找到“Split Disposition”,则内部循环将从 AI6 开始,如果它有文本复制 AH6 并粘贴到 AK5 列,那么如果 AI7 包含文本,它将复制 AH7 并可能粘贴它在 AL5 中(如果那是与 AH7 匹配的列)。

【问题讨论】:

  • 请注意,行计数变量(iLastRow)必须是 Long 类型,因为 Excel 的行数超过了 Integer 可以处理的数量。 • 并且根本没有声明x。我建议始终激活Option Explicit:在 VBA 编辑器中转到 ToolsOptionsRequire Variable Declaration
  • 另一件事是您的With Worksheets("Data") 完全没用,因为您的Range 语句都不是以点. 开头,如果您希望您的范围使用With 语句,您应该启动它们像.Range("Y" & x) 这样的点。为With 语句中的所有范围修复此问题。

标签: excel vba


【解决方案1】:

将内部循环更改为带有退出选项的 for 循环,这似乎可行。

Sub Split_Dispositions_One_Line()
        Dim LastRow As Integer
        Dim i As Integer
        LastRow = Worksheets("Data").UsedRange.Rows.Count
        With Worksheets("Data")
            For x = 1 To LastRow
                If InStr(Range("Y" & x).Value, "Split Disposition") Then
                    For i = x + 1 To LastRow
                        If Application.WorksheetFunction.IsText(Range("AI" & i).Value) Then
                            If InStr(Range("AI" & i).Value, "Release to Good Inventory") Then
                                Range("AH" & i).Copy Range("AK" & x)
                            ElseIf InStr(Range("AI" & i).Value, "Donate") Then
                                Range("AH" & i).Copy Range("AL" & x)
                            ElseIf InStr(Range("AI" & i).Value, "Destroy, Landfill") Then
                                Range("AH" & i).Copy Range("AM" & x)
                            ElseIf InStr(Range("AI" & i).Value, "Destroy, Animal Feed") Then
                                Range("AH" & i).Copy Range("AN" & x)
                            ElseIf InStr(Range("AI" & i).Value, "Return To Plant") Then
                                Range("AH" & i).Copy Range("AO" & x)
                            End If
                        ElseIf IsEmpty(Range("AI" & i).Value) Then
                            Exit For
                        End If
                    Next i
                End If
            Next x
        End With
End Sub

【讨论】:

  • 仍然请注意,行计数变量(iLastRow)需要为 Long 类型,因为 Excel 的行数超过了 Integer 可以处理的数量。 • 并且x 根本没有声明,也应该是Dim x As Long
猜你喜欢
  • 1970-01-01
  • 2020-12-30
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 2023-03-02
  • 2020-10-09
相关资源
最近更新 更多