【问题标题】:IF sheet name contains specific text?如果工作表名称包含特定文本?
【发布时间】:2020-04-24 11:07:00
【问题描述】:

在运行宏的其余部分之前,我正在尝试进行一些故障保护以检查正确的工作表是否处于活动状态。该工作表始终是最后一个工作表,它始终包含一个特定的字符串,但它也包含一个数字,并且可能会有所不同(例如,字段映射 1、字段映射 2、字段映射 3 等),因此确切的字符串并不总是相同的。我只需要知道活动工作表的名称中包含“字段映射”,无论编号如何。

我需要类似的东西:

Sheets(Sheets.Count).Select

If Not Activesheet.Name contains "Field Map" Then
Msgbox ("Sheet not found")
Exit Sub
End If

我知道“包含”位不存在,但希望这能解释我想要做什么?

【问题讨论】:

  • 为什么一定要ActiveSheet?为什么不只查找包含相关名称的工作表?
  • 运行宏通常不必选择特定的工作表。只需使用显式引用来引用它。
  • @RonRosenfeld 因为最后会有几个名称相同但数字不同,我需要它来选择最后一个。我想,理想情况下,我会寻找包含“字段地图”并且数字最高的工作表。但我认为这听起来更复杂?
  • 这样做会更加健壮。依赖 Active Sheet、Selection、ActiveCell 等通常不是一件好事
  • 是的,但这很简单。我看到@JvdV 发布了一个示例。

标签: excel vba


【解决方案1】:

如 cmets 中所述,您应尽可能避免使用 .Select 等。在变量中获得适当的工作表可能就足够了。使用ArrayList 对象可能需要考虑以下内容,该对象可以进行排序和反转以获得用于创建名为“字段映射***”的工作表的最大整数:

Sub Test()

Dim ws As Worksheet
Dim arrList As Object: Set arrList = CreateObject("System.Collections.ArrayList")

For Each ws In ThisWorkbook.Worksheets
    If ws.Name Like "Field Map*" Then arrList.Add Int(Split(ws.Name, " Map ")(1))
Next

If arrList.Count > 0 Then
    arrList.Sort
    arrList.Reverse
    Set ws = ThisWorkbook.Worksheets("Field Map " & arrList(0))
Else
    MsgBox "No sheet found!"
End If

End Sub

现在,如果您愿意,您可以在代码中进一步使用ws。如果您必须使用.Select,则将该行更改为ThisWorkbook.Worksheets("Field Map " & arrList(0)).Select

请注意,我假设您的工作表名为 Field Map 1Field Map 2 等。

【讨论】:

  • 谢谢!抱歉回复慢。我正在努力让它工作。它似乎在新文档中工作正常,但它不能通过我的用户表单工作?我错过了什么吗?我正在使用 userForm,因为我想将几个不同的宏放在一起。每个通过 Private Sub 命令激活button_Click()
  • 好吧,你可以让它成为一个可调用的函数吗?否则在你的初始化事件上运行它
  • 它似乎完全忽略了 ArrayList 并直接进入“未找到工作表!”。这可能只是我在这里缺乏经验。是导致问题的 userForm 吗?
  • 我刚刚将 ThisWorkbook 更改为 ActiveWorkbook 并且工作正常 :) 谢谢!
【解决方案2】:

使用 InStr 函数

    If InStr(ActiveSheet.Name, "Field Map") Then
    'Your Code
Else
    MsgBox ("Sheet Not Found"): Exit Sub
End If

【讨论】:

  • InStr 返回 Integer,而不是 Boolean
  • 所以你可以在末尾添加 >=1 使其 BooleanIf InStr(ActiveSheet.Name, "Field Map") >= 1 Then 一样
  • 你应该。自动数据转换是许多错误(以及关于 SO 的问题)的根源
  • 公平地说,任何数字<> 0 都是True
猜你喜欢
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 2020-07-31
  • 2021-07-03
相关资源
最近更新 更多