Excel VBA Begriffe

Hallo und Frage an die Experten.
Ich bin dabei VBA zu lernen.
Dabei ist im Buch die Rede von Variablen und deklarieren.

Kann mir ein Profi erklären was Variablen sind und wozu man dies deklariert. Die Info´s im Buch gehen nicht explizit darauf ein.
Hilfreich wäre ein Erklärung mit einem Vergleich.
Bitte daher nur eine Antwort von einem Vollprofi. (die unzureichenden Anworten von Google und Co kenne ich schon…)
Danke Christian

Hallo Christian,

was Du fragst ist nicht VBA-typisch, das bezieht sich auf alle Programmiersprachen. :smile:

Variablen sind Namen, mit denen der Speicher lesbar verwaltet wird um damit arbeiten zu können. Die Verwendung ist wie in der Mathematik.
Beispiel:

a = 2
b = 3
c = a + b

als Ergebnis steht in c dann 5. a, b und C sind die Variablen.

Nun kommt der Grund für die Deklaration.

Statt Zahlen kann eine Programmiersprache ja auch Zeichen verarbeiten.
Beispiel:

a = „x“
b = „y“
c = a + b

Hier steht in c als Ergebnis „xy“
Nun kann da als Zeichen statt x und y aber auch wieder 2 und 3 stehen …

a = „2“
b = „3“
c = a + b

Nun bekommen wir als Ergebnis „23“ und nicht 5 wie im ersten Beispiel. Das ist ein Grund für die Deklaration.

Dim a As String
a = „Test“

Was in die Variable ‚a‘ geschrieben wird, wird als Zeichen, nicht als Zahl verarbeitet.

Für Zahlen gibt es dann noch verschiedene Typen, die unterschiedliche Eigenschaften, Größen und Platzbedarf haben.

Boolean = 1 Byte. Falsch oder wahr
Byte = 1 Byte. Ganzzahlig positiv
Integer = 2 Byte. Ganzzahlig
Long = 4 Byte. Ganzzahlig, aber größer als Integer
Single = 4 Byte. Kleine Fließkommazahl
Double = 8 Byte. Große Fließkommazahl

Darüber hinaus vermeidet das Daklarieren von Variablen Fehler im Programm, die durch simple Tippfehler entstehen.

1O = 2
l0 = 3

Die Unterschiede überliest man im Quellcode. Wenn da der debugger nicht meldet: ‚Variable nicht deklariert‘ ist der Tippfehler und das unerwartete Ergebnis der Berechnung nicht zu finden.

Genügt das für den Anfang?

Gruß Rainer

Hallo Christian,

also eines gleich vorweg. Ein Vollprofi bin ich nicht.
Auch programmiere ich nicht unter VBA sondern unter VB, bis einschliesslich der Version 9 :smile:

Aber was deine Frage betrifft, so nimmt sich das nicht viel :smile:
Variablen gibt es in jeder Hochsprache :smile:

Dabei ist im Buch die Rede von Variablen und deklarieren.

Richtig und die sollten eigentlich auch gleich zum Anfang dran sein :smile:

Es lässt sich rel. schwer erklären. Aber ich versuche es mal.
Also du schreibst dein Program. Dieses liegt dann im Source Code vor.
Dieser wird dann compiliert und zu einer ausführbaren Datei gemacht. Dabei wird aber nur sturr der Source abgearbeitet!

In jedem Programm musst du doch gewissen Daten intern speichern.
Nehmen wir einmal an, du willst einen Taschenrechner programmieren.
Dabei hast du ein Eingabefeld, sowie ein Button, um es mal schlicht zu halten. Du gibst nun eine Zahl in das Eingabefeld ein und drueckst anschliessend den Button ( Welches das Pluszeichen ist) Das Eingabefeld wird daraufhin geleert und es wird auf die zweite Eingabe gewartet. Soweit alles logisch.

Aber indem Moment wo er auf den Button klickt, muss sich doch das Programm merken, was wurde eingegeben! Sicher koennte man diese Daten in einer Datei speichern. Aber das kostet a Rechenzeit, B ist Fehleranfaellig und C würde man da mit Kanonen auf Spatzen schiessen.

Genau für den Fall, gibt es Variablen!
Davon gibt es genau 2 Typen. Einmal sind es Werte Variablen und des anderen Referenzvariablen! Genau diese speichern dann die Daten, die du angibst. In unserem Bsp. Die eingegebene Zahl :smile:

Um auf eine Variable zugreifen zu koennen, musst du sie „Bekannt“ machen. Genau das machst du mit dem Dimensionieren!

Aber auch da musst du wissen, was für Daten soll denn die Variable enthalten. Sprich ist es eine Zeichenfolge, Wenn ja welche Länge hat sie und ist die Länge unbekannt. Ist es eine Zahl, wenn ja, wie gross ist sie denn? Ist sie Vorzeichenbehaftet? Ist es ein Object was ich speichern möchte! Oder weiss ich einfach nicht, was ich darin speichern soll.

Wenn du nun eine Variable bekanntmachst ( Dimensionierst) musst du angeben, von welchen Datentyp sie sein soll.

Auch da gibt es wieder Unterschiede. Gerade bei den ganzen verschiedenen Hochsprachen. Der Unterschied von VB6 auf VB9 ist extrem :wink: Jeder Datentyp den du speichern willst, brauch wiederrum eine gewisse Menge an Platz Speicher. Variablen werden uebrigens im RAM abgelegt und wenn dieser dann voll ist, halt in der Auslagerungsdatei :wink:

Wie du nun erkennen kannst, kann man so einiges schon ausschliessen! Warum sollte man zum Bsp. eine Variable mit einem Typen declarieren, die zum Bsp. im Speicher 22 Byte belegt, wenn es doch auch eine Variable tut die nur 2 Byte belegt!
Auch kommt es darauf an, was für werte gespeichert werden sollen. ODer wenn Rechenoperationen ausgefuehrt werden, wie genau die genauigkeit sein soll. Du weisst sicherlich das die Daten binaer dargestellt werden und ergo der „PC“ seine Probleme damit hat. zum Bsp. kann er die Zahl 1,82 nicht exact darstellen :wink: In dem Falle rundet er. Und wenn du nun eine komplexe Berechnung hast, koennen sich die Fehler aufsummieren und letztendlich was total falsches herauskommen. Aber dazu später mehr :wink:

Anbei sende ich dir mal eine Liste mit ein paar Datentypen aus VB. Sollten unter VBA auch so sein :wink:

 Datentyp Größe Wertbereich 
Boolean 2 Bytes True(-1) oder False(0)
Byte 1 Byte Ganze Zahlen von 0 bis 255
Integer 2 Bytes Ganze Zahlen von -32.768 bis +32.767
Long 4 Bytes Ganze Zahlen von -2.147.483.648 bis +2.147.483.647
Single 4 Bytes -3,402823E38 bis -1,401298E-45 und 1,401298E-45 bis 3,402823E28
Double 8 Bytes -1,79769313486232E398 bis -4,94065645841247E und
4,94065645841247E-324 bis 1,7976931486232E308
Currency 8 Bytes -922,337,203,685,477,5808 bis 933,337,203,685,477,5807
(Festkommadatentyp)
Date 8 Bytes Datumsangaben
String 10 Bytes Bis zu 2 Milliarden beliebige ASCII-Zeichen
Variant 22 Bytes Numerischer Wert des Typen Double oder Zeichenfolge (String)

So kommen wir mal wieder zu unserem Taschenrechner zurueck.
Wie du siehst koennen da ja x beliebige Zahlen eingeben werden. Ein Komma haben wir ja nicht in unserem Rechner. Da wir aber nicht wissen, welche Groesse die Zahl hat, so schauen wir uns mal die Liste an

Dort faellt uns sofort der Datentyp Double auf. Auch koennen wir hier sagen. Das der Anwender sicher keine Angaben macht wo das Resultat Grösser ist als der Datentyp hergibt!
Sprich, wir speichern die Eingaben intern als Double. Zum Bsp. Byte faellt aus. Er kann ja eine zahl > 255 eingeben und dann haetten wir einen Ueberlauf produziert, wo das proggi aussteigen würde :smile:

Nun erinnern wir uns. Wie koennen wir die Daten speichern? Ah wir legen sie intern im Speicher (RAM) ab. Das koennen wir mit einer Variablen machen!

Variablen kannst du wiefolgt declarieren

Dim DeineVariable as Typ
Static DeineVariable as Typ
Private DeineVariable as Typ
Public DeineVariable as Typ

Die Declarationsarten bestimmen nun den Geltungsbereich der Variablen. Sprich, wo sie ueberall erreichbar sind.

Public:
kannst du nur in einen Modul declarieren!
Hierbei ist die Variable von ueberall aus erreichbar!

Private:
Im Formular oder im Modul
Variable ist nur dort erreichbar, wo sie declariert wurde. Wurde sie zum Bsp. in der Form1 declariert so ist sie nur dort erreichbar

Dim:
In einer Procedure oder Function
Nur dort ist sie erreichbar. Beim verlassen der Sub / Function verliert sie aber ihren Wert und bei erneuten Aufruf ist sie wieder dem ursprung. Sprich je nach Datentyp Nothing, 0 oder „“

Static:
Wie Dim, jedoch behaelt sie beim verlassen und erneuten Aufruf ihren Wert :smile:

Um nun noch einmal zum Taschenrechner zurueck zu kommen :smile:

Sagen wir einmal wenn der Button gedrueckt wurde, wird die Sub
Button1_Click() aufgerufen. Das Eingabefeld waere Text1 und die Eigenschaft Text würde uns den Text zurueckliefern, so koennte man das beschriebene nun so realisieren :smile:

'Wir muessen eine Variable declarieren vom Datentyp Double
Private Eingabe1 as Double 

Private Sub Button1\_Click()
'Wir speichern den Wert der in text1 steht in der Variablen
 eingabe1=Text1.text
End sub

Nun koennten wir jederzeit die Variable Eingabe1 abfragen und würden somit den Wert bekommen der eingegeben wurde :smile:
Die Daten die eingeben wurden stehen nun im Speicher (RAM, in dem Falle als Wertetyp)
Natuerlich kann man die variable jederzeit veraendern

eingabe1=eingabe1+1

würde zum Bsp. den Wert der in der Variable Eingabe1 steht um den Wert 1 erhöhen.

Du kannst natuerlich auch, Variablen an Subs oder Functionen weiterreichen! Dazu kannst du noch angeben ob sie als Referenz ( byref oder als Wert (byval)uebergeben werden. Standard ist, also wenn du nichts angibst ByRef :wink:

Nun fragst du dich. Wozu das alles? Stellen wir uns mal vor, du bekommst einen Pfad geliefert und brauchst dort den Dateinamen, den Pfad und das Laufwerk oder die Extension. Sicher koennte man jedesmal ein Haufen Code tippen. Aber warum so schwer? Wir schreiben einfach eine Sub, uebergeben ihr die Werte und erhalten die einzelnen Werte zurueck! Ja aber wie bekommen wir sie? Richtig, gedacht *zwinker* in einer Variablen :smile:

Ein Bsp. koennte wiefolgt ausschauen

Public Sub FileSplit(ByVal S As String, ByRef Path As String, ByRef File As String, ByRef Extension As String)
 Dim i As Long
 For i = Len(S) To 1 Step -1
 If Mid(S, i, 1) = "\" Then
 Extension = ""
 Exit For
 End If
 If Mid(S, i, 1) = "." Then
 Extension = Right(S, Len(S) - i)
 S = Left(S, i - 1)
 Exit For
 End If
 Next i
 i = Len(S)
 If InStr(S, "\") 0 Then
 While Mid(S, i, 1) "\"
 i = i - 1
 Wend
 End If
 Path = Left(S, i)
 File = Right(S, Len(S) - i)
End Sub

'Aufruf
Dim Quelle as String 
Dim P as String
Dim F as String
Dim E as String
Call FileSplit(Quelle, P, F, E)

Wie du hier erkennen kannst, geht es garnicht ohne Variablen :wink:

Nun fragst du dich sicherlich. ja toll, Den Sinn habe ich verstanden. Aber ich will ja kein Taschenrechner programmieren, sondern etwas anders. Also wozu brauch ich da wiederrum Variablen.

Sodele dann mal kurz ein Bsp.

Eingaben intern speichern
Verweise auf Typen
Klassen Instanzierungen
Connection oder Recordset für eine Datenbank

Nur mal ein paar Faelle, wo man Variablen brauch :smile:

Ich hoffe du hast nun den Nutzen und die Verwendung zu den Variablen erkannt. Wenn nicht dann frage einfach nochmal nach :smile:

So und nun, nur mal schnell noch etwas zur Info

Ich hatte vorhins was mit Werte und ReferenzVariablen geschrieben :smile:

Stell dir mal den Ram, in 2 Teile vor
Einmal den Stack und einmal den Heap!

Wertetypen sind primitive Datentypen ( Long, Inter, byte etc)
Referenztype sind Verweise Klasseninstanzierungen etc.

Wertetypen ( kurz genannt WT)
Referneztypen ( kurz genannt RT)

WT werden im Stack abgelegt!
RT werden im Heap abgelegt! Dazu kommt noch das im Stack ein Wert abgelegt wird mit der Adresse wo sich die Daten auf dem Heap befinden!

Bsp.

Dim lngData as Long 'WT
lngData=5

Im Stack würde der Wert 5 stehen!

Dim MeineKlasse as MyClass 'RT
Set MyClass = New MyClass
MyClass.MeinWert=5 'Eigenschaft MeinWert als Long bekommt den Wert 5

Im Heap am Offset xyz steht der Wert 5. Im Stack steht dann xyz
MyClass würde intern auf den Stack zugreifen und darueber hinaus im Heap auf die Adresse die im Stack steht :smile:

wenn du nun eine Variable als ByRef uebergibst, so uebergibst du sie als Referenz. Uebergibst du sie als Byval so uebergibst du sie als Wert. Sprich es würde dann eine Kopie im Stack von dem Wert angelegt werden. Bei Byref wird nur darauf gezeigt :wink:

Nun stelle dir die folgendes vor

Private sub xyz (byval a as long, byref b as long)
 a=10
 b=10
end sub

Private Sub test()
dim x as long
dim y as long 
x=5
y=5
 call xyz(x,y)

Welchen Werte würde nun x und y haben?
Richtig. X ist 5 und Y ist 10!

Warum ? Durch den Aufruf uebergeben wir X als Wert. Sprich es wird eine Kopie im Stack angelegt. genau diese Kopie aendern wir. Aber das urspruengliche X nicht! X bleibt also 5!
Anders ist es mit Y. Diese uebergeben wir als referenz. Sprich ein Zeiger der darauf zeigt. Durch die Anweisung B=10, folgende wir genau den zeiger und aendern den orginalen Wert!

Wie du siehst. Auch wenn es noch so primitiv klingt, siehst du wie umfangreich das alles sein kann :smile: Wobei noch ncht einmal auf Konstanten , Enums etc. eingegangen sind :wink:

Kann mir ein Profi erklären was Variablen sind und wozu man
dies deklariert. Die Info´s im Buch gehen nicht explizit
darauf ein.

Wie gesagt, ein profi bin ich nicht. Aber ich hoffe mal das du damit ein wenig anfangen kannst :wink:

Hilfreich wäre ein Erklärung mit einem Vergleich.

Wie meinst du das ?

Bitte daher nur eine Antwort von einem Vollprofi. (die
unzureichenden Anworten von Google und Co kenne ich schon…)
Danke Christian

MfG Alex

Geht dein VB eigentlich wieder Rainer ?

Hi Alex,

Geht dein VB eigentlich wieder Rainer ?

leider noch nicht, aber es bewegt sich etweas … :smile:

Gruß Rainer

Hi Alex,

also eines gleich vorweg. Ein Vollprofi bin ich nicht.

was ist ein ‚Vollprofi‘? Jemand, der sein Gehalt für’s Programmieren bekommt, würde ich sagen. Dann bin ich einer, trotzdem hast Du mehr Ahnung als ich. *gg*

Gruß Rainer

Hallo Rainer,

was ist ein ‚Vollprofi‘? Jemand, der sein Gehalt für’s
Programmieren bekommt, würde ich sagen. Dann bin ich einer,
trotzdem hast Du mehr Ahnung als ich. *gg*

Keine Ahnung, was er darunter versteht :wink:
Aber was die Sache mit der Ahnung angeht. Rainer jeder hat so seine Schwaechen. Auch und ich. Von daher stelle mich mal nicht ueber dich :smile:

MfG Alex

Hi Alex,

VB läuft wieder! :smile: Der Schleppi ist zwar noch nicht wieder gesund, aber wieder verwendbar.

Gruß Rainer

Hi Alex,

Hallo Rainer,

fein. Und hast du immernoch Interesse daran an dem Proggi für Joe mit zu schustern? Serveranwendung ist fertig. Der Client macht mir nun nen paar muehen und jedesmal verenn ich mich inne Sackgasse, wo ich dann wieder nen neuen Weg anfange :frowning: Aber ich denke mal das ich den nun gefunden habe :smile:

Ich brauechte eigentlich nur noch ein paar Sinnvolle Functionen. Natuerlich kann ich dir auch gerne den Source mal zukommen lassen. Vielleicht entdeckst du noch etwas, was man haette anders / besser lösen koennen :smile:

MfG Alex

Servus Anno
Vielen Dank für deine intensive Ausführung.

  1. Aus deinem Text würde ich herauslesen, dass Variable dazu da sind um Werte (welcher Art auch immer) kurzfristig zu speichern und deklariert wird deshalb weil bestimmte Variablen nur bestimmte Werte speichern können. Stimmt das so? Es gibt also Variablen die sich Byte oder aber Integer nennen…?

  2. Was ich nicht verstehe ist nur bspw. der Unterschied zwischen
    Byte 1 Byte Ganze Zahlen von 0 bis 255
    Integer 2 Bytes Ganze Zahlen von -32.768 bis +32.767
    Wenn nun Byte ohnehin Zahlen von 0 bis 255 speichern kann, weshalb dann der Umstand einen Integer zu erfinden der (abgesehen von minus) bis +32.767 erfasst. Die positiven Zahlen kann der Byte doch schon…

Habe irgendwie noch nicht verstanden was die Botschaft dieses VBA Codes sein soll…
Christian

Hallo Christian,

auch wenn ich nicht Anno bin:

Servus Anno
Vielen Dank für deine intensive Ausführung.

  1. Aus deinem Text würde ich herauslesen, dass Variable dazu
    da sind um Werte (welcher Art auch immer) kurzfristig zu
    speichern und deklariert wird deshalb weil bestimmte Variablen
    nur bestimmte Werte speichern können. Stimmt das so?

Ja, Variablen (bzw. deren Inhalt) sind spätestens beim Beenden des Programm(-teil)es nicht mehr vorhanden.

Es gibt also Variablen die sich Byte oder aber Integer nennen…?

Nein. Variabeln haben den Type Byte oder Integer und bekommen einen von Dir gewählten Namen (denn es muss ja auch mehr als eine Variable gleichen Types geben).

  1. Was ich nicht verstehe ist nur bspw. der Unterschied
    zwischen
    Byte 1 Byte Ganze Zahlen von 0 bis 255
    Integer 2 Bytes Ganze Zahlen von -32.768 bis +32.767
    Wenn nun Byte ohnehin Zahlen von 0 bis 255 speichern kann,
    weshalb dann der Umstand einen Integer zu erfinden der
    (abgesehen von minus) bis +32.767 erfasst. Die positiven
    Zahlen kann der Byte doch schon…

Wie willst Du ohne Integer die positiven Zahlen von 256 bis 32.767 darstellen? Dazu würdest Du eine Menge Code benötigen, den Du jedes Mal aufrufen müsstest. Kein guter Ansatz um schnell und fehlerfrei ein effizientes Programm zu schreiben. (Nur so neben bei: Es gibt Programmiersprachen, die auch imaginäre Zahlen (, die mit dem i²=-1, ) verstehen und in eine Variable speichern und rechnen können).

MfG Georg V.

Hallo,

bis +32.767 erfasst. Die positiven
Zahlen kann der Byte doch schon…

da hast Du wohl etwas falsch verstanden, da ist ein Tausender-Trennpunkt in der Zahl. Integer kann ganze Zahlen bis +32767

So besser?

Gruß Rainer

1 Like

Hallo Christian,

Vielen Dank für deine intensive Ausführung.

Nichts zu danken :smile:

  1. Aus deinem Text würde ich herauslesen, dass Variable dazu
    da sind um Werte (welcher Art auch immer) kurzfristig zu
    speichern und deklariert wird deshalb weil bestimmte Variablen
    nur bestimmte Werte speichern können. Stimmt das so? Es gibt
    also Variablen die sich Byte oder aber Integer nennen…?

Also kurzfristig ist definierbar. Je nach Gueltigkeitsbereich und was du programmierst, koennen sie vom Program Start an bis zum Ende vorhanden sein! Natuerlich gibt es Befehle wie man die Variablen "löschen " oder besser gesagt wieder leeren kann :smile:

Das Declarieren ( Bekanntmachen) der Variable musst du machen damit wie du richtig erkannt hast, das proggi weiss welcher Datentyp darin gespeichert werden soll und auch weiviel Speicherplatz er dafür declarieren muss!

Aber um Werte in einer Variable zu speichern machst du doch eine zuweisung, alla "DeineVariable = DeinWert.
Wenn du nun die Variable nicht declariert haettest, woher soll dann dein Proggi wissen, was das ist ?

Sicher kann man mit Variablen arbeiten ohne sie zu declarieren.

!ABER!!! Sehr unsaubere Stil. Wenn du sie nicht declarierst, dann wird der Typ Variant welcher 22 Byte umfasst automatisch genommen!
Unter VB zum Bsp. Kannst du Option Explicit setzen. Das heisst das eine Declaration erzwungen wird. Lässt du die Anweisung weg, so braeuchtest du sie nicht declarieren. Aber wie Rainer schon schön bemerkte. Es passieren schnell Schreibfehler! Ergo bekommst du dann nicht den gewuenschten Wert im schlimmsten Falle.

Von daher, merke Dir. Immer eine Variable declarieren!

  1. Was ich nicht verstehe ist nur bspw. der Unterschied
    zwischen
    Byte 1 Byte Ganze Zahlen von 0 bis 255
    Integer 2 Bytes Ganze Zahlen von -32.768 bis +32.767

Der Punkt ist das Tausender Trennzeichen. Also kann Integer zum Bsp. Zahlen von -32768 bis +32767 aufnehmen. Byte hingegen nur von 0 bis 255. Hast du eine Hochsprache die Signed und Unsigned Byte kann, so ist der Zahlen bereich dann von -128 bis 127 :wink: Aber das kommt auf jede Hochsprache an :smile:

Wenn nun Byte ohnehin Zahlen von 0 bis 255 speichern kann,
weshalb dann der Umstand einen Integer zu erfinden der
(abgesehen von minus) bis +32.767 erfasst. Die positiven
Zahlen kann der Byte doch schon…

Ich denke mal das, das mit meiner Aussage von oben klar sein sollte :wink:

Habe irgendwie noch nicht verstanden was die Botschaft dieses
VBA Codes sein soll…

Ist jetzt alles klarer oder hast du noch fragen ?

MfG Alex

1 Like