Mi a különbség a sub és a privát sub között az Excel VBA-ban?


Legjobb válasz

Az alprogramok láthatósági tartományban vannak. A VBA-ban egy Nyilvános alállomány elérhető ( ) bármely kódmodulból. Privát alállomást csak abból a modulból lehet meghívni, amelyben található.

Ennek a koncepciónak a neve: Scope. Az objektumok és változók hatókörrel is rendelkeznek .

Itt található egy rövid bevezető: A hatókör és a láthatóság megértése

Egy al-privátot készítünk, ha tudjuk hogy az aktuális modulon kívül semmi sem soha ne tegye azt, amire ez a kód hivatott; valami feladat- és kontextus-specifikus dolgot építünk. Másrészt alaposan át kell gondolkodnunk, amikor Sub-nyilvánosságot hozunk létre.

Amikor a VBA-t más felhasználóknak írod, nem magadnak, valószínűleg nem akarod, hogy közvetlenül hívják a kódodat. Bármely Nyilvános alállomás, feltéve, hogy nincs paramétere, látható a felhasználók „Makró” listájában. (Alt-F8)

A nyilvános előfizetők elrejtése a felhasználó elől (általában) önmagáról gondoskodik; ha egy másik modult hívsz egy Sub-be, akkor általában meg kell mondanod neki, hogy mit kell tudnia a megfelelő paraméterek megadásával, és a nyilvános Subs paraméterekkel nem jelennek meg a felhasználó listájában.

De néha hasznos, ha van egy segédprogram, amely bárhonnan meghívható és nem igényel paramétereket; mondjuk egy munkalap egyik gombjáról, amely elindítási kódot hív meg egy Nyilvános modulban. NEM akarja, hogy az indítási modul látható legyen a felhasználók számára.

Adjon meg egy olyan paramétert, amelyet soha nem használ. Még jobb, ha megadsz neki egy olyan paramétert, amelyet nem kell megemlítenie . Lásd az Opcionális paramétert az alábbi harmadik alrészben.

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

A felhasználó láthatja és hívhatja az al Látható . Csak az ugyanabban a modulban található kód hívhatja meg a sub Láthatatlan -t. A Trükkös bárhonnan meghívható és nem igényel paramétert, de a felhasználó nem „láthatja”.

Hívás Látható eredmények:

Hibakereséskor felhívhatja a nyilvános előfizetőket az Azonnali ablakból, és bármikor megteheti, amikor a kód még nem fut.

De a Közvetlen ablakból csak akkor hívhatja meg a Privát előfizetőket, ha elérte a töréspontot vagy szünetelt valahol a gazdagép moduljában. .

Válasz

A Privát és a (Nyilvános) alcsoport a rutin hatókörének deklarálására szolgál .

Private Sub: lehetővé teszi, hogy a rutint ugyanabban a modulban csak egy másik rutin hívhassa meg.

Tegyük fel, hogy van egy modulja, az úgynevezett A modul , és ezen a modulon belül két rutinja van:

  • Private Sub Hello\_World ()
  • alüzenet ()

Public Sub Message()

Call Hello\_World()

End Sub

Private Sub Hello\_World()

MsgBox “Hello World”

End Sub

A üzenet rutin Hello\_World . Ez azért volt lehetséges, mert mindkét rutin ugyanabban a modulban volt (A modul).

Tegyük fel, hogy van B modulod a következő rutinnal. :

Sub Message2()

Call Hello\_World()

End Sub

Ez egy fordítási hibát eredményez: „Al- vagy függvény nincs meghatározva”.

Miért?

Mivel hívott egy privát rutin ( Hello\_World ) egy másik modultól. Nem lehetséges.

Nyilvános al: a rutinodat más rutinok is meghívhatják a különböző modulokban. Alapértelmezés szerint minden rutin nyilvános, ezért nem szükséges korábban a világot „Nyilvánosnak” nyilvánítani. Csak a Sub elég.

Sub ThisIsEnough()

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük