Qual è la differenza tra Sub e Private Sub in Excel VBA?


Migliore risposta

I sottoprogrammi hanno una gamma di visibilità. In VBA, è possibile accedere a un Public Sub ( chiamato ) da qualsiasi modulo di codice. Un Private Sub può essere chiamato solo dal modulo in cui risiede.

Questo concetto è denominato Scope. Anche gli oggetti e le variabili hanno ambito .

Cè una breve introduzione qui: Comprensione dellambito e della visibilità

Rendiamo un Sottotitolo privato quando sappiamo che niente al di fuori del modulo corrente dovrebbe fare ciò per cui è stato progettato questo codice; stiamo costruendo qualcosa di specifico per attività e contesto. Daltra parte, dovremmo pensare bene quando rendiamo pubblico un sottotitolo.

Quando scrivi VBA per utenti diversi da te, probabilmente non vuoi che chiamino il tuo codice direttamente. Qualsiasi Public Sub, purché non abbia parametri, è visibile nella lista “Macro” degli utenti. (Alt-F8)

Nascondere i sottotitoli pubblici allutente (dovrebbe) di solito prendersi cura di se stesso; quando chiami un Sub in un altro modulo, generalmente devi dirgli quello che deve sapere passandogli parametri appropriati, e i Public Sub con parametri non appaiono nellelenco dellutente.

Ma a volte è comodo avere unutilità Sub che può essere chiamata da qualsiasi luogo e non richiede parametri; dire da un pulsante in un foglio di lavoro che chiama il codice di avvio in un modulo pubblico. NON vuoi che il tuo modulo di avvio sia visibile agli utenti.

Quindi, dai al tuo sub un parametro che non usi mai. Meglio ancora, dagli un parametro che non devi menzionare. Vedi il parametro Opzionale nel terzo Sottotitolo di seguito.

Option Explicit

Sub Visible()

" Can call this guy from anywhere;

" from any module or directly by the user.

" Sub (on it"s own) is lazy shorthand for "Public Sub"

Invisible

End Sub

Private Sub Invisible()

" This Sub can ONLY be called from inside its module.

" It is not shown in the Macro list available to the user.

Tricksy

End Sub

Public Sub Tricksy(Optional pIgnore As Boolean = True)

" This sub can be called from anywhere.

" It does not require a parameter (pIgnore).

" BUT, because it has a parameter, it does not appear

" in the user"s list of available "macros".

MsgBox "Hi there", vbExclamation, "Greetings from Tricksy"

End Sub

Lutente può vedere e chiamare sub Visibile . Solo il codice nello stesso modulo può chiamare sub Invisible . Tricksy può essere chiamato da qualsiasi luogo e non richiede un parametro, ma lutente non può “vederlo”.

Chiamando Visibile risulta in:

Durante il debug, puoi chiamare Public Subs dalla finestra immediata e puoi farlo in qualsiasi momento quando il codice non è già in esecuzione.

Ma puoi chiamare Private Subs dalla finestra immediata solo quando hai raggiunto un punto di interruzione o ti sei fermato da qualche parte nel suo modulo host .

Answer

Private e (Public) Sub sono usati per dichiarare lambito di una routine .

Private Sub: fa in modo che la routine possa essere chiamata solo allinterno dello stesso modulo da unaltra routine.

Supponiamo che tu abbia un modulo chiamato Modulo A e allinterno di questo modulo hai due routine chiamate:

  • Private Sub Hello\_World ()
  • Sottomessaggio ()

Public Sub Message()

Call Hello\_World()

End Sub

Private Sub Hello\_World()

MsgBox “Hello World”

End Sub

La routine Message chiamata Hello\_World . Ciò è stato possibile perché entrambe le routine erano nello stesso modulo (Modulo A).

Supponiamo che tu abbia il Modulo B con la seguente routine :

Sub Message2()

Call Hello\_World()

End Sub

Questo restituirà un errore di compilazione: “Sub or Function not defined”.

Perché?

Perché stava chiamando una routine privata ( Hello\_World ) da un modulo diverso. Non possibile.

Sottotitoli pubblici: la tua routine può essere chiamata anche da altre routine in moduli diversi. Tutte le routine sono pubbliche per impostazione predefinita, quindi non è necessario dichiarare il mondo “Pubblico” prima. Basta il sottotitolo.

Sub ThisIsEnough()

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *