Wat is het verschil tussen Sub en Private Sub in Excel VBA?


Beste antwoord

Subprogrammas hebben een scala aan zichtbaarheid. In VBA kan een Public Sub worden benaderd ( genaamd ) vanuit elke codemodule. Een Private Sub kan alleen worden aangeroepen vanuit de module waarin deze zich bevindt.

Dit concept heet Bereik. Objecten en variabelen hebben ook een bereik .

Er is hier een korte intro: Inzicht in bereik en zichtbaarheid

We maken een Sub Private wanneer we het weten dat niets buiten de huidige module ooit zou moeten doen waarvoor deze code is ontworpen; we zijn iets taak- en contextspecifiek aan het bouwen. Aan de andere kant moeten we goed nadenken wanneer we een Sub Public maken.

Wanneer u VBA schrijft voor andere gebruikers dan uzelf, wilt u waarschijnlijk niet dat ze uw code rechtstreeks bellen. Elke openbare sub, op voorwaarde dat deze geen parameters heeft, is zichtbaar in de gebruikerslijst “Macro”. (Alt-F8)

Openbare Subs verbergen voor de gebruiker (zou) meestal voor zichzelf zorgen; wanneer je een Sub in een andere module aanroept, moet je hem over het algemeen vertellen wat hij moet weten door de juiste parameters door te geven, en Public Subs met parameters verschijnen niet in de gebruikerslijst.

Maar soms het is handig om een ​​utility Sub te hebben die overal kan worden aangeroepen en geen parameters nodig heeft; zeg van een knop in een werkblad die opstartcode in een openbare module aanroept. U wilt NIET dat uw opstartmodule zichtbaar is voor gebruikers.

Geef uw sub dus een parameter die u nooit gebruikt. Beter nog, geef het een parameter die u niet hoeft te vermelden. Zie de optionele parameter in de derde sub hieronder.

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

De gebruiker kan sub Zichtbaar . Alleen code in dezelfde module kan sub Invisible aanroepen. Tricksy kan overal worden aangeroepen en heeft geen parameter nodig, maar de gebruiker kan deze niet “zien”.

Zichtbare resultaten in:

Bij het debuggen kunt u openbare subs oproepen vanuit het onmiddellijke venster en u kunt dit op elk moment doen wanneer de code niet al actief is.

Maar u kunt alleen privé-subs oproepen vanuit het onmiddellijke venster wanneer u een breekpunt hebt bereikt of ergens in de hostmodule bent gepauzeerd .

Antwoord

Private en (Public) Sub worden gebruikt om de omvang van een routine aan te geven .

Private Sub: zorgt ervoor dat de routine alleen binnen dezelfde module kan worden aangeroepen door een andere routine.

Stel dat je een module hebt met de naam Module A en binnen deze module heb je twee routines genaamd:

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

Public Sub Message()

Call Hello\_World()

End Sub

Private Sub Hello\_World()

MsgBox “Hello World”

End Sub

De Message routine genaamd Hello\_World . Dit was mogelijk omdat beide routines zich in dezelfde module bevonden (Module A).

Stel dat u Module B heeft met de volgende routine :

Sub Message2()

Call Hello\_World()

End Sub

Dit zal een compilatiefout opleveren: “Sub of functie niet gedefinieerd”.

Waarom?

Omdat het aanriep een privéroutine ( Hello\_World ) uit een andere module. Niet mogelijk.

Public Sub: je routine kan ook worden aangeroepen door andere routines in verschillende modules. Alle routines zijn standaard openbaar, dus het is niet nodig om de wereld eerder “Openbaar” te verklaren. Alleen de Sub is genoeg.

Sub ThisIsEnough()

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *