Ссылка на лист Excel по имени? - PullRequest
18 голосов
/ 09 марта 2012

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

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

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

Как мне это сделать?

Ответы [ 3 ]

12 голосов
/ 09 марта 2012

Существует несколько опций, в том числе использование демонстрируемого вами метода, С и использование переменной.

Я предпочитаю вариант 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
6 голосов
/ 22 сентября 2014

Лучший способ - создать переменную типа 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")
2 голосов
/ 09 марта 2012

Чтобы расширить ответ Райана, когда вы объявляете переменные (используя Dim), вы можете немного обмануть, используя функцию предиктивного текста в VBE, как показано на рисунке ниже.screenshot of predictive text in VBE

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

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

...