参考excel工作表的名称?

我有一个工作表的名字作为一个string存储在一个variables中。 如何在这个工作表上执行一些操作?

我虽然我会做这样的事情:

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

我怎么做到这一点?

有几个选项,包括使用您演示的方法,使用和使用variables。

我的首选项是下面的选项4: Dimtypes为Worksheet的variables并存储工作表并调用variables上的方法或将其传递给函数,但是任何选项都可以工作。

 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, eg: 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, ie 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 

最好的方法是创build一个types为Worksheet的variables,分配工作表,并在每次VBA隐式使用ActiveSheet时使用它。

这将帮助您避免在程序增长时最终显示的错误。

例如Range("A1:C10").Sort Key1:=Range("A2")当macros只在一张纸上工作时, Range("A1:C10").Sort Key1:=Range("A2")是很好的。 但是,你最终将扩大你的macros与几张工作,发现这不起作用,调整到ShTest1.Range("A1:C10").Sort Key1:=Range("A2") …和发现它仍然不起作用。

这是正确的方法:

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

为了扩展Ryan的答案,当你声明variables(使用Dim)时,你可以使用VBE中的预测文本function来作弊,如下图所示。 VBE中预测文本的截图

如果它显示在该列表中,则可以将该types的对象分配给一个variables。 因此,不仅仅是一张工作表,正如Ryan所指出的那样,而且还包括一个图表,范围,工作簿,系列等等。

你设置这个variables等于你要操作的对象,然后你可以调用方法,传递给函数等,就像Ryan指出的那样。 当涉及到集合vs对象(图表或图表,范围或范围等)时,您可能遇到一些困难,但是试验和错误您肯定会得到它。