Bästa svaret
Underprogram har en rad synlighet. I VBA kan en offentlig sub nås ( kallas ) från valfri kodmodul. En privat sub kan bara anropas från den modul där den finns.
Detta koncept heter Omfattning. Objekt och variabler har också räckvidd .
Det finns en kort introduktion här: Förstå omfattning och synlighet
Vi gör en underprivat när vi vet att inget utanför den nuvarande modulen någonsin ska göra vad den här koden är avsedd för; vi bygger något uppgifts- och sammanhangsspecifikt. Å andra sidan borde vi tänka hårt när vi gör en Sub Public.
När du skriver VBA för andra användare än dig själv vill du förmodligen inte att de ska ringa din kod direkt. Alla offentliga underordningar, förutsatt att de inte har några parametrar, är synliga i användarens “makro” -lista. (Alt-F8)
Dölja offentliga subs från användaren (bör) brukar ta hand om sig själv; när du ringer till en Sub i en annan modul måste du i allmänhet berätta för den vad den behöver veta genom att skicka lämpliga parametrar och offentliga Subs med parametrar visas inte i användarens lista.
Men ibland det är praktiskt att ha ett verktygsunderlag som kan ringas var som helst och inte kräver parametrar; säg från en knapp i ett kalkylblad som kallar startkod i en offentlig modul. Du vill INTE att startmodulen ska vara synlig för användarna.
Så ge din sub en parameter som du aldrig använder. Bättre än, ge den en parameter som du inte behöver att nämna. Se den valfria parametern i tredje under nedan.
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
Användaren kan se och ringa sub Synlig . Endast kod i samma modul kan anropa sub Osynlig . Tricky kan anropas var som helst och kräver ingen parameter, men användaren kan inte ”se” den.
Ringer Synlig resulterar i:
När du felsöker kan du ringa Public Subs från omedelbart fönster och du kan göra det när som helst när koden inte redan körs.
Men du kan bara ringa privata underordnade från omedelbart fönster när du har nått en brytpunkt eller pausat någonstans i dess värdmodul .
Svar
Privat och (Offentligt) Sub används för att deklarera omfattningen av en rutin .
Privat sub: gör att rutinen bara kan anropas inom samma modul av en annan rutin.
Låt oss säga att du har en modul som heter Modul A och inom den här modulen har du två rutiner som heter:
- Privat sub Hello\_World ()
- Undermeddelande ()
Public Sub Message()
Call Hello\_World()
End Sub
Private Sub Hello\_World()
MsgBox “Hello World”
End Sub
Meddelande rutinen kallas Hello\_World . Detta var möjligt eftersom båda rutinerna var i samma modul (modul A).
Låt oss säga att du har Modul B med följande rutin :
Sub Message2()
Call Hello\_World()
End Sub
Detta kommer att returnera ett kompileringsfel: ”Sub eller funktion inte definierad”.
Varför?
Eftersom den ringde en privat rutin ( Hello\_World ) från en annan modul. Inte möjligt.
Public Sub: din rutin kan också anropas av andra rutiner i olika moduler. Alla rutiner är offentliga som standard, så det är inte nödvändigt att förklara världen ”allmän” tidigare. Bara Sub är tillräckligt.
Sub ThisIsEnough()