2013-08-08 2 views
6

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

У меня есть листы, содержащие данные. Код добавляется к этому рабочему листу и прогону, который создает рабочий лист «Сводка». На рабочем листе «Сводка» я хотел бы запустить код на листе данных. Это означает, что я не могу использовать ActiveSheet, и мне пришлось бы ссылаться на лист данных по имени.

Как получить имя рабочего листа, содержащего код, без необходимости жесткого кода имени?

ответ

5

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

Application.ThisWorkbook Свойство (Excel)

Возвращает объект Workbook, представляющий рабочую книгу, где текущий код макроса работает. Только для чтения.

и:

Application.ThisCell Свойство (Excel)

Возвращает ячейку, в которой определенная пользователем функция который вызывается из как объект Range.

0

Чтобы запросить фактическую структуру кода вашего проекта, вам необходимо разрешить доступ к объектной модели проекта VBA (параметры Excel> Центр доверия> Параметры макроса, затем добавить ссылку на Microsoft Visual Basic для расширяемости приложения vX), где vX версия, подобная 5.3. Вы можете использовать объекты в этом, чтобы определить, какие листы имеют какой-то код внутри них.

Однако я бы порекомендовал делать это по-другому.

Вместо перебирать листы в рабочей книге, а затем, в пределах оболочки ошибки, запустите макрос, используя Application.Run

Обратите внимание, что было бы лучше практика, чтобы реорганизовать свой код и поместить все это в стандартном модуль, а затем передать в рабочие листы в качестве аргументов (см мой второй пример)

Например:

'With code distributed in each worksheet 
Sub blah() 

    Dim ws As Worksheet 

    For Each ws In ThisWorkbook.Worksheets 

     On Error Resume Next 

     Application.Run ws.CodeName & ".CollectInfoMacro" 

     If Err.Number = 1004 Then Debug.Print "Skipping "; ws.Name; ", No macro defined" 

     On Error GoTo 0 

    Next ws 

End Sub 

'Otherwise, better practice would be to refactor 
'and not have code on each sheet, instead in a standard module: 

Sub blahblah() 

    Dim ws As Worksheet 
    Dim results As Collection 
    Set results = New Collection 

    For Each ws In ThisWorkbook.Worksheets 

     If ws.Name <> "Summary" Then 'or whatever 
      results.Add getYourInfoForTheSummary(ws), ws.Name 
     End If 

    Next ws 

    'Process your results (i.e. dump to the summary worksheet etc) 
    ... 

End Sub 

Function getYourInfoForTheSummary(ws As Worksheet) As Collection 'or return whatever 

    Dim results As Collection 
    Set results = New Collection 

    With ws 
     'do something 
    End With 

    Set getYourInfoForTheSummary = results 'or whatever 

End Function 
6

Используйте объект «Я».

Me.Name - это собственность, которую вы ищете, которая даст вам имя листа, содержащего код, независимо от активного листа.

Смежные вопросы