Office: vba neuling! wo ist mein fehler? :)

Helfe beim Thema vba neuling! wo ist mein fehler? :) in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; vba soll mir folgendes ausrechnen hab auch die datei "mappe1" angehangen. Danke schon mal und einen schönen 3. Advent :) Private Sub... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von Farmer, 13. Dezember 2009.

  1. Farmer Erfahrener User

    vba neuling! wo ist mein fehler? :)


    vba soll mir folgendes ausrechnen hab auch die datei "mappe1" angehangen.
    Danke schon mal und einen schönen 3. Advent :)

    Code:
    Private Sub CommandButton1_Click()
    
    Dim Kapital As Single
    Dim Zinssatz As Single
    Dim Tage As Single
    Dim Zinsen As Single
    
    
    Kapital = eingabe_kapital
    Zinssatz = eingabe_zinssatz
    Tage = eingabe_tage
    Zinsen = ausgabe_zinsen
    
    ergebnis = Kapital * Zinssatz * Tage / (100 * 360)
    
    Zinsen = ergebnis
    
    End Sub
    
     
  2. Exl121150 Erfahrener User
    Hallo,

    folgendes Makro für den Button aus Deiner UserForm sollte funktionieren:
    Code:
    Option Explicit
    
    Private Sub CommandButton1_Click()
    
      Dim Kapital As Single
      Dim Zinssatz As Single
      Dim Tage As Single
      Dim Zinsen As Single
      Dim Ergebnis As Single
      
      On Error Resume Next
      
      Kapital = eingabe_kapital.Value
      Zinssatz = eingabe_zinssatz.Value
      Tage = eingabe_tage.Value
      
      Ergebnis = Kapital * Zinssatz * Tage / (100! * 360)
      
      Zinsen = Ergebnis
      
      ausgabe_zinsen.Value = Format(Zinsen, "#,##0.00")
    
        
    End Sub
    Kommentar:
    1) Du solltest Dir unbedingt angewöhnen, als 1. Anweisung in jedem Modul 'Option Explicit' einzufügen. Diese Anweisung ist behilflich, nicht deklarierte Variablen aufzuspüren. Bei längeren Programmen ist das eine enorme Erleichterung, insbesondere wenn es darum geht, Variablen, die nur wegen eines Tippfehlers als nicht deklariert erscheinen, aufzuspüren.

    2) Die Zeile "Zinsen = ausgabe_zinsen" steht in Deinem Makro vor der Zeile "ergebnis = Kapital * ...". D.h. das Textfeld "Ausgabe_zinsen" enthält einen Leer-Wert in seiner Standard-Eigenschaft. Ein Leer-Wert lässt sich aber an eine Single-Variable (wie zB. "Zinsen") nicht zuweisen, das muss zwingend einen Type-Mismatch-Error (Nr.13) ergeben.
    Enthält das Textfeld (zB. "eingabe_kapital") einen Text, der aus einer Zahl besteht (zB. "1234,35"), so wird dieser Text automatisch in eine Single-Zahl konvertiert, sodass er in der Single-Variable "Kapital" gespeichert werden kann. Lässt Du jedoch dieses Textfeld "eingabe_kapital" leer (indem Du nichts eingibst im Formular), stehst Du vor dem gleichen Problem, das ich bereits beim Textfeld "ausgabe_zinsen" geschildert habe.
    Um das Problem mit der nicht implizit möglichen Leerwert-Konversion Richtung Single-Typ zu umgehen, habe ich die Zeile "On Error Resume Next" eingefügt. Tritt ein Fehler auf, bricht das Programm nicht ab, sondern die Programmausführung wird in der nächsten Zeile (bzw. nächsten Anweisung) fortgesetzt. Da alle numerischen Variablen beim Programmstart (Klicken des Buttons) auf 0 gesetzt werden, steht dann zB. in der Variablen "Kapital" eine 0, falls das Feld "eingabe_kapital" im Formular leer gelassen wurde.

    3) Du hast im Programm die Variable "ergebnis" verwendet, obwohl sie nicht durch eine "Dim"-Anweisung deklariert war. Dieses Manko wird vom VBA-Compiler automatisch entdeckt, wenn Du die Anweisung aus Punkt 1) einfügst.

    4) Eine weitere Heimtücke war enthalten im Ausdruck "(100 * 360)". Diese Stelle erzeugt den Fehler 6 (Überlauf). Das Ergebnis dieses Ausdrucks sollte 36000 sein; so wie der Ausdruck formuliert ist, ordnet der Compiler diesem Klammerausdruck automatisch den Typ Integer zu; dieser Typ kann aber positive Ganzzahlen nur bis maximal 32767 speichern und somit ist für 36000 kein Platz. Damit das nicht passiert, habe ich die Zahl 100 als Single-Konstante typisiert, indem ich das "!"-Zeichen als Typzeichen eingefügt habe (Du kannst auch das "&"-Zeichen verwenden - dann wird ein temporärer Long-Typ erzeugt, der jedoch vor der Division vom Compiler in einen Single-Typ umgewandelt werden muss).
    Eine mögliche Alternative wäre, dass Du die Klammern entfernst und 2 Divisionen mit dem "/"-Zeichen ausführen lässt statt der Division+Multiplikation.

    5) Damit die in der Variable "Zinsen" gespeicherten Zinsen ausgegeben werden im Formular, sind sie dem Textfeld "ausgabe_zinsen" als Wert zuzuweisen, eventuell indem sie vorher formatiert werden (mit nur 2 Nachkommastellen und Tausender-Punkt).

    6) Es wäre möglicherweise ratsam, statt der Single-Typen bei der Variablendeklariation den Typ Double zu verwenden; dadurch kann das Problem mit erzwungenen Rundungen (bei durchaus beträchtlichen Beträgen) vermieden werden.
     
    Exl121150, 13. Dezember 2009
    #2
  3. Farmer Erfahrener User
    Grandios :)

    Ich bin Dir wirklich sehr Dankbar für die Klasse Hilfestellung!

    Habe mir die Formel noch etwas gekürzt um das ganze zu verstehen und bin jetzt bei:

    Code:
    Option Explicit
    
    Private Sub CommandButton1_Click()
    
      Dim Kapital As Single
      Dim Zinssatz As Single
      Dim Tage As Single
      Dim Ergebnis As Single
      
      Kapital = eingabe_kapital
      Zinssatz = eingabe_zinssatz
      Tage = eingabe_tage
      
      Ergebnis = Kapital * Zinssatz * Tage / (100! * 360)
      
      
      ausgabe_zinsen = Ergebnis
    
        
    End Sub
    Klappt wirklich Prima aber kannst Du erklähren wie ich das ohne das Ausrufzeichen hinter 100 hin bekomme?

    bezug auf:
    Danke noch mal!!

    Werde Dich in meine Gebete einschließen :)


    Viele Grüße Farmer
     
  4. Exl121150 Erfahrener User

    vba neuling! wo ist mein fehler? :)

    Hallo,

    1. Möglichkeit:
    Code:
    Ergebnis = Kapital * Zinssatz * Tage / 100 / 360
    Der VBA-Compiler löst eine Formel von links nach rechts auf, es sei denn, er wird durch Klammern zu einer anderen Reihenfolge gezwungen.
    Er multipliziert zuerst Kapital und Zinssatz, beides sind Single-Typen, daher ist das Ergebnis auch wieder Single.
    Dieses Single-Zwischenergebnis multipliziert er mit Tage (die auch wieder Single sind), ergibt ein neuerliches Zwischenergebnis vom Typ Single.
    Dieses Single-Zwischenergebnis soll jetzt durch die Konstante 100 vom (impliziten) Typ Integer dividiert werden, was aber nicht so ohne weiteres geht; der Compiler wandelt die Integerzahl 100 in eine Single-Zahl 100,0! und führt jetzt die Division aus, die wieder ein Single-Zwischenergebnis ergibt.
    Und zu guter Letzt wird das eben Gesagte nochmals mit der Konstanten 360 ausgeführt.

    2.Möglichkeit:
    Code:
    Ergebnis = Kapital * Zinssatz * Tage / (100.0 * 360)
    In vorgenannter Formel habe ich etwas auf den ersten Blick völlig Überflüssiges getan: Ich habe die 100 mit .0 ergänzt. Aber dadurch kann der Compiler auch gezwungen werden, die 100 nicht als Integer-Typ zu interpretieren, sondern als Double-Typ, denn ein Ganzzahl-Typ kann nämlich niemals einen Kommapunkt (englische Schreibweise!!) besitzen.
    100.0 besitzt als den Typ Double (es sei denn, Du schreibst dahinter ein "!": dieses würde den Compiler zwingen, dennoch eine Single-Zahl zu produzieren), die Zahl 360 ist Integer, also wird sie vom Compiler in Double umgewandelt, dann erfolgt die Multiplikation, die auch wieder Double ergibt.
    Das Zwischenergebnis aus Kapital*Zinssatz*Tage war Single, dieses wird jetzt in Double umgewandelt, damit es zum Divisor, der Double ist, passt und danach die Division ausgeführt, die auch wieder Double ergibt.
    Da jedoch die Variable 'Ergebnis' vom Typ Single ist, muss das Double-Ergebnis nach Single konvertiert werden, um in dieser Variablen gespeichert werden zu können.

    Jetzt hast Du einen kleinen Einblick erhalten, was sich hinter den Kulissen einer simpel erscheinenden Formel so alles tut aus der Sicht des Compilers.

    Anmerkung:
    In BASIC gibt es die Möglichkeit, anstelle der normale Typ-Wörter (Integer, Long, Single, Double, Currency, String, ...) Typ-Symbole zu verwenden, die jedoch unmittelbar an den Variablennamen oder an die Konstante angefügt werden (ohne Leerzeichen dazwischen):
    % steht für Integer, & für Long, ! für Single, # für Double, @ für Currency und $ für String.
    Also wäre zB. 100@ ein Hunderter vom Typ Currency, 100# ein Hunderter vom Typ Double.
     
    Exl121150, 13. Dezember 2009
    #4
Thema:

vba neuling! wo ist mein fehler? :)

Die Seite wird geladen...
  1. vba neuling! wo ist mein fehler? :) - Similar Threads - vba neuling fehler

  2. VBA in einer Zeile zu lang

    in Microsoft Excel Hilfe
    VBA in einer Zeile zu lang: Moin, mein VBA Code ist für eine Zeile zu lang. Kann mir einer helfen wie ich den auf 2 Zeilen aufteilen Kann? arrSchuhDaten = Array(Range("A6"), Range("F6"), Range("J6"), Range("A7"),...
  3. Listbox wird nicht breiter, Schriftgrösse ändert sich

    in Microsoft Excel Hilfe
    Listbox wird nicht breiter, Schriftgrösse ändert sich: Hallo, ich habe ein Formular dessen Breite ich mit der Maus ändern kann. Im Formular habe ich einen Rahmen und darin eine Listbox deren Breite an die Formularbreite angepasst wird....
  4. Kontrollkästchen aktivieren ohne VBA - wenn KK1 angekreuzt dann KK2 auch

    in Microsoft Excel Hilfe
    Kontrollkästchen aktivieren ohne VBA - wenn KK1 angekreuzt dann KK2 auch: Hallo zusammen, erstmal danke für all die Tipps und Kniffe, die ich ohne eigenen Thread gefunden und gelernt habe. Leider finde ich mein Thema nirgendwo... Aktuell habe ich zwei Spalten mit...
  5. Per Hyperlink ausgeblendetes Blatt einblenden

    in Microsoft Excel Hilfe
    Per Hyperlink ausgeblendetes Blatt einblenden: Hola ins Forum, ich bräuchte mal wieder eure Hilfe. Ich habe ein Tabellenblatt das mir als Register dient und wo Hyperlinks eingefügt sind um auf das dazugehörige Blatt zu springen. Diese Blätter...
  6. Bilder über VBA Größe und DPI ändern für Webshop

    in Microsoft Excel Hilfe
    Bilder über VBA Größe und DPI ändern für Webshop: Hallo Excel Spezialisten, Ich habe mir eine recht aufwendige Tabelle gebastelt, aus der ich Daten für meinen Webshop generiere und in einer .csv bereitstelle. Es werden neue Preislisten...
  7. VBA: Platzhalter ersetzen und evtl. leere Zeile einfügen

    in Microsoft Word Hilfe
    VBA: Platzhalter ersetzen und evtl. leere Zeile einfügen: Hallo zusammen, ich habe eine Word-Vorlage mit Platzhaltern, in die ich mit VBA Daten aus einer Excel-Datei einfüge (in eine Excel-Zeile schreibe ich alle Daten für ein neues Word-Dokument). So...
  8. VBA Neuling- Suchfunktion

    in Microsoft Excel Hilfe
    VBA Neuling- Suchfunktion: Einen wunderschönen guten Morgen. Im Zuge eines Praktikums in meinen Physikstudium soll ich unter Anwendung der VBA Umgebung eine Suchfunktion schreiben. Sie macht eigentlich alles was sie soll....
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden