2013-08-08 3 views
6

Mam kod, który znajduje się na stronie i odwołuje się do zawartości skoroszytu. Po uruchomieniu z innego arkusza, chciałbym uzyskać nazwę konkretnego arkusza roboczego zawierającego kod.Uzyskaj nazwę arkusza programu Excel zawierającego kod

Mam arkusze zawierające dane. Kod zostanie dodany do tego arkusza roboczego i uruchomienia - który tworzy arkusz podsumowania. Z arkusza Podsumowanie chciałbym uruchomić kod w arkuszu danych. Oznacza to, że nie mogę używać ActiveSheet i musiałbym odwoływać się do arkusza danych po nazwie.

Jak mogę uzyskać nazwę arkusza roboczego zawierającego kod, nie wymagając ścisłego zakodowania nazwy?

Odpowiedz

5

Istnieją 2 właściwości aplikacyjne, które Cię interesować za to.

Application.ThisWorkbook nieruchomości (Excel)

Zwraca obiekt, który reprezentuje skoroszytu skoroszyt którym jest uruchomiony obecny kod makro. Tylko czytać.

i:

Application.ThisCell nieruchomości (Excel)

Zwraca komórkę, w której funkcja zdefiniowana przez użytkownika jest wywoływana z postaci obiektu klasy.

0

Aby sprawdzić rzeczywistą strukturę kodu projektu, należy zezwolić na dostęp do modelu obiektu projektu VBA (Ustawienia Excela> Centrum zaufania> Ustawienia makr, a następnie dodać odwołanie do Microsoft Visual Basic dla Rozszerzenia Aplikacji vX), gdzie vX to wersja taka jak 5.3. Możesz użyć obiektów w tym celu, aby określić, które arkusze mają w sobie kod.

Zalecam jednak zrobienie tego w inny sposób.

Zamiast iterację arkuszy w skoroszycie, a następnie wewnątrz owijki błędu, uruchomić makro przy użyciu Application.Run

Zauważ, że byłoby lepiej, praktyka byłaby kod i umieścić to wszystko w standardzie moduł, a następnie przechodzą w arkuszach jak argumenty (patrz mój drugi przykład)

Np

'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

Użyj obiektu "Ja".

Me.Name jest właściwością, której szukasz, podając nazwę arkusza zawierającego kod, niezależnie od aktywnego arkusza.