excel - VBA excel中“Case Else”优先于其他“Case”条件的问题
问题描述
我遇到的问题似乎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 检查可以ActiveWorkbook
为您找到所有这些隐含/不合格的引用(免责声明:我管理 Rubberduck 项目)。
推荐阅读
- javascript - 更改页面后如何让chrome应用扩展继续编写脚本
- javascript - 如何使用来自多个按钮的动态参数在模态引导程序上添加网格视图
- json - PostMan:如何将数组/段从一个响应复制到下一个请求?
- python - 根据 pandas 中的字符串列获取日期
- go - 在 Go 中每隔一段时间同时运行多个函数
- wordpress - 自定义帖子类型 Slug URL 生成问题
- asp.net-web-api - .NET MVC Web API 上传文件到本地存储和数据模型到数据库
- postgresql - PostgreSQL-10.5 联合拥有单条记录(组合空值)
- julia - Julia:将字符串传递给宏
- python - 如何在 Python 中复制包含嵌套元组的元组?