2012-03-09 2 views
10

У меня есть имя рабочего листа, хранящегося в виде строки в переменной. Как выполнить некоторую операцию на этом листе?Ссылка на таблицу Excel по имени?

я, хотя я бы сделал что-то вроде этого:

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

Как я могу получить это сделано?

+0

Хм я думаю, что в моем отчаянии я задал этот вопрос преждевременно. Я нашел решение, которое выглядит примерно так: Лист (nameOfWorkSheet) .Range («A4») .... и т. Д. –

+2

Это должно быть Листы (nameOfWorkSheet) .Range («A4»). Вы пропустили «S» в «Таблицах» –

+1

Код, который вы опубликовали, отлично работает ... Вы даже попробовали его до публикации? «Таблицы» и «Рабочие листы» дадут вам тот же результат. –

ответ

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

Если он отображается в этом списке, вы можете назначить объект этого типа переменной. Таким образом, не только рабочий лист, как отметил Райан, но и диаграмма, диапазон, рабочая книга, серия и многое другое.

Вы устанавливаете эту переменную равным объекту, который хотите манипулировать, а затем вы можете вызывать методы, передавать его функциям и т. Д., Точно так же, как указал Райан для этого примера. Вы можете столкнуться с парами, когда речь идет о коллекциях против объектов (диаграмма или диаграммы, диапазон или диапазоны и т. Д.), Но с проб и ошибок вы получите это точно.

4

Наилучший способ создать переменную типа Worksheet, назначить рабочий лист и использовать его каждый раз, когда VBA будет неявно использовать .

Это поможет вам избежать ошибок, которые в конечном итоге появятся при увеличении размера вашей программы.

Например, что-то вроде 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") 
Смежные вопросы