我遇到的问题是Case Else
的优先级高于其他Case
的条件。
宏的概念取决于工作表名称,将应用另一个单独的宏。我大约有8张纸,每张纸都有与之相关的特定宏,然后对于其余的纸(约20张),我使用Case Else
并应用一个单独的宏。问题是,当末尾有Case Else
功能时,将不应用任何其他Case
。当我删除Case Else
时,正确的宏将应用于工作表。好像Case Else
成为默认值/优先。我在下面尝试了应用单独的宏的替代方法,但问题仍然存在:
Sub Specify()
Dim Fun As String
Dim sht As Worksheet
For Each sht In Worksheets
Select Case sht.Name
Case "NB12", "NB15"
Application.Run "Groundwater_Macros.xlsm!limits_Alluvium"
Case "NB24"
Application.Run "Groundwater_Macros.xlsm!limits_BOCOBOML_GFA"
Case "NB16", "NB17", "NB19", "NB20", "Bore 31"
Application.Run "Groundwater_Macros.xlsm!limits_BOCOBOML_MIA"
Case "Bore 47", "Bore 48"
Application.Run "Groundwater_Macros.xlsm!limits_FracturedRock_GFA"
Case "Bore 4", "Bore 4a", "Bore 40"
Application.Run "Groundwater_Macros.xlsm!limits_FracturedRock_MIA_West"
Case "Bore 30"
Application.Run "Groundwater_Macros.xlsm!limits_FracturedRock_MIA_East"
Case Else
Application.Run "Groundwater_Macros.xlsm!limits_Monitoring_bores"
Debug.Print sht.Name
End Select
Next sht
End Sub
Sub Specify_test()
Dim Fun As String
Dim sht As Worksheet
For Each sht In Worksheets
Select Case sht.Name
Case "NB12", "NB15"
Call limits_Alluvium
Case "NB24"
Call limits_BOCOBOML_GFA
Case "NB16", "NB17", "NB19", "NB20", "Bore 31"
Call limits_BOCOBOML_MIA
Case "Bore 47", "Bore 48"
Call limits_FracturedRock_GFA
Case "Bore 4", "Bore 4a", "Bore 40"
Call limits_FracturedRock_MIA_West
Case "Bore 30"
Call limits_FracturedRock_MIA_East
Case Else
Call limits_Monitoring_bores
If Len(Fun) Then Fun = Fun & vbCr
Fun = Fun & sht.Name
End Select
Next sht
MsgBox Fun, vbInformation, "Sheets not processed"
End Sub
Sub Specify_test2()
Dim Fun As String
Dim sht As Worksheet
For Each sht In Worksheets
'Select Case sht.Name
If sht.Name = "NB12" Or sht.Name = "NB15" Then
limits_Alluvium
ElseIf sht.Name = "NB24" Then
limits_BOCOBOML_GFA
ElseIf sht.Name = "NB16" Or sht.Name = "NB17" Or sht.Name = "NB19" Or sht.Name = "NB20" Or sht.Name = "Bore 31" Then
limits_BOCOBOML_MIA
ElseIf sht.Name = "Bore 47" Or sht.Name = "Bore 48" Then
limits_FracturedRock_GFA
ElseIf sht.Name = "Bore 4" Or sht.Name = "Bore 4a" Or sht.Name = "Bore 40" Then
limits_FracturedRock_MIA_West
ElseIf sht.Name = "Bore 30" Then
limits_FracturedRock_MIA_East
Else
limits_Monitoring_bores
End If
'End Select
Next sht
End Sub
Sub Specify_test3()
Dim Fun As String
Dim sht As Worksheet
For Each sht In Worksheets
Select Case sht.Name
Case "NB12", "NB15": Call limits_Alluvium
Case "NB24": Call limits_BOCOBOML_GFA
Case "NB16", "NB17", "NB19", "NB20", "Bore 31": Call limits_BOCOBOML_MIA
Case "Bore 47", "Bore 48": Call limits_FracturedRock_GFA
Case "Bore 4", "Bore 4a", "Bore 40": Call limits_FracturedRock_MIA_West
Case "Bore 30": Call limits_FracturedRock_MIA_East
Case Else: Call limits_Monitoring_bores
End Select
Next sht
End Sub
我已经对工作表名称进行了故障排除。我认为这不是问题,因为当省略Case Else
时,将应用正确的宏。
执行意外降到Case Else
是一种症状,一个线索。
For Each sht In Worksheets
Sheets
对象确切属于哪个特定工作簿,取决于要工作的太多事情可靠地>。
如果代码在ThisWorkbook
模块中,那么我们应该使它明确:
For Each sheet In Me.Worksheets
但是该代码不能在
ThisWorkbook
模块中,否则我们将不在这里,所以...
如果我们在任何其他模块中,并且想要迭代ThisWorkbook
中的工作表,那么我们将使用工作簿的代码名称
我们要从哪个工作簿中迭代工作表,则有机会“不是在迭代我们认为是活跃的工作簿的表格;-)For Each sheet In ThisWorkbook.Worksheets
如果我们不在
ThisWorkbook
之外的任何模块中,那么Worksheets
本质上就是ActiveWorkbook.Worksheets
,如果我们不知道
有一个Rubberduck inspection可以为您找到所有这样的隐式/不合格ActiveWorkbook
引用(免责声明:我管理Rubberduck项目)。>>