2012-03-09 78 views
10

我有一個工作表的名稱作爲字符串存儲在變量中。我如何在這個工作表上執行一些操作?按名稱引用excel工作表?

我以爲我會做這樣的事情:

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

我要如何做?

+0

嗯,我想在我的挫折我問這個問題過早。我找到了一個類似於這樣的解決方案 工作表(nameOfWorkSheet).Range(「A4」)....等 – 2012-03-09 04:01:01

+2

這應該是工作表(nameOfWorkSheet).Range(「A4」)。您錯過了「表格」中的「S」 – 2012-03-09 08:06:47

+1

您發佈的代碼工作正常......發佈前您是否嘗試過? 'Sheets'和'Worksheets'會給你相同的結果。 – 2012-03-09 08:35:48

回答

10

有幾種選擇,包括使用您演示的方法,使用和使用變量。

我的首選項是下面的選項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 
1

爲了擴大對瑞安的答案,當你聲明變量(使用DIM),你可以通過使用VBE的預測文本功能,如下圖中作弊一點點。 screenshot of predictive text in VBE

如果它顯示在該列表中,則可以將該類型的對象分配給變量。因此,不僅僅是一張工作表,正如Ryan指出的那樣,而且還包括一張圖表,範圍,工作簿,系列等等。

您將該變量設置爲您想要操作的對象,然後您可以調用方法,將它傳遞給函數等,就像Ryan爲此示例指出的一樣。當涉及到集合與對象(圖表或圖表,範圍或範圍等)時,您可能遇到一些困難,但試驗和錯誤您肯定會得到它。

4

最好的方法是創建一個類型爲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") 
相關問題