【问题标题】:VBA: How can I skip rows containing not containing "A" while in a nested loop?VBA:如何在嵌套循环中跳过包含不包含“A”的行?
【发布时间】:2021-07-31 03:35:33
【问题描述】:

我对 VBA 比较陌生。

我有 2 个文件:(1) 主文件 (2) 月度统计文件。我正在尝试遍历主文件中的一列,以查看它是否与月度文件相对应。如果匹配,则从主文件中提取名称。但是,该列中有很多 N/A 输入,我只想遍历以字符串“A”开头的行。因为我已经有一个嵌套循环,所以我不能输入另一个 Next A。这是我的代码:

Sub SummaryData()

Dim CustCode As String
Dim CustName As String
Dim wkb As Workbook
Dim Count As Integer

Workbooks.Open Filename:=Sh_Source.Range("HKS").Value

Set wkb = Workbooks("DataHK.xlsx")

For A = 2 To Sh_Main.Range("E" & Rows.Count).End(xlUp).Row
        
    If Left(Range("E" & A).Value, 1) = "A" Then
    CustCode = Sh_Main.Range("E" & A).Value
    
    Else
    'Not sure what to put'
    
    Count = 0
    CustName = ""
        
        For b = 2 To wkb.Sheets("Data").Range("B" & Rows.Count).End(xlUp).Row
                
            X = wkb.Sheets("Data").Range("C" & b).Value
                
            If CustCode = X Then
                CustName = Sh_Main.Range("F" & A).Value
                Count = Count + 1
            
            Else
            End If
            Next b
      
     Sh_Body.Range("A" & A).Value = CustCode
     Sh_Body.Range("B" & A).Value = CustName
     Sh_Body.Range("C" & A).Value = Count
     
Next A

wkb.Close savechanges:=False

End Sub

非常感谢任何帮助,因为我是新手,谢谢!

【问题讨论】:

  • 嗨布鲁斯!感谢你的回复。对于 wkb 工作表,每一行都以 A 开头。只有 Master 工作表 Sh_Main 包含具有 NA 的行
  • 当使用多个工作簿时,您必须确保完全限定您处理的每个工作表,以了解它所在的工作簿。您的代码指的是Sh_SourceSh_Main,但没有一个是合格的.因此,假定它们都在未声明的ActiveWorkbook 中。从使用Dim 语句为两张表声明变量开始。然后将工作表分配给声明的变量,并通过声明的名称引用它们。
  • 从您的代码中不可能知道哪个工作簿包含该代码,Master 或 Monthly。根据语法,Sh_Source 是选项卡的 CodeName 或以前分配给此名称的工作表。它必须在 ActiveWorkbook 中,它可能不是包含代码的工作簿。因此不可能知道它在哪里。我还怀疑您是否打算使用 CodeNames 并且代号为 Sh_Source 的工作表可能不存在于任何地方。如果是这样,在您可以从中检索范围值之前,应该有代码将指定工作簿中的特定工作表分配给该名称。

标签: vba loops nested


【解决方案1】:

如果您只想跳过当前循环迭代的其余部分,您可以使用goto。我知道人们不喜欢它,但它比其他解决方案更简单。在这种情况下,将skip: 放在Next A 行的正上方,然后在您的else 条件中将goto skip 放在您有“不确定要放什么”的位置,然后关闭您的if 语句,如下所示:

    If Left(Range("E" & A).Value, 1) = "A" Then
        CustCode = Sh_Main.Range("E" & A).Value
    Else
        Goto skip
    End if

这样整个代码就是

Sub SummaryData()

Dim CustCode As String
Dim CustName As String
Dim wkb As Workbook
Dim Count As Integer

Workbooks.Open Filename:=Sh_Source.Range("HKS").Value

Set wkb = Workbooks("DataHK.xlsx")

For A = 2 To Sh_Main.Range("E" & Rows.Count).End(xlUp).Row
        
    If Left(Range("E" & A).Value, 1) = "A" Then
        CustCode = Sh_Main.Range("E" & A).Value
    Else
        Goto skip
    End If
    
    Count = 0
    CustName = ""
        
        For b = 2 To wkb.Sheets("Data").Range("B" & Rows.Count).End(xlUp).Row
                
            X = wkb.Sheets("Data").Range("C" & b).Value
                
            If CustCode = X Then
                CustName = Sh_Main.Range("F" & A).Value
                Count = Count + 1
            
            Else
            End If
            Next b
      
     Sh_Body.Range("A" & A).Value = CustCode
     Sh_Body.Range("B" & A).Value = CustName
     Sh_Body.Range("C" & A).Value = Count
     
     skip:
     
Next A

wkb.Close savechanges:=False

End Sub

通常人们避免使用 goto(出于一些好的原因和一些不好的原因),但我确实认为它很有用,而且我认为它本质上并不坏。但是,在您的情况下,大多数人会将整个块放在 if 语句中,如下所示:

Sub SummaryData()

Dim CustCode As String
Dim CustName As String
Dim wkb As Workbook
Dim Count As Integer

Workbooks.Open Filename:=Sh_Source.Range("HKS").Value
Set wkb = Workbooks("DataHK.xlsx")

For A = 2 To Sh_Main.Range("E" & Rows.Count).End(xlUp).Row
        
    If Left(Range("E" & A).Value, 1) = "A" Then
    
        CustCode = Sh_Main.Range("E" & A).Value
        Count = 0
        CustName = ""
        
        For b = 2 To wkb.Sheets("Data").Range("B" & Rows.Count).End(xlUp).Row
                
            X = wkb.Sheets("Data").Range("C" & b).Value
                
            If CustCode = X Then
                CustName = Sh_Main.Range("F" & A).Value
                Count = Count + 1
            End If
            
            Next b
      
     Sh_Body.Range("A" & A).Value = CustCode
     Sh_Body.Range("B" & A).Value = CustName
     Sh_Body.Range("C" & A).Value = Count
     
    End If
     
Next A

wkb.Close savechanges:=False

End Sub

然后 if 块中的代码只有在满足条件时才会执行,并且不需要尝试跳过 for 循环的其余部分。

我会注意到您的某些变量似乎*没有引用任何内容,尤其是工作表?变量:Sh_Source、Sh_Main 和 Sh_Body。如果不提供这些参考,此代码将失败。

  • 它们可能是在您提供的子目录之外定义的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-11
    • 2014-12-16
    • 2020-12-04
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    相关资源
    最近更新 更多