我有一個工作表的名稱作爲字符串存儲在變量中。我如何在這個工作表上執行一些操作?按名稱引用excel工作表?
我以爲我會做這樣的事情:
nameOfWorkSheet = "test"
ActiveWorkbook.Worksheets(nameOfWorkSheet).someOperation()
我要如何做?
我有一個工作表的名稱作爲字符串存儲在變量中。我如何在這個工作表上執行一些操作?按名稱引用excel工作表?
我以爲我會做這樣的事情:
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
爲了擴大對瑞安的答案,當你聲明變量(使用DIM),你可以通過使用VBE的預測文本功能,如下圖中作弊一點點。
如果它顯示在該列表中,則可以將該類型的對象分配給變量。因此,不僅僅是一張工作表,正如Ryan指出的那樣,而且還包括一張圖表,範圍,工作簿,系列等等。
您將該變量設置爲您想要操作的對象,然後您可以調用方法,將它傳遞給函數等,就像Ryan爲此示例指出的一樣。當涉及到集合與對象(圖表或圖表,範圍或範圍等)時,您可能遇到一些困難,但試驗和錯誤您肯定會得到它。
最好的方法是創建一個類型爲Worksheet
的變量,分配工作表並在每次VBA隱式使用ActiveSheet
時使用它。
這將幫助您避免在程序增長時最終顯示的錯誤。
例如像Range("A1:C10").Sort Key1:=Range("A2")
這樣的東西當宏只在一張紙上工作時很好。但是,您最終將擴展您的宏以使用多張工作表,發現這不起作用,請將其調整爲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")
嗯,我想在我的挫折我問這個問題過早。我找到了一個類似於這樣的解決方案 工作表(nameOfWorkSheet).Range(「A4」)....等 – 2012-03-09 04:01:01
這應該是工作表(nameOfWorkSheet).Range(「A4」)。您錯過了「表格」中的「S」 – 2012-03-09 08:06:47
您發佈的代碼工作正常......發佈前您是否嘗試過? 'Sheets'和'Worksheets'會給你相同的結果。 – 2012-03-09 08:35:48