【问题标题】:Nested loop 'FOR' - Excel VBA嵌套循环'FOR' - Excel VBA
【发布时间】:2021-06-14 11:14:03
【问题描述】:

你能看到 VBA Excel 中嵌套循环的问题在哪里吗:

我要做的是检查数据(不同的范围,也可能会出现一些重复的数据)

Dan - 带有图案数据的工作表 选项卡 - 包含在名称相同时需要额外 ID 信息的数据表。 要检查它,我在 Dan 中选择一个单元格并用模式选项卡表中的整列对其进行验证

代码:

Sub MatchName()
Dim n1 As Long
Dim n2 As Long

 Dim LastRowcheck1 As Long
 Dim LastRowcheck2 As Long
 
LastRowcheck1 = Sheets("Tab").Range("C" & Rows.Count).End(xlUp).Row
LastRowcheck2 = Sheets("Dan").Range("A" & Rows.Count).End(xlUp).Row

Sheets("Tab").Activate
 For n1 = 2 To LastRowcheck1
   For n2 = 2 To LastRowcheck2
        If Sheets("Tab").Cells(n1, 1) = Sheets("Dan").Cells(n2, 1) Then
        Sheets("Tab").Cells(n1, 6) = Sheets("Dan").Cells(n2, 1)
        Sheets("Tab").Cells(n1, 30) = Sheets("Dan").Cells(n2, 2)
    Next n2
  Else
     Next n1
End Sub

【问题讨论】:

  • 不,你不能用If 选择你要去哪个循环Next。你必须Next他们俩。
  • 还缺少End If
  • 这里不需要使用Sheets("Tab").Activate,你可以删除这个操作——什么都不会改变

标签: excel vba


【解决方案1】:
  • 您的“If-Then-Else”语句未嵌套在内部“for 循环”中。它需要在“Next n2”语句之前用“End If”关闭。
  • 如果要检查两个单元格的内容是否相同,则需要添加 .Value
  • 您的 LastCheckRow 链接到“Tab”中的 C 列,但您正在检查“Tab”中 A 列的内容。不知道您是否在“A”中也有数据,我将您支票中的第 1 列更改为 3。
Sub MatchName()
Dim n1 As Long
Dim n2 As Long

 Dim LastRowcheck1 As Long
 Dim LastRowcheck2 As Long
 
LastRowcheck1 = Sheets("Tab").Range("C" & Rows.Count).End(xlUp).Row
LastRowcheck2 = Sheets("Dan").Range("A" & Rows.Count).End(xlUp).Row

Sheets("Tab").Activate
 For n1 = 2 To LastRowcheck1
   For n2 = 2 To LastRowcheck2
        Debug.Print "From: " & Sheets("Dan").Cells(n2, 1).Value & " to " & Sheets("Tab").Cells(n1, 3).Value
        If Sheets("Tab").Cells(n1, 3).Value = Sheets("Dan").Cells(n2, 1).Value Then
            Sheets("Tab").Cells(n1, 6).Value = Sheets("Dan").Cells(n2, 1).Value
            Sheets("Tab").Cells(n1, 30).Value = Sheets("Dan").Cells(n2, 2).Value
        End If
    Next n2
  Next n1
End Sub


【讨论】:

  • You need to add .Value if you want to check if the content - 不,你没有。如果你这样做是件好事,但你没有必须因为Valuedefault property
  • 这行得通,但是我的数据量太大,它会停止 Excel ,只适用于非常少量的数据。
【解决方案2】:

没有嵌套循环的更快方法:

Sub MatchName2()
    Dim n1 As Long, row As Variant
    
    With Sheets("Tab")
        For n1 = 2 To .Range("A" & .Rows.Count).End(xlUp).row
            row = Application.Match(.Cells(n1, 1), Sheets("Dan").Columns(1), 0)
            If IsNumeric(row) Then
               .Cells(n1, 6) = Sheets("Dan").Cells(row, 1)
               .Cells(n1, 30) = Sheets("Dan").Cells(row, 2)
            End If
        Next n1
    End With
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2013-12-01
    • 2012-10-10
    • 2021-06-01
    • 2015-06-30
    相关资源
    最近更新 更多