循环工作表并检查单元格值

时间:2017-11-15 14:13:07

标签: excel vba excel-vba loops

我试图循环遍历所有工作表并逐一检查它们并执行以下操作:如果在选中的单元格中,E18 = N / A的值则在第一张工作表上(命名为摘要)我改变了G23的值也是N / A(然后对每个单元格进行处理,然后在汇总更改G23然后是G24然后是G25等等)我编写了以下循环,它运行但它不会做任何事情

Sub MyTestSub()

Dim ws As Worksheet

LastRow = Cells(Rows.Count, "G").End(xlUp).Row
For X = 22 To LastRow
    For Each ws In Worksheets
        If ws.Range("E18").Value="N/A" then ThisWorkbook.Sheets("Summary").Range("G"&x).Value="N/A"
    Next ws                 
Next x

End Sub

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

它需要一个两步程序:

  1. 检查单元格中是否IsError
  2. 使用#N/A检查错误类型是否为If .Range("E18").Value = CVErr(xlErrNA) Then
  3. 否则,如果您有常规的String,例如" Pass"你会收到一个错误。

    <强>代码

    Dim lRow As Long
    
    LastRow = Sheets("Summary").Cells(Sheets("Summary").Rows.Count, "G").End(xlUp).Row
    lRow = 23 ' start from row 23
    
    For Each ws In Worksheets
        With ws
            If .Name <> "Summary" Then
                If IsError(.Range("E18").Value) Then
                    If .Range("E18").Value = CVErr(xlErrNA) Then
                        Sheets("Summary").Range("G" & lRow).Value = CVErr(xlErrNA)
                    End If
                End If
            End If
        End With
        lRow = lRow + 1
    Next ws   
    

答案 1 :(得分:0)

尝试反转嵌套循环。这样的事情应该有效:

Sub MyTestSub()
    Dim ws As Worksheet
    For Each ws In Worksheets
        LastRow = ws.Cells(ws.Rows.Count, "G").End(xlUp).Row            
        If IsError(ws.Range("E18")) then 
            For X = 22 To LastRow
                Sheets("Summary").Range("G" & LastRow) = ws.Range("E18")
            next x
        end if
    Next ws                 
End Sub

此外,我假设每个工作表LastRow不同,因此每次有新工作表时都必须经常重置它。 最后但并非最不重要的 - 当您引用Cells时,请确保引用工作表,如下所示:

LastRow = ws.Cells(ws.Rows.Count, "G").End(xlUp).Row            

如果您不这样做,您将考虑ActiveSheet

以下是有关Excel中的错误并返回错误的更多信息 - http://www.cpearson.com/excel/ReturningErrors.aspx

该解决方案适用于任何错误,不仅适用于 #N / A