2013-08-08 17 views
6

Ho codice che si trova su una pagina e fa riferimento al contenuto della cartella di lavoro. Quando viene eseguito da un foglio di lavoro diverso, vorrei ottenere il nome del foglio di lavoro specifico contenente il codice.Ottieni il nome di un foglio di lavoro di Excel contenente il codice

Ho fogli di lavoro che contengono dati. Il codice viene aggiunto a quel foglio di lavoro e all'esecuzione - che produce un foglio di lavoro Riepilogo. Dal foglio di lavoro Riepilogo, vorrei eseguire il codice nel foglio di lavoro dei dati. Questo significa che non posso usare ActiveSheet e dovrei fare riferimento al foglio dati per nome.

Come posso ottenere il nome del foglio di lavoro contenente il codice senza dover codificare il nome?

risposta

5

ci sono 2 proprietà dell'applicazione che si interesserebbero per questo.

Application.ThisWorkbook proprietà (Excel)

Restituisce un oggetto cartella di lavoro che rappresenta la cartella di lavoro in cui il codice di macro corrente è in esecuzione. Sola lettura.

e:

Application.ThisCell proprietà (Excel)

restituisce la cella in cui la funzione definita dall'utente viene chiamato da un oggetto Range.

0

Per interrogare la struttura del codice reale del progetto è necessario consentire l'accesso al modello di oggetto del progetto VBA (Impostazioni di Excel> Centro protezione> Impostazioni macro quindi aggiungere un riferimento a Microsoft Visual Basic per vX Application Extensibility) dove vX è la versione come 5.3. È possibile utilizzare gli oggetti in questo per identificare quali fogli hanno il codice all'interno di essi.

Tuttavia, consiglierei di farlo in un altro modo.

Invece, scorrere i fogli di lavoro nella cartella di lavoro e poi, all'interno di un involucro di errore, eseguire la macro utilizzando Application.Run

noti che sarebbe meglio la pratica di refactoring il codice e mettere tutto in uno standard modulo, quindi passare nei fogli di lavoro come argomenti (vedi il mio secondo esempio)

esempio:

'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

Utilizzare l'oggetto "Me".

Me.Name è la proprietà che si cerca, che vi darà il nome del foglio contenente il codice indipendentemente dal foglio attivo.

Problemi correlati