Anzeige
Archiv - Navigation
1900to1904
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Dimensionen Nutzen

Dimensionen Nutzen
14.10.2022 13:21:19
Eleftherios
Hallo zusammen,
ich verstehe die nutzung von Dimensionen nicht ganz.
Mein Gedanke war eine Dim zu erstellen (SummeUSt), zu definieren (SummeUSt=Rechenformel) um dann
in der If Not Zeile das Ergebnis zu Runden.
Mir geht es jetzt nicht unbedingt um alternativen sondern um die allgemeine Nutzung von Dims
Kann mir jemand sagen was ich Falsch mache?

Private Sub Worksheet_Change(ByVal Target As Range)
Dim SummeUSt
SummeUSt = Range("M15").Value / (1 + Range("N15").Value) * Range("N15") * ("N15")
'VkBrutto  /   (1+MwSt%)*MwSt%
If Not Intersect(Target, Range("M15,N15")) Is Nothing Then Range("O15").Value = SummeUSt Round(SummeUSt,2)
End Sub
Danke im Voraus
Viele Grüße Lefty

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dimensionen Nutzen
14.10.2022 13:37:03
Rudi
Hallo,
* ("N15") führt zu einem Fehler, da du mit einem TEXT multiplizierst.
If Not Intersect(Target, Range("M15,N15")) Is Nothing Then Range("O15").Value = Application.Round(SummeUSt,2)
Variablen zu deklarieren (Dim) gehört einfach zu einem sauberen Programmierstil und hilft dir (in Verbindung mit Option Explicit) den Überblick zu behalten und Tippfehler zu vermeiden.
Gruß
Rudi
AW: Dimensionen Nutzen
14.10.2022 13:47:50
snb
Verzichte auf überflüssige Variabelen.
Deklarieren ist überflussig für Local Variables.

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("M15,N15")) Is Nothing Then [O15]=round([N15] *[M15]/(1+N15),2)
End Sub

Anzeige
AW: Dimensionen Nutzen
14.10.2022 14:11:30
Eleftherios
Danke SNB für deine Antwort,
ich wollte das nur verstehen mit den Variablen aber aus deiner Antwort kann ich auch was mitnehmen und zwar die Gestaltung der Formel ist um einiges übersichtlicher wie bei mir, danke dafür.
VG Lefty
AW: Dimensionen Nutzen
14.10.2022 13:49:20
Yal
Hallo Lefty,
bei Dimensionierung ist gemeint, dass man damit sagt, ob diese Variable ein Integer, ein Long, ein String, ein Double (mit Nachkommastellen) oder ein bestimmte Objekt. Eine Variable zu definieren, ohne sie zu dimensionieren, ist auch möglich. Man verwendet dabei trotzdem "Dim"
Wichtig ist nur wie es danach verwendet wird. Eine Variable ist ein Speicher für eine Werte (Zahl, Text oder Objekt) den ich später oder mehrmals wiederverwenden möchte. In deinem Fall würde ich "MwSt" als Zahl mit Nachkommstellen (Double) dimensionieren, weil Du diese zweimal in deiner Rechnung einsetzt. So kann man die Berechnung schlanker und nachvollziehbarer gestalten:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim MwSt As Double
'VkBrutto  /   (1+MwSt%)*MwSt%
If Not Intersect(Target, Range("M15,N15")) Is Nothing Then 'nur bei Änderung in der Zelle M15 oder N15
MwSt = Range("N15").Value
Range("O15").Value = Round(Range("M15").Value * MwSt / (1 + MwSt), 2)
End If
End Sub
Variable sind nach dem Motto so viel wie nötig, so wenig wie möglich zu verwenden. Eine Ausnahme: mit Variable kannst Du besser den Verlauf des Codings nachvollziehen, wenn Du den Code in Schritt-Modus (F8) mit offenen Lokalfenster (Ansicht, Lokalfenster) durchläufst. So macht es manchmal Sinn, mehr Variablen zu definieren/verwenden als notwendig wäre.
Man hätte in deinem Beispiel Eingangswert und Ergebnis zwischenspeichern können:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim MwSt As Double
Dim VkBrutto As Double
Dim Ergebnis As Double
'VkBrutto  /   (1+MwSt%)*MwSt%
If Not Intersect(Target, Range("M15,N15")) Is Nothing Then 'nur bei Änderung in der Zelle M15 oder N15
MwSt = Range("N15").Value
VkBrutto = Range("M15").Value
Ergebnis = VkBrutto * MwSt / (1 + MwSt)
Ergebnis = Round(Ergebnis, 2)
Range("O15").Value = Ergebnis
End If
End Sub
Setzt einen Breakpoint (F9) auf der Zeile mit dem If. Es wird den Lauf stoppen. Öffne den Lokalfenster und lasse Schritt für Schritt mit F8 weiterlaufen. Beobachte, welche Wert die Variable nach der gelaufenen Zeile annimmt.
VG
Yal
Anzeige
AW: Dimensionen Nutzen
14.10.2022 14:46:39
Daniel
Hi
Die Dimensionierung einer Variablen hat mehrere Vorteile:
1. wenn du zusätzlich Option Explicit nutzt, dann darfst du im Code nur Variablen verwenden, die du zuvor dimensioniert hast.
das klingt zunächst mal als Einschränkung, aber es schützt dich vor Tippfehlern, die sonst nur sehr schwer auffindbar sind.
wenn du beispielsweise mal aus versehen "SumneUSt" statt "SummeUSt" schreibst, dann macht VBA ohne Option Explicit an dieser Stelle eine neue Variable auf und diese hat erstmal den Wert 0, dh wenn du dann rechnest

SummeUSt = 1,23
SummeUst = SumneUst * 100
dann hat SummeUst ohne Option Explicit und Dimensionierung von SummeUst den Wert 0 und nicht 123 wie erwartet. Mit Option Explicit bekommst du sofort eine Fehlermeldung und SumneUst wird dir angezeigt.
2. Bei Deklarierten Variablen kannst du die Intellisense nutzen. Dh VBA kennt dann diese Variable und wenn du sie im Code verwenden willst, musst du nicht mehr den ganzen Variablennamen tippen, sondern nur die ersten Buchstaben und dann STRG+Leer, entweder vervollständigt der Editor dann automatisch den Variablennamen (wenn die ersten Buchstaben schon eindeutig sind), oder er macht eine Klappliste auf mit den Variabeln und Befehlen, die du durchscrollen kannst um die Variable auszuwählen, du musst also den Variablennamen nicht vollständig tippen.
Das ist hilfreich wenn man gerne mit längeren sprechenden Variablennamen arbeitet (SummeUst) oder mehrere ähnliche hat, man muss sich dann auch nicht mehr den extakten Namen merken (siehe 1.)
3. noch mehr Vorteile bekommst du, wenn du die Variable nicht nur allgemein als Variant deklarierst (ohne Angabe des Typs) sondern mit der Typangabe:

Dim SummeUst as Double
hier ist der Vorteil, das Variant-Variablen mehr Speicherplatz brauchen und langsamer in der Verarbeitung sind als welche mit festgelegtem Typ. Bei den heutigen Rechnern spürt man das zwar in der Regel nicht sondern nur, wenn man Schleifen mit sehr hoher Umlaufzahl erstellt, aber nur so fürs prinzip.
Ein weitere Vorteil ist, dass dich das vor einem Logikfehler in der Programmierung schützen kann, weil du dann eine Fehlemeldung bekommst, wenn du bspw einer Zahlenvariable versuchst, einen Text zuzuweisen. (Logikfehler merkt man nur am falschen Ergebnis, aber nicht an einer Fehlermeldung)
Noch wichtiger wird die richtige Typzuweisung, wenn du Objekt-Variablen erstellst:

Dim rngX as Range
Dim wshDaten as Worksheet
Bei Objekten hängt man ja oft an das Objekt noch die gewünschte Eigenschart (wshDaten.Name) oder den Befehl an (rngX.ClearContents).
Bei Deklaration mit Typ kann dir dann die Intellisene (STRG+Leer) gleich die Liste mit den für diesesn Objekttyp passenden Eigenschaften und Befehlen aufmachen.
hast du ohne Angabe des Typs deklariert, funktioniert das nicht und du musst selber wissen, wie der Befehl genau heißt.
ja das wären so die drei oder vier Hauptnutzen von Option Explicit sowie der Dimensionierung mit Typangabe (wenn möglich).
Deswegen würde ich jedem Empfehlen, das zu nutzen.
Gruß Daniel
Anzeige
Zu Daniel Nr. 3.
15.10.2022 11:27:13
lupo1
Der (mögliche) Nachteil
Dim ohne Typ gleich Variant
gilt auch für undeklarierte Variablen. Die sind ebenfalls Variant.
Noch ein Vorteil
15.10.2022 11:37:46
RPP63
(weil ich gerade eine ähnliche Antwort gab)
Es gibt Situationen, wo man ganz bewusst Variant wählen sollte.
Ein Variant kann nämlich auch einen Fehler aufnehmen.
Beipiel Application.Match()
Wenn ich eine Variable mittels Match füllen will, wäre "eigentlich" Long geboten, denn es soll ja die Zeilennummer der Fundstelle im Bereich ausgegeben werden.
Wird nichts gefunden, führt die Zuweisung in einen Long zu einem Abbruch wegen eines LZF.
Daher (besser als eine Fehlerbehandlung) Prüfung der Variable auf IsNumeric(Variable)
Gruß Ralf
Anzeige
AW: Noch ein Vorteil
17.10.2022 14:00:47
Daniel
natürlich gibt es Situiationen, in denen Variant sinnvoll und notwendig ist.
allein schon, wenn ich einen Wert aus einer Zelle übernehme, kann es ja sein, dass da ein Zahl oder ein Text drin steht.
Trotzdem konnte mir noch niemand den Vorteil nennen, den ich habe, wenn ich auf Option Explicit und zwingende Variablendeklaration verzichte, außer dass es meinem Hang zum schlampigen Programmieren weniger einschränkt.
Vielen Dank an alle
14.10.2022 15:13:34
Eleftherios
Vielen Dank für die ganzen Erklärungen Ihr seid echt Super,
Ich werde nun mal versuchen das ganze in die Tat um zusetzen jedoch bin ich mir Sicher das Ihr bald wieder von mir lesen werdet ;D.
Viele Grüße
Lefty
Anzeige
AW: Vielen Dank an alle
16.10.2022 16:53:39
snb
Du hast schon gesehen:
- Option Explicit ist nie notwendig, weil man immer selbst beleibig Variablen deklarieren kann
- Deklarieren von Variablen ist nur notwendig wenn eine Variable in mehrere Prozeduren (Privat oder Public) eine Rolle spielen muss
- Wie Daniel humorvoll illustriert hat, schützt Option Explicit nicht vor Tipp- (oder Kenntnis)fehler. Jeder der die VBA grundlagen bemeistert hat weiss das

  SummeUSt = 1,23
SummeUSt = SumneUst * 100 
ein Syntaxisfehler enthält. Da hilft 'Option Explicit' nicht eben 0%.
- In VBA braucht man keine/kaum Object Variablen, weil man mit With ... End With alle VBA Objekten unmittelbar bearbeiten kann. Viele alte Programmierer haben VBA gelernt als With ... End With noch nicht existierte. Sie sind noch 'old skool'.
- 'Option Explicit' ist ein Relikt der Ära das ein PC ein Arbeitsspeicher von max. 64 K hatte. Das ist seit 1990 nicht mehr der Fall. Auch 'old skool'.
- Alle genannte 'Vorteile' sind nur 'collateral advantage'; das war nie der Absicht von 'Option Explicit'. Jeder der präzis programmiert braucht sie nicht
Wichtiger als das Deklarieren von Variablen ist:
- Kenntnis von VBA-Grundlagen z.B. ein 'Double' in VBA hat immer ein Punkt (weil US basiert)
- Gründliche Analyse vorab von Start Situation und erwünschtes Ergebnis
- Eine so einfach wie mögliche Struktur der Daten (z.B. Database ähnlich)
- Eine so einfach wie mögliche Struktur des VBA Codes (input - throughput - output)
Anzeige
AW: Vielen Dank an alle
16.10.2022 17:49:49
Daniel
SNB, du verdrehst hier schon die Tatsachen.
Natürlich schützt dich Option Explicit vor Tippfehlern, denn wenn du es verwendet, wirst du nur "SummeUst" deklarieren und nicht "SumneUst", wenn du dann "SumneUst" im Code verwendet, wird dich der VBA-Editor nicht nur darauf hinweisen, dass du eine nichtdeklarierte Variable verwendest, sondern er wird diese auch noch markieren. Was du diesbezüglich Schreibstil, ist einfach falsch.
- In VBA braucht man keine/kaum Object Variablen, weil man mit With ... End With alle VBA Objekten unmittelbar bearbeiten kann. Viele alte Programmierer haben VBA gelernt als With ... End With noch nicht existierte. Sie sind noch 'old skool'.
Ja vielleicht, wenn man nur kurze Anfängeranwenungen schreibt, die maximal ein Objekt gleichzeitig und nur einmal im ganzen Code verwenden, dann kommt man mit With alleine aus
- Alle genannte 'Vorteile' sind nur 'collateral advantage'; das war nie der Absicht von 'Option Explicit'.
mag sein. Aber da die Verwendung von Option expicit keine Nachteile hat, wäre es dumm auf dessen Vorteile zu verzichten.
Jeder der präzis programmiert braucht sie nicht
Nuja, ganau das ist das Problem. So präzise wie du es fordert, programmieren vielleicht ein paar hochbegabte Wunderkinder, aber nicht der Durchschnittsmenschen, der hier im Forum die Fragen stellt. Die Menschen, die hier Fragen stellen, haben selten eine Ausbildung in diese Richtung sondern sind größteils reine Autodidakten und interessierte Laien.
- Gründliche Analyse vorab von Start Situation und erwünschtes Ergebnis
Genau das unterstützt Option Explicit, weil ich mir vorher überlegen muss, welche Variablen ich brauchen werde. Der Verzicht auf Option Explicit fördert einfaches drauflosprogrammieren (also genau das Gegenteil von dem, was du willst)
Anzeige
AW: Vielen Dank an alle
17.10.2022 10:51:08
snb
Man braucht gerade nicht zu überlegen welche Variablen zu verwenden: alle nicht deklarierte Variablen reichen schon aus, weil sie Variant sind. Und für ein Objektvariable ist Set immer notwendig und ist eine Deklaration deswegen 100% überflüssig.
AW: Vielen Dank an alle
17.10.2022 12:41:24
Daniel
naja, snb
"Man braucht gerade nicht zu überlegen welche Variablen zu verwenden"
steht für mich aber im Widerspruch zu deiner anderen Forderung
"- Gründliche Analyse vorab von Start Situation und erwünschtes Ergebnis"
Gründliche Analyse heißt für mich aber auch, dass sich mir vorher überlege, wie ich zum Ziel komme und was ich dafür brauche (und das schließt Variablen mit ein)
also du widersprichts dir selbst.
Gruß Daniel
Anzeige
AW: Deklarationen nutzen
17.10.2022 13:17:50
GerdL

Sub Example()
Cells(1) = 5 'Demo
X = "5"
If X = Cells(1) Then
MsgBox "Identisch": Stop
Else
MsgBox "different": Stop
End If
End Sub
Gruß Gerd

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige