aivilon
Goto Top

VBA Modul ruft Public Sub in Userform auf

Moin zusammen

Wieder mal ein doofes Problem...
Ich hab eine Userform mit viel Code und dieser Code greift auf verschiedene Worksheets zu. Deshalb ist der Code im Codeabschnitt der Userform und nicht in den Modulen.
Ich möchte jetzt zwei onTime's setzen beim Aufrufen der Userform. Einmal um eine Aktualisierung zu pushen (in Codeform in der Userform (kann in der Userform auch per Button aufgerufen werden)) und einmal um das Excel zu schliessen. Mit folgendem onTime Code kann ich leider nicht in der Userform ein Sub ausführen lassen (onTime und der gewünschte Code wären zwar am selben Ort):
 Application.onTime TimeValue(ThisWorkbook.Worksheets("SUF").Range("B32")), "TestRef"   

Also habe ich den Sub TestRef in ein Modul gepappt. Darin hab ich jetzt wie folgt versucht den Sub in der Userform zu starten:
Sub TestRef()
    Call UserForm1.comRefresh_Click
End Sub

Das geht leider auch nicht... Ich erhalte nun die Meldung "Objekt erforderlich" ...

Wie bring ich das ganze auf die Reihe?


Grüsse,
Aiv

Content-ID: 282369

Url: https://administrator.de/forum/vba-modul-ruft-public-sub-in-userform-auf-282369.html

Ausgedruckt am: 23.12.2024 um 07:12 Uhr

emeriks
emeriks 09.09.2015 um 11:31:03 Uhr
Goto Top
Hi,
ich kenne jetzt VBA nicht so genau (aber VB.Net).

Ansatz 1
Die Form als Parameter von "TestRef" übergeben und dann diesen Parameter statt "UserForm1" in der Sub benutzen.

Ansatz 2
Vor Aufruf von "TestRef" die UserForm1 an eine globale Variable übergeben und diese "UserForm1" in der Sub benutzen.

E.
114757
114757 09.09.2015 um 11:34:46 Uhr
Goto Top
Moin,
du kannst auch in der Form eine Public Sub erstellen die du mit deinem Button in der Form aufrufst.

In anderen Subs kannst du dann mit
Userform1.DeinePublicSub
dein Update triggern. Geht einwandfrei, wenn du willst schicke ich dir ein Beispieldokument.

Gruß jodel32
aivilon
aivilon 09.09.2015 aktualisiert um 12:16:30 Uhr
Goto Top
Moin Jodel

Hmm... hab ich in diesem Sinne auch schon probiert.
 Call UserForm1.comRefresh_Click 
der comRefresh_Click ist in dem Sinne der Sub des Buttons. Auch mit comRefresh alleine geht es nicht.

Ja wäre am Beispiel interessiert.

Gmail: zensuriert

Grüsse Aiv
114757
Lösung 114757 09.09.2015 aktualisiert um 12:11:06 Uhr
Goto Top
Zitat von @aivilon:

Moin Jodel

Hmm... hab ich in diesem Sinne auch schon probiert.
 Call UserForm1.comRefresh_Click 
der comRefresh_Click ist in dem Sinne der Sub des Buttons. Auch mit comRefresh alleine geht es nicht.
Nein, dur darfst nicht die Private Sub des Buttons aufrufen sondern eine extra Public Sub erstellen:
Private Sub comRefresh_Click()
   Update
End Sub

Public Sub Update()
   ' hier dein Code den du ansonsten im Button-Code aufrufst  
End Sub

und dann mit
UserForm1.Update
triggern.
aivilon
aivilon 09.09.2015 um 11:41:01 Uhr
Goto Top
Komm leider nicht draus face-confused

Sorry bin nicht all zu fit in VBA... :D
114757
114757 09.09.2015 um 11:43:43 Uhr
Goto Top
Dokument unterwegs ...
aivilon
aivilon 09.09.2015 um 11:46:02 Uhr
Goto Top
Also ich hab jetzt im Formular der UserForm1:
Private Sub UserForm_Initialize()
.....
Application.onTime TimeValue(ThisWorkbook.Worksheets("SUF").Range("B32")), "TestRef"  
.....

Public Sub TestRefresh()
    Call UserForm1.comRefresh_Click
End Sub

Gleich darunter hab ich:
Private Sub comRefresh_Click()

ThisWorkbook.Worksheets("SUF").Range("B5").Value = Date + Time          'Datum und Zeit in Sheet SUF unter B5 schreiben  
objLastRefresh.Value = ThisWorkbook.Worksheets("SUF").Range("B5")       'Liest den Wert aus Excel für in im Textfeld von zuletzt aktualisiert  
objLastRefresh2.Value = ThisWorkbook.Worksheets("SUF").Range("B5")        
.
.
.
.
.
.

Im Modul6 habe ich:
Sub TestRef()
    Call UserForm1.TestRefresh
End Sub


Ich setze im initialize also den Wert für onTime. Um die gewünschte Zeit ruft das im Modul6 den Sub TestRef auf. Das geht bis hier hin. Jetzt geht aber der Call USerForm1.TestRefresh nicht...
122990
Lösung 122990 09.09.2015 aktualisiert um 12:10:57 Uhr
Goto Top
You're mixing private an public Subs face-wink

Es kann dein Makro nicht finden weil es eben nicht public deklariert wurde ...
Sub TestRef()
muss
Pubilic Sub TestRef()
lauten ... dann lüppt das.

Gruß grexit
aivilon
aivilon 09.09.2015 aktualisiert um 11:59:50 Uhr
Goto Top
Zitat von @122990:

You're mixing private an public Subs face-wink

Es kann dein Makro nicht finden weil es eben nicht public deklariert wurde ...
Sub TestRef()
muss
Pubilic Sub TestRef()
lauten ... dann lüppt das.

Gruß grexit

Geht immer noch nicht :D :rofl:

Sagt immernoch wieder an diesem Punkt Objekt erforderlich
114757
Lösung 114757 09.09.2015 aktualisiert um 12:10:50 Uhr
Goto Top
Weiteres Demo-Dokument unterwegs an deine Mail ...
emeriks
emeriks 09.09.2015 um 12:04:33 Uhr
Goto Top
Das Problem ist doch nicht, dass die Sub nicht gefunden wird! Er meldet "Objekt erforderlich". Das kann nur sein, dass "UserForm1" in "TestRef" nicht bekannt ist bzw. nicht initialisiert ist.
Man kann, meines Wissens, auch in VBA nicht einfach aus einem Modul oder Klasse auf eine Form zugreifen, welche diesem Modul nicht irgendwie refernziert wird. Also entweder mit allen Methoden in der Form bleiben, oder die Form in einer Variable übergeben.
114757
114757 09.09.2015 aktualisiert um 12:07:23 Uhr
Goto Top
Man kann, meines Wissens, auch in VBA nicht einfach aus einem Modul oder Klasse auf eine Form zugreifen, welche diesem Modul nicht irgendwie refernziert wird.
Doch kann man, weil die Form Public erzeugt wird...
https://drive.google.com/file/d/0B_Oqbs4tcHfrYTJ6NGNSbS1oU1U/view?usp=sh ...
aivilon
aivilon 09.09.2015 um 12:10:42 Uhr
Goto Top
ehm.... *rot werden* ... ja irgendwie auch kein wunder...hätte UserForm1 auch so benennen sollen wie die Userform heisst... hab da immer ein durcheinander ob jetzt userform steht oder der Name der userform ....

geht glaub ich...zumindest bin ich schon mal bis zum nächsten (eingeplanten) Fehler in der Aktualisierung gekommen.

Danke Jodel für die Demo Files! konnte es besser nachvollziehen wo wie was als ich es gesehen hab..

Danke auch an emeriks und grexit (haha lol guter Name :D)


Grüsse,
Aiv
122990
122990 09.09.2015 aktualisiert um 12:13:13 Uhr
Goto Top
Dann mach bitte deine Mail-Adresse noch unkenntlich, außer du brauchst uneingeladene Gäste face-smile

G. g.
aivilon
aivilon 09.09.2015 um 12:17:01 Uhr
Goto Top
Zitat von @122990:

Dann mach bitte deine Mail-Adresse noch unkenntlich, außer du brauchst uneingeladene Gäste face-smile

G. g.

haha danke ;)

Grüsse