是否按名称引用excel工作表?

是否按名称引用excel工作表?,excel,vba,worksheet,Excel,Vba,Worksheet,我将工作表的名称作为字符串存储在变量中。如何在此工作表上执行某些操作 我想我会这样做: nameOfWorkSheet = "test" ActiveWorkbook.Worksheets(nameOfWorkSheet).someOperation() 如何做到这一点?有几个选项,包括使用您演示的方法、使用和使用变量 我更喜欢下面的选项4:Dim类型为Worksheet的变量,存储工作表并调用变量上的方法或将其传递给函数,但任何选项都有效 Sub Test() Dim SheetName

我将工作表的名称作为字符串存储在变量中。如何在此工作表上执行某些操作

我想我会这样做:

nameOfWorkSheet = "test"
ActiveWorkbook.Worksheets(nameOfWorkSheet).someOperation()

如何做到这一点?

有几个选项,包括使用您演示的方法、使用和使用变量

我更喜欢下面的选项4:
Dim
类型为
Worksheet
的变量,存储工作表并调用变量上的方法或将其传递给函数,但任何选项都有效

Sub Test()
  Dim SheetName As String
  Dim SearchText As String
  Dim FoundRange As Range

  SheetName = "test"      
  SearchText = "abc"

  ' 0. If you know the sheet is the ActiveSheet, you can use if directly.
  Set FoundRange = ActiveSheet.UsedRange.Find(What:=SearchText)
  ' Since I usually have a lot of Subs/Functions, I don't use this method often.
  ' If I do, I store it in a variable to make it easy to change in the future or
  ' to pass to functions, e.g.: Set MySheet = ActiveSheet
  ' If your methods need to work with multiple worksheets at the same time, using
  ' ActiveSheet probably isn't a good idea and you should just specify the sheets.

  ' 1. Using Sheets or Worksheets (Least efficient if repeating or calling multiple times)
  Set FoundRange = Sheets(SheetName).UsedRange.Find(What:=SearchText)
  Set FoundRange = Worksheets(SheetName).UsedRange.Find(What:=SearchText)

  ' 2. Using Named Sheet, i.e. Sheet1 (if Worksheet is named "Sheet1"). The
  ' sheet names use the title/name of the worksheet, however the name must
  ' be a valid VBA identifier (no spaces or special characters. Use the Object
  ' Browser to find the sheet names if it isn't obvious. (More efficient than #1)
  Set FoundRange = Sheet1.UsedRange.Find(What:=SearchText)

  ' 3. Using "With" (more efficient than #1)
  With Sheets(SheetName)
    Set FoundRange = .UsedRange.Find(What:=SearchText)
  End With
  ' or possibly...
  With Sheets(SheetName).UsedRange
    Set FoundRange = .Find(What:=SearchText)
  End With

  ' 4. Using Worksheet variable (more efficient than 1)
  Dim MySheet As Worksheet
  Set MySheet = Worksheets(SheetName)
  Set FoundRange = MySheet.UsedRange.Find(What:=SearchText)

  ' Calling a Function/Sub
  Test2 Sheets(SheetName) ' Option 1
  Test2 Sheet1 ' Option 2
  Test2 MySheet ' Option 4

End Sub

Sub Test2(TestSheet As Worksheet)
    Dim RowIndex As Long
    For RowIndex = 1 To TestSheet.UsedRange.Rows.Count
        If TestSheet.Cells(RowIndex, 1).Value = "SomeValue" Then
            ' Do something
        End If
    Next RowIndex
End Sub

为了扩展Ryan的答案,当您声明变量(使用Dim)时,您可以通过使用VBE中的预测文本功能进行一些欺骗,如下图所示

如果它显示在该列表中,则可以将该类型的对象指定给变量。因此,正如Ryan指出的,不仅仅是一份工作表,还有一份图表、范围、工作簿、系列等等


将该变量设置为要操作的对象,然后可以调用方法、将其传递给函数等,就像Ryan在本例中指出的那样。当涉及到集合与对象(图表或图表、范围或范围等)时,您可能会遇到一些障碍,但通过反复试验,您肯定会得到这些障碍

最好的方法是创建一个类型为
工作表
的变量,分配工作表并在VBA每次隐式使用
活动工作表
时使用它

这将帮助您避免在程序规模增大时最终出现的bug

例如,
Range(“A1:C10”).Sort Key1:=Range(“A2”)
之类的内容在宏仅在一张工作表上工作时是好的。但最终您将扩展宏以处理多个工作表,发现这不起作用,将其调整为
ShTest1.Range(“A1:C10”)。排序键1:=Range(“A2”)
。。。然后发现它仍然不起作用

以下是正确的方法:

Dim ShTest1 As Worksheet
Set ShTest1 = Sheets("Test1")
ShTest1.Range("A1:C10").Sort Key1:=ShTest1.Range("A2")

嗯,我想在我沮丧的时候,我过早地问了这个问题。我找到了一个解决方案,它类似于这个表(工作表名称).Range(“A4”)…等等,应该是表(工作表名称).Range(“A4”)。你在“工作表”中漏掉了一个“S”你发布的代码很好。。。你在发帖前试过吗<代码>工作表和
工作表
将给出相同的结果。请注意,如果有效,您可以回答自己的问题(即使有效)并接受它。通过这种方式,你可以与社区分享你的知识,并解决这个问题。