Wie Klassendefinitionen Arbeit in VBA
Als ich versuche zu lernen, VBA, Klassen sind Strahlen mich einige schwere Schmerzen!!!
Ist hier etwas aus einem meiner VBA-Bücher (VBA und Makros Microsoft Excel 2010 - Bill Jelen Seite 497), die absolut Bizarre und eigentümliche:
-
Öffnen wir ein Klasse Modul im VBE
-
Und wir schreiben die 4 Eigenschaften und 1-Methode der benutzerdefinierten Objekt im Klassenmodul
clsEmployee
:'Properites Public EmpName As String Public EmpID As String Public EmpRate As Double Public EmpWeeklyHrs As Double 'Methods Public Function EmpWeeklyPay() As Double EmpWeeklyPay = EmpRate * EmpWeeklyHrs End Function
-
Dem Buch schreibt Sie, dass das benutzerdefinierte Objekt ist nun abgeschlossen
-
Nun geht das Buch zu öffnen, ein einfaches Modul (kein Klassenmodul) mit einem Verweis auf das benutzerdefinierte Objekt aus einem anderen Modul, so geht es:
Dim Employee as clsEmployee Set Employee = New clsEmployee
-
Nicht es stellt alle den code-block. Wirklich peinlich, was hier ist, dass die Dim Mitarbeiter as clsEmployee ist außerhalb der sub procudure! Warum? (Dies könnte man als die unbedeutende Frage)
Option Explicit Dim Employee as clsEmployee 'why is this outside of the code block? Sub EmpPay() Set Employee = New clsEmployee With Employee .EmpName = "Tracy Syrstad" .EmpID = "1651" .EmpRage = 25 .EmpWeeklyHrs = 40 MsgBox .EmpName & " earns $" & .EmpWeeklyPay & " per week." End With End Sub
-
Buch gnädig, sagt:
Die Prozedur deklariert ein Objekt Employee
als eine neue Instanz clsEmployee
. Es weist dann Werte für die vier Eigenschaften des Objekts und erzeugt eine Nachricht im Feld anzeigen den Namen des Mitarbeiters und die wöchentlichen zahlen. Die Objekt-Methode EmpWeeklyPay
ist
verwendet, um generieren die angezeigten zahlen.
Bin ich fest die Menschen hier
Soweit ich weiß, wenn wir (ein original-VBA-gemacht und nicht selbst eine aus dem Klassenmodul) eine Eigenschaft, nachdem ein Objekt zum Beispiel
Application.Name
...VBA gibt ein Zeichenfolgenwert, der den Namen des Objekts. OK, also VBA irgendwie weiß, wie dies zu tun. Aber ich kann einfach nicht verstehen, wie ist es möglich, in der Bücher Paradigma zu erstellen Sie eine benutzerdefinierte Eigenschaft nur durch Eingabe nix mit hart-codiert
Public EmpName As String
Public EmpID As String
Public EmpRate As Double
Public EmpWeeklyHrs As Double
...nur als Name-Eigenschaft unterscheidet sich von der Eigenschaft "Wert", was schafft bis es 4 verschiedene Eigenschaften? Ich meine, wie sind Ihre mechanik anders? Was macht die Eigenschaft EmpName
anders EmpID
??? Für alles, was ich weiß, Sie sind nur Variablen in der Klasse deklariert-Modul. Wie können wir das erstellen von benutzerdefinierten Objekt-Eigenschaften nur durch das deklarieren von Variablen im Klassenmodul??? Sollten wir nicht irgendwie die Eingabe der mechanik, eine Abgrenzung, die chassis wenn man so will, also wenn ich mit/set EmpID
es wird gehen, um sich die Mitarbeiter-ID-und nicht seinen Namen. Was ist eigentlich, versicherte mir, dass wenn ich Anrufe der EmpRate
es nicht gehen für die EmpWeeklyHrs
es den gleichen Datentyp und es gibt keine andere Art von code in Ihrem "blueprint" die Klasse-Modul zu stoppen, die Dinge aus immer unzuverlässig. Es gibt sicherlich etwas hardcoded, lässt Value
und Name
Eigenschaft unterschiedliche wie können wir nur Variablen deklarieren, in der custom made-Objekt? es macht für mich keinen Sinn
vielen Dank für das ansehen meiner lange lange lange Frage
Application
sind (im funktionalen Sinne) das gleiche tun wie Ihre benutzerdefinierte Klasse. Sie würde nicht erwarten, dass Application.Name
zu verwechseln mit Application.Intersect
, richtig? Natürlich nicht, und der Grund dafür ist, das diese Eigenschaften haben unterschiedliche Erklärungen in der Application
Klasse, genau wie deine EmpID
und EmpRate
.Nomenklatur: In der ersten code-block, was Sie nennen Eigenschaften sind eigentlich Variablen, und was man den Aufruf einer Methode ist eine Eigenschaft.
Die
Dim Employee As clsEmployee
erklärt die Objekt-variable Mitarbeiter, welche Eigenschaften und Verhaltensweisen, die in der Klasse definiert clsEmployee. Gleichen Weise wie Dim sLabel As String
deklariert die variable sLabel mit den Eigenschaften und Verhaltensweisen definiert, die von der eingebauten Klasse String. Die variable Mitarbeiter ist nicht instanziiert (erstellt), bis Set Employee = New clsEmployee
.
InformationsquelleAutor ExoticBirdsMerchant | 2014-02-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basiert auf meinem Verständnis von dem, was du fragst, hier meine Antwort:
Erste Frage:
Wenn Sie dies tun, können Sie die Referenz-Mitarbeiter aus verschiedenen teilen (subs) des Codes. Es wird zugänglich, die den folgenden code. Dies ist optional. Könnten Sie die obige Zeile nur, wenn erforderlich, durch Angabe in der in der sub, die Sie wollen. Dieses Konzept wird oft diskutiert unter dem Begriff der variable-Referenz-Bereich. Es ist keine Besondere Klasse von Gegenständen, sondern eine beliebige variable, die Sie verwenden, Folgen Sie dem gleichen Regel. Werfen Sie einen Blick auf: Gültigkeitsbereich von Variablen in Visual Basic für Applikationen.
Zweite Frage:
Compiler und-Interpreter sind sehr spezifisch über Variablen-Namen. Die Benennung ist fundametal Aspekt der Codierung seitdem registriert wurden in Assembler. Wenn Sie die Mitarbeiter angeben.EmpRate, dann werden die Daten in die Adresse der Mitarbeiter.EmpRate verwendet wird, sehe ich keine Möglichkeit, es könnte verwirren-Mitarbeiter.EmpRate mit Mitarbeiter.EmpWeeklyHrs. Das zwei-Variablen/Eigenschaften unterschiedliche Namen haben und damit haben 2 verschiedene Lagerorte.
Bearbeiten, zu erklären, mit einem sehr, SEHR vereinfachte Darstellung (dies ist nun, was passiert, natürlich, aber es ist gedacht, um den Gedanken zu verdeutlichen):
Nun, wenn Sie code
VBA geht zu dem Speicherort der Instanz namens "Mitarbeiter" und findet, dass die Eigenschaft namens "Name" gespeichert ist, mit einem Hubraum von 8 chars von der Basis-Adresse der Wert 1000 des Objekts. Es geht dann aus und weist die Zeichenfolge "Scott" gefunden an Position 1008 die variable Doc.
Der Entwurf ist nur ein blueprint (betrachten Sie es vielleicht als eine shopping-Liste der Artikel), es hält keine spezifischen Werte vor der Laufzeit, d.h. vor der Ausführung (Ihr Warenkorb beginnt ausgefüllt werden, von der shopping-Liste, wenn Sie die eigentliche shopping) . Wenn Sie gehen, zu laufen, der Zeit, und wenn Sie ein Objekt erstellen, das von der blue print, Arbeitsspeicher zugewiesen wird, basiert auf Ihr blaues Druck-Spezifikationen.
Ja, Sie können nicht beziehen sich auf eine Eigenschaft von außerhalb der Klasse ohne ein Objekt Namen. Außerhalb der Klasse, erhalten Sie eine Fehlermeldung, wenn Sie EmpID=5 erstellen Sie ein Objekt wie Mitarbeiter-und dann machen Mitarbeiter.Empid=5. Innerhalb der Klasse code, die Sie verwenden können, EmpID=5.
Eine Eigenschaft, auf die verwiesen werden kann, die dieses format benutzen: Objektname.PropertyName. Wenn Sie ein Objekt erstellt haben, dann ist der "bauplan" bestimmt wird, wenn Sie das Objekt erstellen vom bauplan. Da der name der Eigenschaft in das Objekt ein Unikat ist, wird der entsprechende Wert der Eigenschaft zurückgegeben.
Ich werde eine einfache Tabelle für Sie nach wenigen Minuten
InformationsquelleAutor NoChance