Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Wie kann man Private Sub's ablaufen lassen?

Wie kann man Private Sub's ablaufen lassen?
02.07.2004 21:42:04
Dieter
Hallo Excelfans,
wie ruft man Private Subs von einem anderen Modul/Makro aus auf und muß mam sie in ein Modul oder ein Klassenmodul schreiben? Bin Anfänger darin und bekomme sie nicht mal testweise im Editor zum Laufen.
Schönen Dank für Eure Hilfe
Dieter
Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Wie kann man Private Sub's ablaufen lassen?
02.07.2004 21:53:31
DieterB
Hallo Diter,
ich glaube das geht nicht.

Private Sub ist z.B. Selection_Change
Workbook_open.
Ansonsten
sub Makro1()
hallo    &lt&lt&lt&lt&lt&ltAufruf eines Makros
End Sub

sub hallo()
Code
End Sub
Gruß
DieterB
Anzeige
Man muß sie doch aufrufen können?
02.07.2004 22:29:03
Dieter
Hallo,
ich bin etwas verblüfft, daß es solche Probleme macht, an sie heran zu kommen.
Beispiel:

Private Sub TPRDataStream_Bezahlt(ByVal SymbolNr As Long, ByVal Kurs As Single, _
ByVal Volume As Single, ByVal Zeit As Date)
If SymbolNr = 79514 Then Range("A1").Value = Kurs
End Sub

Das Object Datastream wird in einem anderen Sub definiert, die müssen also schon zusammenarbeiten.
Das ist nur ein Beispielschnipsel zum Üben; bisher habe ich einfach Module als Subs oder Funktionen geschrieben - und untereinander aufgerufen, klappt immer.
Ein

Private Sub ist leider so "private", daß es sich nicht mal durch blau anlegen im VBA-Editor ausführen läßt, aber irgendwie
müssen sie sich doch ausführen lassen und auch per VBA aus ansprechen lassen - hoffe ich ...
Danke und Grüße
Dieter

Anzeige
AW: Man muß sie doch aufrufen können?
Ulf
Prinzipiell kannst du eine

Private Sub nur aus dem selben Modul ansprechen.
Dein Beispielcode:

Private Sub TPRDataStream_Bezahlt(ByVal SymbolNr As Long, ByVal Kurs As Single, _
ByVal Volume As Single, ByVal Zeit As Date)
If SymbolNr = 79514 Then Range("A1").Value = Kurs
End Sub

Was soll da Volume und Zeit, die spielen da gar keine Rolle?
Ulf
Anzeige
Und wie konkret?
02.07.2004 23:14:20
Dieter
Hallo Ulf,
der Code ist aus der Hilfe zu einem Programm und von mir zum Üben auf das Einfachste reduziert, Zeit und Volume spielen daher keine Rolle, ich möchte nur das Schema verstehen.
Ein

Private Sub läßt sich also aus dem gleichen Modul anspreche, aber wie?
Ein schlichtes Call sagt Sub nicht definiert, schreibe ich den Text des private in ein anderes Sub hinein, (oben private Sub, unten End Sub
) gibt es Fehlermeldungen, weil man halt nicht zwei in eins schreiben soll.
Grüße
Dieter
Anzeige
AW: Und wie konkret?
Ulf
Beispiel, die

Private Sub und die aufrufende Sub müssen jeweils im
<b>selben</b> Modul stehen.
Wichtig ist, dass du verstehst, wozu eine 

Private Sub überhaupt gut ist.
Option Explicit

Private Sub teste01()
MsgBox "

Private Sub teste01 wurde gestartet!"
End Sub

Sub ruf_teste01()
Call teste01
End Sub


Private Sub teste02(text As String, wert1 As Long, wert2 As Long)
MsgBox "

Private Sub teste02 wurde gestartet!" & Chr(10) & _
"Text: " & text & Chr(10) & _
"Wert1: " & wert1 & Chr(10) & _
"Wert2: " & wert2
End Sub

Sub ruf_teste02()
Call teste02("Übergebener Testtext", 12345, 98765)
End Sub

Ulf
Anzeige
Tja, ich fürchte, das ich für heute abbrechen muß
Dieter
Hallo Ulf,
ich habe Deinen Code in ein Tabellenblatt gegeben und nun erscheinen mehrere Subs parallel.
Ich were morgen damit weiterspielen, schönen Dank erstmal für Deine Mühe und Geduld.
Grüße
Dieter
AW: Wie kann man Private Sub's ablaufen lassen?
Ulf
Poste mal den gesamten Code der Private Sub
Ulf
AW: Wie kann man Private Sub's ablaufen lassen?
03.07.2004 11:45:34
Melanie
Hallo Dieter,
vielleicht kann ich etwas Licht ins Dunkle bringen :-)
Es spielt gar keine Rolle, in welchen Modulen Prozeduren hinterlegt sind und ob sie Private oder Public sind ;-)
Es kommt nur darauf an, wie man sie aufruft!
In einer Arbeitsmappe seinen folgende Prozeduren:
' DieseArbeitsmappe

Private Sub Workbook_Open()
MsgBox "Workbook_Open wurde aufgerufen"
End Sub

' Tabelle1

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox Target.Address
End Sub

' Modul1

Private Sub teste01()
MsgBox "

Private Sub teste01 wurde gestartet!"
End Sub

Sub ruf_teste01()
Call teste01
End Sub


Private Sub teste02(text As String, wert1 As Long, wert2 As Long)
MsgBox "

Private Sub teste02 wurde gestartet!" & Chr(10) & _
"Text: " & text & Chr(10) & _
"Wert1: " & wert1 & Chr(10) & _
"Wert2: " & wert2
End Sub

Sub ruf_teste02()
Call teste02("Übergebener Testtext", 12345, 98765)
End Sub

Aufgerufen werden alle diese Prozeduren aus Modul2 heraus:
' Modul2
Sub RufeMakros()
' Public Prozeduren
' nach Eingabe des Punktes werden globale Prozeduren des Moduls angezeigt
Modul1.ruf_teste01
Modul1.ruf_teste02
' Private Prozeduren
Application.Run "Modul1.teste01"
Application.Run "Modul1.teste02", "Melanie", 3, 12
Application.Run "DieseArbeitsmappe.Workbook_Open"
Application.Run "Tabelle1.Worksheet_SelectionChange", Range("A1")
End Sub
Die Ereignisprozeduren werden zwar aufgerufen und der hinterlegte Code ausgeführt,
dass Ereignis selbst wird aber nicht ausgeführt, z.B. beim Close-Ereignis, wird die Mappe nicht durch den manuellen Aufruf geschlossen.
--
Mit freundlichen Grüssen
Melanie Breden
- Microsoft MVP für Excel -
http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Anzeige
AW: Wie kann man Private Sub's ablaufen lassen?
03.07.2004 11:45:45
Melanie
Hallo Dieter,
vielleicht kann ich etwas Licht ins Dunkle bringen :-)
Es spielt gar keine Rolle, in welchen Modulen Prozeduren hinterlegt sind und ob sie Private oder Public sind ;-)
Es kommt nur darauf an, wie man sie aufruft!
In einer Arbeitsmappe seinen folgende Prozeduren:
' DieseArbeitsmappe

Private Sub Workbook_Open()
MsgBox "Workbook_Open wurde aufgerufen"
End Sub

' Tabelle1

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox Target.Address
End Sub

' Modul1

Private Sub teste01()
MsgBox "

Private Sub teste01 wurde gestartet!"
End Sub

Sub ruf_teste01()
Call teste01
End Sub


Private Sub teste02(text As String, wert1 As Long, wert2 As Long)
MsgBox "

Private Sub teste02 wurde gestartet!" & Chr(10) & _
"Text: " & text & Chr(10) & _
"Wert1: " & wert1 & Chr(10) & _
"Wert2: " & wert2
End Sub

Sub ruf_teste02()
Call teste02("Übergebener Testtext", 12345, 98765)
End Sub

Aufgerufen werden alle diese Prozeduren aus Modul2 heraus:
' Modul2
Sub RufeMakros()
' Public Prozeduren
' nach Eingabe des Punktes werden globale Prozeduren des Moduls angezeigt
Modul1.ruf_teste01
Modul1.ruf_teste02
' Private Prozeduren
Application.Run "Modul1.teste01"
Application.Run "Modul1.teste02", "Melanie", 3, 12
Application.Run "DieseArbeitsmappe.Workbook_Open"
Application.Run "Tabelle1.Worksheet_SelectionChange", Range("A1")
End Sub
Die Ereignisprozeduren werden zwar aufgerufen und der hinterlegte Code ausgeführt,
dass Ereignis selbst wird aber nicht ausgeführt, z.B. beim Close-Ereignis, wird die Mappe nicht durch den manuellen Aufruf geschlossen.
--
Mit freundlichen Grüssen
Melanie Breden
- Microsoft MVP für Excel -
http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Private Subs in Excel VBA richtig aufrufen


Schritt-für-Schritt-Anleitung

  1. Erstelle ein neues Modul:

    • Öffne den VBA-Editor mit ALT + F11.
    • Klicke mit der rechten Maustaste auf "VBAProject (DeineDatei.xlsx)" und wähle Einfügen > Modul.
  2. Definiere deine Private Subs:

    Private Sub teste01()
       MsgBox "Private Sub teste01 wurde gestartet!"
    End Sub
    
    Private Sub teste02(text As String, wert1 As Long, wert2 As Long)
       MsgBox "Private Sub teste02 wurde gestartet!" & Chr(10) & _
              "Text: " & text & Chr(10) & _
              "Wert1: " & wert1 & Chr(10) & _
              "Wert2: " & wert2
    End Sub
  3. Rufe die Private Subs aus einem anderen Sub auf:

    • Du kannst eine öffentliche Sub im gleichen Modul oder in einem anderen Modul verwenden, um die Private Subs aufzurufen:
      Sub rufePrivateSubs()
      Call teste01
      Call teste02("Testtext", 123, 456)
      End Sub
  4. Führe die öffentliche Sub aus:

    • Klicke auf F5 oder gehe zurück zu Excel und führe die rufePrivateSubs Sub aus, um die Private Subs zu starten.

Häufige Fehler und Lösungen

  • Fehler: "Sub nicht definiert":

    • Stelle sicher, dass du die Private Subs im gleichen Modul definierst, in dem du sie aufrufst. Private Subs sind nur innerhalb des Moduls sichtbar.
  • Fehler: Event-Handler nicht aufrufbar:

    • Ereignisprozeduren (wie Workbook_Open oder Worksheet_SelectionChange) können nicht manuell aufgerufen werden. Diese werden automatisch bei den entsprechenden Ereignissen ausgelöst.

Alternative Methoden

  • Verwendung von Application.Run:

    • Du kannst Private Subs auch mit Application.Run aufrufen, wenn sie in einem anderen Modul definiert sind:
      Application.Run "DeinModulName.teste01"
      Application.Run "DeinModulName.teste02", "Text", 1, 2
  • Öffentliche Subs nutzen:

    • Wenn du häufig auf eine Sub zugreifen musst, erwäge, sie als Public zu definieren, damit sie aus anderen Modulen aufgerufen werden kann.

Praktische Beispiele

Hier sind einige Beispiele, um das Verständnis zu fördern:

  1. Workbook-Ereignis:

    Private Sub Workbook_Open()
       MsgBox "Workbook wurde geöffnet!"
    End Sub
  2. Aufruf eines Private Sub aus einem anderen Modul:

    ' In Modul1
    Private Sub teste01()
       MsgBox "Teste01 gestartet."
    End Sub
    
    ' In Modul2
    Sub rufeTeste01()
       Application.Run "Modul1.teste01"
    End Sub

Tipps für Profis

  • Verwende Option Explicit:

    • Füge Option Explicit am Anfang jeder Moduldatei hinzu, um sicherzustellen, dass alle Variablen deklariert werden. Dies hilft, Fehler durch Tippfehler zu vermeiden.
  • Nutze die Debugging-Tools:

    • Setze Haltepunkte und benutze die Schritt-für-Schritt-Ausführung, um den Code besser zu verstehen und Fehler zu finden.
  • Dokumentiere deinen Code:

    • Schreibe Kommentare in deinen Code, um die Funktionalität der Private Subs klar zu machen.

FAQ: Häufige Fragen

1. Kann ich Private Subs aus einem anderen Modul aufrufen?
Nein, Private Subs können nur innerhalb des Moduls aufgerufen werden, in dem sie definiert sind.

2. Was ist der Unterschied zwischen Public und Private Subs?
Public Subs können von jedem Modul aus aufgerufen werden, während Private Subs nur innerhalb des Moduls sichtbar sind, in dem sie definiert wurden.

3. Wie kann ich ein Ereignis in einem Arbeitsblatt auslösen?
Ereignisse wie Worksheet_SelectionChange werden automatisch ausgelöst, wenn die entsprechende Aktion (z. B. Auswahländerung) erfolgt. Sie können nicht manuell aufgerufen werden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige