【问题标题】:VBA Loop error. Only pasting one resultVBA 循环错误。只粘贴一个结果
【发布时间】:2017-10-04 19:01:45
【问题描述】:

如果 AG_Label = M_Label 代码运行并粘贴,但仅适用于第一个实例。 我的循环有问题,但我对 VBA 很陌生,所以我不知道如何修复它。

    Dim mrow As Long, ARow As Long, iRows As Long, srow As String
Dim x As Long, j As Long, i As Long
Dim AG_Label As String, AG_val As String, SNL_val As String, SNL_Label As String, M_Label As String, Rng As Range
Dim Vval As Long, Speriod As String, aperiod As String
Dim Count As Integer, Ajay As Variant

Count = 2

ARow = Sheets("AG").Range("A" & Rows.Count).End(xlUp).Row
Do
For i = 2 To ARow
    AG_Label = Sheets("AG").Cells(i, "N").Value
    'mrow = Sheets("Mappings").Range("A" & Rows.count).End(xlUp).Row
    'For j = 2 To mrow
        'M_Match_1 = Sheets("Mappings").Cells(j, "P").Value
        M_Label = Sheets("Mappings").Cells(Count, "C").Value


        If AG_Label = M_Label And Sheets("Mappings").Cells(Count, "L").Value = "FRY-9C" Then
            Sheets("Mappings").Cells(Count, "J").copy
            Sheets("AG").Cells(i, "AM").PasteSpecial Paste:=xlPasteValues, _
              Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                On Error Resume Next
        End If

Application.CutCopyMode = False

Next
'i = i + 1

Loop Until i = ARow + 1

Count = Count + 1
End Sub

【问题讨论】:

  • 对于初学者,修复这一行 - ARow = Sheets("AG").Range("A" & Rows.Count).End(xlUp).Row 并带有对这样的行的限定引用 - ARow = Sheets("AG").Range("A" & Sheets("AG").Rows.Count).End(xlUp).Row
  • 您在End Sub 之前的Count = Count + 1 似乎很可疑 - 绝对没有必要增加过程级变量然后通过退出过程来丢弃它。那应该在你的循环中的某个地方吗?
  • 注释掉 On Error Resume Next 除非有充分的理由。
  • 你的Do ... Loop Until i = ARow + 1 是没有意义的——i 在遇到Loop 语句时的值将是ARow + 1,所以Do 循环正在执行恰好一次 - 永远不会更少,永远不会更多。
  • @YowE3K 是的,那里有问题。它查看 AG_Label 但是当它完成到最后一行时,我如何增加 M_Label 以便再次通过相同的 If 语句获取新的 M_label 值

标签: arrays string vba loops copy-paste


【解决方案1】:

这可能不是您想要的,但它应该让您更好地了解如何在循环中构建循环:

    Dim mrow As Long, ARow As Long, iRows As Long, srow As String
    Dim x As Long, j As Long, i As Long
    Dim AG_Label As String, AG_val As String, SNL_val As String, SNL_Label As String, M_Label As String, Rng As Range
    Dim Vval As Long, Speriod As String, aperiod As String
    Dim Count As Long, Ajay As Variant

    ARow = Sheets("AG").Range("A" & Sheets("AG").Rows.Count).End(xlUp).Row
    mrow = Sheets("Mappings").Range("A" & Sheets("Mappings").Rows.count).End(xlUp).Row
    For i = 2 To ARow
        On Error Resume Next
        AG_Label = Sheets("AG").Cells(i, "N").Value
        On Error GoTo 0
        For Count = 2 To mrow
            'M_Match_1 = Sheets("Mappings").Cells(j, "P").Value
            M_Label = Sheets("Mappings").Cells(Count, "C").Value

            If AG_Label = M_Label And Sheets("Mappings").Cells(Count, "L").Value = "FRY-9C" Then
                Sheets("Mappings").Cells(Count, "J").copy
                Sheets("AG").Cells(i, "AM").PasteSpecial Paste:=xlPasteValues, _
                   Operation:=xlNone, SkipBlanks:=False, Transpose:=False
            End If    
        Next
    Next
    Application.CutCopyMode = False
End Sub

注意:我认为在变量AG_Label 的设置周围使用错误屏蔽是一个坏主意。 (这意味着您将使用相同的AG_Label 值在循环中执行多次,直到您遇到从 N 列获得新的有效值的情况。)下面是一些替代代码,它停止处理事物比如#N/A,我怀疑你可能一直想要On Error

    Dim mrow As Long, ARow As Long, iRows As Long, srow As String
    Dim x As Long, j As Long, i As Long
    Dim AG_Label As String, AG_val As String, SNL_val As String, SNL_Label As String, M_Label As String, Rng As Range
    Dim Vval As Long, Speriod As String, aperiod As String
    Dim Count As Long, Ajay As Variant

    ARow = Sheets("AG").Range("A" & Sheets("AG").Rows.Count).End(xlUp).Row
    mrow = Sheets("Mappings").Range("A" & Sheets("Mappings").Rows.count).End(xlUp).Row
    For i = 2 To ARow
        If Not IsError(Sheets("AG").Cells(i, "N").Value) Then
            AG_Label = Sheets("AG").Cells(i, "N").Value
            For Count = 2 To mrow
                'M_Match_1 = Sheets("Mappings").Cells(j, "P").Value
                M_Label = Sheets("Mappings").Cells(Count, "C").Value

                If AG_Label = M_Label And Sheets("Mappings").Cells(Count, "L").Value = "FRY-9C" Then
                    Sheets("Mappings").Cells(Count, "J").copy
                    Sheets("AG").Cells(i, "AM").PasteSpecial Paste:=xlPasteValues, _
                       Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                End If    
            Next
        End If
    Next
    Application.CutCopyMode = False
End Sub

【讨论】:

    猜你喜欢
    • 2019-05-20
    • 1970-01-01
    • 2019-12-27
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多