2017-08-22 2 views
0

In einer Userform habe ich dies an der Spitze:Aufruf öffentliche Variable von Userform

Public DelMonth As Variant 

Der Wert von DelMonth von einem ComboBox gelesen wird, und ich kann in dieser Userform ganz gut es aus verschiedenen Subroutinen aufrufe. Aber wenn ich es von einem separaten Modul aus anrufe, liest es es nicht. Es wirft nicht einmal einen Fehler auf. Wenn ich eine MsgBox DelMonth mache, tut es nichts.

+1

Sie müssen 'userformname.DelMonth' von jeder Routine außerhalb des Formulars verwenden. – Rory

Antwort

3

Ein Formular ist ein Objekt; Ein öffentliches Feld in einem Objektmodul gehört zu einer Instanz dieses Objekts. UserForms sind wenig mehr als Klassenmodule mit einer Standardinstanz (d. H. Einem VB_PredeclaredId = True-Attribut) und einem Designer.

Wenn Sie mit dem Standardinstanz des Formulars (eine ziemlich schlechte Idee), dann können Sie dies tun:

MsgBox UserForm1.DelMonth 

Beachten Sie, dass in der globalen Objekten Zustand speichert Bug-anfällig ist, und werden am Ende verursacht Probleme.

Wenn Sie die Form wie die vollwertigen Klasse behandeln ist, dann werden Sie etwas wie dieses:

With New UserForm1 
    .Show 
    MsgBox .DelMonth 
End With 

Beachten Sie, dass das Feld jemand Public bedeutet sein, überall kann gehen und schreiben Sie dazu. Was Sie meinen ist für die Form seinen Wert zu bestimmen, und für die Aufruferlesen diesen Wert. Sie tun dies, indem das Feld mit einem Property Get Mitglied Einkapseln - Start durch das Feld zu machen Private:

Option Explicit 
Private DelMonth As Variant ' wouldn't Integer or Long be more appropriate? 

Public Property Get DeliveryMonth() As Long 
    DeliveryMonth = DelMonth 
End Property 

Nun wird die Anrufer nicht bekommen, die privaten DelMonth zu sehen, und alles, was sie mit DeliveryMonth tun können, ist Aufruf der Get Accessor, der sie nicht an den eingekapselten Wert manipulieren lässt.


Es wirft nicht einmal einen Fehler.

Das ist beunruhigend. Sie erlauben VBA, Tippfehler und anderen illegalen Code zu kompilieren. Geben Sie Option Explicit an der Oberseite von alle Modul. Immer.

+0

Ich versuche DelMonth aus dem Benutzerformular in einem SaveAs-Dialogfeld aufzurufen. Und dieses Dialogfeld schließt das Benutzerformular. Ist es deshalb nicht möglich, die Variable zu greifen? – Robby

+0

Du machst es rückwärts. Der Zweck eines Formulars besteht darin, Daten zu sammeln/anzuzeigen und nicht zu verarbeiten. Ein Formular macht keine Arbeit. Wenn Sie die Standardinstanz entladen haben, wird der globale Status zerstört, ja. Bitte machen Sie die Dinge richtig, vermeiden Sie den globalen Zustand und haben Sie Formulare, die die Aufgabe eines Formulars erfüllen. Danke dir später. –

+0

Ich folge nicht. Ich setze die DelMonth-Variable von einer Benutzerformular ComboxBox. Von dort, in einem Modul, muss ich diese Variable in einem Dialogfeld aufrufen.Wie mache ich es rückwärts? – Robby

Verwandte Themen