Excel 如何将工作表名称声明为通配符?

Excel 如何将工作表名称声明为通配符?,excel,vba,variables,Excel,Vba,Variables,我有一个名为“照片表”的工作表,我想在代码中声明 Const myWorksheet = "Photo Sheet" 我的问题是,如果我有另一个名为“Photo sheet(2)”的工作表,是否有一种方法将变量声明为通配符,可以接受任何以“Photo sheet*”开头的工作表?不太清楚您想要做什么,但您可以在工作表上迭代,使用Like操作符选择具有适当名称的工作表: Sub test() Dim ws As Worksheet For Each ws In Worksheet

我有一个名为“照片表”的工作表,我想在代码中声明

Const myWorksheet = "Photo Sheet"

我的问题是,如果我有另一个名为“Photo sheet(2)”的工作表,是否有一种方法将变量声明为通配符,可以接受任何以“Photo sheet*”开头的工作表?

不太清楚您想要做什么,但您可以在工作表上迭代,使用
Like
操作符选择具有适当名称的工作表:

Sub test()
    Dim ws As Worksheet
    For Each ws In Worksheets
        If ws.Name Like "Photo Sheet*" Then Debug.Print ws.Name
    Next ws
End Sub

这将打印以“照片表”开头的所有工作表的名称。当然,您可以将这些工作表放在一个集合中进行进一步处理,而不是打印它们的名称。

不太清楚您想要做什么,但您可以在工作表上进行迭代,使用
Like
操作符选择具有适当名称的工作表:

Sub test()
    Dim ws As Worksheet
    For Each ws In Worksheets
        If ws.Name Like "Photo Sheet*" Then Debug.Print ws.Name
    Next ws
End Sub

这将打印以“照片表”开头的所有工作表的名称。当然,您可以不打印它们的名称,例如,将这些工作表放入一个集合中进行进一步处理。

您不能使用通配符直接声明工作表,因此没有
设置shtPhotos=Sheets(工作表&“*”
)。这样的声明必须是明确的,否则可能会返回一个集合,而该集合不能分配给非数组变量

所以,没有通配符。您可以循环浏览所有工作表,并检查工作表名称是否包含您要查找的文本:

Sub FindPhotos()
    Const csSheet As String = "Photo Sheet"

    Dim shtPhotos As Worksheet

    For Each shtPhotos In ActiveWorkbook.Sheets
        If InStr(1, shtPhotos.Name, csSheet) <> 0 Then
            'do something
        End If
    Next shtPhotos
End Sub
您还可以在找到的工作表上查找标志,以便只处理指定单元格中具有(例如)今天日期的工作表:

    For Each shtPhotos In ActiveWorkbook.Sheets
        If InStr(1, shtPhotos.Name, csSheet) <> 0 AND _
           shtphotos.range("A1").value = Date Then
            'do something
        End If
    Next shtPhotos
ActiveWorkbook.Sheets中每个shtphoto的

如果仪表(1,shtPhotos.Name,csSheet)0和_
shtphotos.range(“A1”).value=当时的日期
“做点什么
如果结束
下一张照片

您不能使用通配符直接声明工作表,因此没有
设置shtPhotos=Sheets(工作表&“*”
)。这样的声明必须是明确的,否则可能会返回一个集合,而该集合不能分配给非数组变量

所以,没有通配符。您可以循环浏览所有工作表,并检查工作表名称是否包含您要查找的文本:

Sub FindPhotos()
    Const csSheet As String = "Photo Sheet"

    Dim shtPhotos As Worksheet

    For Each shtPhotos In ActiveWorkbook.Sheets
        If InStr(1, shtPhotos.Name, csSheet) <> 0 Then
            'do something
        End If
    Next shtPhotos
End Sub
您还可以在找到的工作表上查找标志,以便只处理指定单元格中具有(例如)今天日期的工作表:

    For Each shtPhotos In ActiveWorkbook.Sheets
        If InStr(1, shtPhotos.Name, csSheet) <> 0 AND _
           shtphotos.range("A1").value = Date Then
            'do something
        End If
    Next shtPhotos
ActiveWorkbook.Sheets中每个shtphoto的

如果仪表(1,shtPhotos.Name,csSheet)0和_
shtphotos.range(“A1”).value=当时的日期
“做点什么
如果结束
下一张照片

如果您使用权益操作符来测试它,则不会出现问题,但您可以使用类似的
操作,如

Const SHEET_NAME = "Photo Sheet*"

Sub WhateverYourThingDoes()
    Dim ws As Worksheet
    For Each ws in Worksheets
        If ws.Name Like SHEET_NAME Then
            'Your code here.
        End If
    Next
End Sub

如果您使用equity操作符来测试它,则不会出现这种情况,但您可以使用类似于
的方法来执行类似的操作,例如

Const SHEET_NAME = "Photo Sheet*"

Sub WhateverYourThingDoes()
    Dim ws As Worksheet
    For Each ws in Worksheets
        If ws.Name Like SHEET_NAME Then
            'Your code here.
        End If
    Next
End Sub

Lol-比我快41秒。@VBA中的共产国际通常有一种相当简单的方法来解决给定的问题,大多数经验丰富的VBA程序员几乎会立即遇到这种问题。我只需要将变量设置为任何工作表名称,例如“Photo sheet(2)”,如果它包含“Photo sheet”Thanks@thisguyAgain对但是,避免使用
工作表
作为变量名称,因为它与Excel的
工作表
类型冲突。Lol-比我快41秒。@在VBA中,通常有一种相当直接的方法来处理给定的问题,最有经验的VBA程序员几乎会立即想到这一点。我只需要将变量设置为任何工作表名称,例如“Photo sheet(2)”,如果它包含“Photo sheet”Thanks@thisguyAgain可以,但避免使用
工作表
作为变量名称,因为它与Excel的
工作表
type.FWIW冲突“工作表”标识符通常是指类型
Excel.Worksheet
。通过使用该标识符声明一个常量,您可能“隐藏”了
Excel.Worksheet
类型,并使读者或VBA本身感到困惑。FWIW“工作表”“标识符通常指类型
Excel.Worksheet
。通过使用该标识符声明一个常量,您可能“隐藏”了
Excel.Worksheet
类型,并混淆了阅读器或VBA本身。这缺少了循环,因此
ws没有什么
缺少了循环,因此
ws没有什么