【问题标题】:Looping through worksheets and check cell value循环工作表并检查单元格值
【发布时间】:2017-11-15 23:08:55
【问题描述】:

我正在尝试遍历所有工作表并逐个检查它们并执行以下操作:如果在选中的单元格中 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

任何帮助将不胜感激!

【问题讨论】:

  • 你是想评论我的回答还是 Vityata ?
  • 试图评论你的哈哈。

标签: vba excel loops


【解决方案1】:

它需要是一个两步程序:

  1. 检查单元格中是否有IsError
  2. 检查错误类型是否为#N/A,与If .Range("E18").Value = CVErr(xlErrNA) Then

否则,如果你有一个普通的String,比如“通过”,你会得到一个错误。

代码

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   

【讨论】:

  • 我将如何使用这种方法遍历所有工作表?
  • @Rhyfelwr 是LastRow 看过每张纸吗?还是只是“大师”?
  • 基本上 E18 是一个常数,它在所有工作表上始终包含一个值(Pass/Fail 或 N/A),除了 Summary 我只检查 E18 包含的值,如果它包含 N/A那么我还想将检查的第一张纸的 G23 的值更改为 N/A,然后将第二张纸的 G24 的值更改为等等,因此需要 LastRow。
  • @Rhyfelwr 尝试编辑代码,看看这是不是你想要的
  • 遗憾的是它仍然没有这样做。我的意思是 E18 按原样包含字符串 N/A,我看到 xlErrNa 在您的代码中有所不同。
【解决方案2】:

尝试反转嵌套循环。这样的事情应该可以工作:

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

【讨论】:

  • If ws.Range("E18").Value="N/A" then 找不到带有#N/A 的单元格,您需要使用CVErr(xlErrNA)
  • LastRow 仅与“Summary”表相关,所有其他工作表都是新生成的并且它们是标准化表格(这意味着单元格 E18 将始终包含 Pass/Fail 或 N/A 的值)。既然你这么说,我什至不确定 LastRow 是否是必要的,我只是想这样做,以便在工作表上找到的值总是将每张工作表的下一行更改为“摘要”工作表上的 N/A .有点难解释哈哈
  • @ShaiRado - 是的,我还在考虑一个字符串。
  • FWIW - For X = 22 To LastRow 循环只是在做同样的事情 LastRow - 21 次。 (循环内部不依赖于X。)
猜你喜欢
  • 2022-07-06
  • 1970-01-01
  • 2018-05-12
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 2015-11-10
  • 1970-01-01
相关资源
最近更新 更多