2010-02-17 5 views
8

Sto provando a chiamare una macro di Excel che si trova in un'altra cartella di lavoro. È una macro specifica per il foglio, ma la sintassi fornita dalla documentazione di Microsoft e la ricerca sul Web forniscono solo un modo per accedere a una macro solo dalla cartella di lavoro. Che la sintassi è:Come chiamare la macro specifica del foglio da una cartella di lavoro di Excel in un'altra?

Application.Run ("testworkbook.xls!macroname") 

Che cosa devo fare è avere un riferimento foglio c'è anche, qualcosa di simile:

Application.Run ("testworkbook.xls!Sheet1.macroname") 

Ho provato questo e molte altre varianti, tra cui dover singola o doppia citazioni in là, ma ottengo sempre il messaggio che la macro non può essere trovata.

Edit: Con tutti gli indizi e le molte prove ho trovato la risposta. È possibile accedere ai sottotitoli specifici del foglio, ma è necessario utilizzare il nome canonico come "Foglio1", non è possibile utilizzare il nome del foglio effettivo. Apparentemente altre cartelle di lavoro non accedono a tali informazioni.

Così il formato di cui sopra funziona fino a quando non si tenta di utilizzare lo sheetname (e potrebbe essere necessario apostrofo il nome della cartella di lavoro (concatenando CHR(39) alle estremità).

+0

@Lance Roberts: la risposta qui sotto risponde alla tua domanda? –

+0

@Otaku, sì, anche se ho finito usando solo il nome del foglio canonico. Ma mi piacciono tutte le informazioni che fornisci, quindi accetterò la tua risposta (l'avevo già svalutato). –

+0

abbastanza giusto. Non sono sicuro che il nome del foglio canonico sia lo stesso per le UI non inglesi, se è qualcosa che devi affrontare, ma è rapido e semplice per questi scopi. apprecaiate l'accettazione/upvote. –

risposta

11

So che hai capito questo, probabilmente dopo molti capelli-strappo e caffè, ma ho voluto:

  • dare più dettagli sul perché questo è
  • forniscono un modo in cui si Potresti usare il nome del tuo foglio per ottenere ciò che desideri .

Prima di tutto, il nome del foglio di lavoro che si desidera non è la stessa cosa del nome del modulo di codice. Quindi nel tuo VBE, vedi che il nome del modulo di codice è "Foglio1", ma se può avere una diversa proprietà di Name diversa, ad esempio "MySheet1" (o potrebbe anche essere lo stesso).

Per ottenere il nome, è necessario eseguire alcuni loop, modificare le impostazioni di sicurezza, ecc. Se questo è ciò che si cerca (questo funziona bene in ambienti più piccoli a causa del problema delle impostazioni di sicurezza), qui si va come un esempio:

  1. modificare le impostazioni di sicurezza per fiducia l'accesso programmatico ai VBA progetti. In Excel 2007, vai su Orb | Opzioni di Excel | Centro di fiducia | Impostazioni del centro di fiducia | Macro Impostazioni e abilitare "Trust accesso al modello di progetto VBA"
  2. Creare una cartella di lavoro con un foglio di lavoro .Rinominarlo "MySheet1". Aprire il VBE (Alt + F11) e in "Foglio1 (MySheet1)" creare un sub di routine, lo chiamano TimesTen e il codice appena messo Debug.Print 10 * 10. Come questo:

    Sub TimesTen() 
        Debug.Print 10 * 10 
    End Sub 
    
  3. salvare il file come un documento di macro-enabled e lo chiamano "MacroXSLX.xlsm". Lascialo aperto.

  4. Aprire un nuovo documento di Excel, navigare alla sua VBE e in una nuova macro ovunque, creare un sub chiamato Test. Nel corpo di questo codice, inserisci: .

    Sub test() 
    Dim SheetName As String 
    SheetName = "MySheet1" 
    Dim wb As Workbook 
    Set wb = Workbooks("MacroXSLX.xlsm") 
    For Each VBComp In wb.VBProject.VBComponents 
        If VBComp.Properties.Item("Name").Value = SheetName Then 
         Application.Run (wb.Name & "!" & VBComp.Name & ".TimesTen") 
        End If 
    Next 
    End Sub 
    
  5. Premere F5 per eseguire test e si dovrebbe vedere nella finestra immediata.

Si può vedere a 4 # che sto scorrendo tutti i componenti (moduli, classi, ecc) alla ricerca di quello che ha una proprietà Name che ha un valore di MySheet1. Una volta ottenuto ciò, posso ottenere il nome di quel componente, che in questo caso è Foglio1 e usarlo per costruire la mia stringa che eseguirà la macro del foglio in MacroXSLX.xlsm. Il codice può essere ripulito ulteriormente per uscire dall'istruzione For quando hai trovato quello che vuoi, ecc.

Come accennato in precedenza, l'unico vero inconveniente è il pezzo delle impostazioni di sicurezza e la garanzia di accesso programmatico al VBAProject - bene su uno a dieci computer, ma potrebbe essere una seccatura se devi assicurarti che più di quello sia sempre impostato correttamente.

+0

+1 per ulteriori informazioni, grazie. –

1

si può regolare la macro accettare un foglio come parametro? Quindi quando lo chiami nel foglio della tua cartella di lavoro originale potresti chiamarlo semplicemente MyMacro (me.name)? Quindi quando lo chiami dall'altra cartella di lavoro, potresti chiamarlo semplicemente come application.run ("testworkbook.xls! MyMacro", "sheetname") dove "sheetname" è il parametro.

non sono sicuro se c'è qualche altro modo per farlo.

+0

Ci sono più fogli con lo stesso pulsante e lo stesso evento click per loro (quindi uno per foglio). Il mio piano se non riesco a farlo è di chiamare direttamente la subroutine chiamata da queste macro (e inserire il nome del foglio come parametro in questo). Speravo solo di non dover andare più a fondo per portare a termine il lavoro. –

+0

Ben dopo aver guardato più da vicino mi sono reso conto che il parametro downstream era il foglio stesso, e non è possibile passare oggetti usando il metodo Run. –

+0

Vedere la mia modifica per la risposta finale. –

1

Il progetto VBA è protetto da password? Inoltre, il sub è un sub privato? Se è così, allora non credo che la macro verrà trovata.

+0

La protezione password è UserInterfaceOnly, quindi non dovrebbe bloccare il codice. Il sub è pubblico. –

+0

UserInterface: interessa solo se il codice viene eseguito su un foglio o una cartella di lavoro protetta. Avere protetto il progetto VBA è diverso. Ma se è un sotto pubblico questo non dovrebbe influenzare nulla. I sottotitoli privati ​​non possono essere richiamati da un altro modulo se il progetto VBA è protetto. – guitarthrower

+0

Vedere la mia modifica per la risposta finale. –