2013-08-08 5 views
6

Ich habe Code, der sich auf einer Seite befindet und auf den Inhalt der Arbeitsmappe verweist. Wenn ich von einem anderen Arbeitsblatt aus ausgeführt werde, möchte ich den Namen des spezifischen Arbeitsblatts erhalten, das den Code enthält.Name eines Excel-Arbeitsblatts mit Code

Ich habe Arbeitsblätter, die Daten enthalten. Der Code wird diesem Arbeitsblatt und dem Lauf hinzugefügt, wodurch ein Übersichtsarbeitsblatt erstellt wird. Im Arbeitsblatt "Zusammenfassung" möchte ich den Code auf dem Datenarbeitsblatt ausführen. Dies bedeutet, dass ich ActiveSheet nicht verwenden kann und ich das Datenblatt mit dem Namen referenzieren müsste.

Wie kann ich den Namen des Arbeitsblatts mit dem Code abrufen, ohne den Namen hart codieren zu müssen?

Antwort

5

Es gibt zwei Anwendungseigenschaften, die Sie für diese interessieren würde.

Application.ThisWorkbook Property (Excel)

Gibt eine Arbeitsmappe-Objekt, das die Arbeitsmappe darstellt, in dem der aktuelle Makrocode ausgeführt wird. Schreibgeschützt.

und:

Application.ThisCell Property (Excel)

Gibt die Zelle, in der die benutzerdefinierte Funktion aus als Range-Objekt aufgerufen wird.

0

Um die tatsächliche Codestruktur Ihres Projekts abzufragen, müssen Sie den Zugriff auf das VBA-Projektobjektmodell zulassen (Excel-Einstellungen> Vertrauensstellungscenter> Makroeinstellungen und dann einen Verweis auf Microsoft Visual Basic für die Erweiterbarkeit der Anwendung vX hinzufügen) die Version wie 5.3. Sie können die Objekte in diesem verwenden, um festzustellen, welche Blätter welchen Code in sich haben.

Allerdings würde ich empfehlen, es auf eine andere Weise zu tun.

Stattdessen durch die Arbeitsblätter in Ihrer Arbeitsmappe durchlaufen und dann innerhalb eines Fehler-Wrapper, führen Sie das Makro mit Application.Run

Beachten Sie, dass es besser Praxis würde Ihr Code Refactoring und das alles in einem Standard setzen Modul, dann in den Arbeitsblättern als Argumente übergeben (mein zweites Beispiel)

zB:

'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

Verwenden Sie das Objekt "Ich".

Me.Name ist die gesuchte Eigenschaft, die Ihnen unabhängig vom aktiven Blatt den Namen des Blattes mit dem Code gibt.

Verwandte Themen