遍历工作表,排除一些并查找单元格值

Loop through worksheets, exclude some and look-up cellvalue

我是 excel vba 的初学者,需要您的帮助!

我的宏遇到了以下问题:

我有一个包含多个工作表的 excel 工作簿。我想排除其中一些。对于其他工作表,我希望宏查看每个工作表的单元格值。在本例中为“A1”。如果单元格值小于8,则A1必须调整为8。如果单元格值大于8,则无需调整,可以查看下面的工作表。

我有以下两个宏:

Sub LoopCertain() 'Excel VBA to exclude sheets(1-3)
Dim sh As Worksheet

For Each sh In Sheets
Select Case sh.Name
Case Is = "Blad1", "Blad2", "Blad3"
'No Code here if excluded
Case Else

Call X2

End Select
Next sh
End Sub

Sub X2()
'declare a variable
Dim ws As Worksheet
Set ws = ActiveSheet

'calculate if a cell is less than a specific value
If ws.Range("A1") < 8 Then
ws.Range("A1") = 8
Else

End If

End Sub

我现在 运行 遇到的问题是只完成了活动工作表,而没有查看其余工作表。该宏也不检查是否不应包含工作表。

有人可以帮助我吗?

提前致谢!

如果您想使用两个潜艇,请尝试下一种方式。您的代码仅在第二个子中使用活动 sheet:

Sub LoopCertain() 'Excel VBA to exclude sheets(1-3)
 Dim sh As Worksheet

 For Each sh In Sheets
    Select Case sh.name
        Case "Blad1", "Blad2", "Blad3"
             'No Code here if excluded
        Case Else
            Call X2(sh)
    End Select
 Next sh
End Sub

Sub X2(ws As Worksheet)
 'calculate if a cell is less than a specific value
  If ws.Range("A1").value < 8 Then ws.Range("A1") = 8
End Sub

但是这么简单的处理,不需要第二个,因为第一个就可以了:

Sub LoopCertain() 'Excel VBA to exclude sheets(1-3)
 Dim sh As Worksheet

 For Each sh In Sheets
    Select Case sh.name
        Case "Blad1", "Blad2", "Blad3"
             'No Code here if excluded
        Case Else
            If sh.Range("A1").value < 8 Then sh.Range("A1") = 8        
    End Select
 Next sh
End Sub

使用当前形式的代码执行此操作的最简洁方法是将 sheet 对象传递给另一个子对象:

Sub LoopCertain() 'Excel VBA to exclude sheets(1-3)
Dim sh As Worksheet

For Each sh In Sheets
    Select Case sh.Name
    Case Is = "Blad1", "Blad2", "Blad3"
        'No Code here if excluded
    Case Else

        Call X2(sh)

    End Select
Next sh
End Sub

然后

Sub X2(ByVal sh As Worksheet)

    'calculate if a cell is less than a specific value
    If sh.Range("A1") < 8 Then
        sh.Range("A1") = 8
    End If

End Sub

我假设你在 real-world 中使用单独的 sub-routines 是有原因的,但是一旦你理解了传递对象的概念,那么我建议你在一个单个例程。