jobo: VBAs typenunverträglich - wie korrekt umgehen?

Hallo,

ein VBA-Skript soll Zellwerte addieren. Steht da mal ein Text drinne, soll das Programm stattdessen einfach eine Null setzen. Mit Val() schneide ich aber, wie ich grad merkte, auch bei Zahlen dann die Nachkommastellen weg (ist ja auch logisch, weil nur die Zahlen bis zum ersten Buchstaben ausgewertet werden).

GetActualAnzahl = actualAnzahlCell.Value
        If VarType(GetActualAnzahl) = 8 Then
            GetActualAnzahl = 0
        End If
        'nur wenn was in Spalte C steht
        If IsError(GetActualAnzahl) Then
            GetActualAnzahl = 0
        End If

bzw.

einnahme = ws.Range("E" & actualAnzahlCell.Row).Value
    If VarType(einnahme) = 8 Then
       einnahme = 0
    End If
    If VarType(einnahme) = 0 Then
       einnahme = 0
    End If

Ich habe es jetzt mit VarType() probiert, wobei ich da ja alles mögliche eigentlich eintragen müsste, weil Zahl kann zB. "2" oder auch "5" sein.

Wie mache ich es denn besser, gibt es eine Funktion, die egal was es ist konvertiert in eine Zahl (mit Komma)?

Gruß

jobo

  1. So ganz sauber klingt das nicht. Ich verwende ungern Funktionen die aus allem "irgendwas" machen.
    Ich würd prüfen obs wirklich ne Zahl ist, wenn ja dann nimms als Zahl, wenn nein dann verwende stattdessen 0. Die Funktionen kenn ich nicht, aber dafür gibts sicher irgendwas. Wär halt besser als eine einzige Funktion aufzurufen, die mit viel Glück tatsächlich das tut was du vielleicht und wahrscheinlich willst.

    1. Hallo,

      So ganz sauber klingt das nicht. Ich verwende ungern Funktionen die aus allem "irgendwas" machen.
      Ich würd prüfen obs wirklich ne Zahl ist, wenn ja dann nimms als Zahl, wenn nein dann verwende stattdessen 0. Die Funktionen kenn ich nicht, aber dafür gibts sicher irgendwas. Wär halt besser als eine einzige Funktion aufzurufen, die mit viel Glück tatsächlich das tut was du vielleicht und wahrscheinlich willst.

      Naja, so habe ich es ja jetzt eigentlich, wobei ich momentan nur den Typ "leer" (0) und "string" (8) teste. Eigentlich soll auch nischt anderes darin stehen, aber man weiß ja nie. Insofern will ich eigentlich umgekehrt eben fragen, wie du sagst: ist es eine Zahl (u.u. mit Kommastellen, da darf man natürlich keinen Typ auslassen) und wenn nicht, dann eben 0, damit es nicht zu Laufzeifehler 13 - typenunverträglich kommt.

      Gruß

      jobo

  2. Hello,

    hast du dir mal IsNumeric angesehen? Die sollte deine Aufgabe vereinfachen.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Wenn du die Nadel im Heuhaufen nicht findest, zünde den Heuhaufen an.
    1. Hallo,

      hast du dir mal IsNumeric angesehen? Die sollte deine Aufgabe vereinfachen.

      Oder lösen (;-).

      "IsNumeric gibt den Wert True zurück, wenn der gesamte Ausdruck als Zahl interpretiert werden kann, andernfalls wird False zurückgegeben."

      Gruß

      jobo

  3. Hi!

    [...] Nachkommastellen [...]
    [...] eine Zahl (mit Komma)?

    Ich lese immer "Komma". Bei der Verarbeitung von Zahlen ist es üblich, dass der Punkt die Dezimalstellen abgrenzt. Wenn du nach deutscher Manier ein Komma verwendest, musst du dieses per Stringerarbeitung zuerst durch einen Punkt ersetzen.

    Lo!

    1. Hi,

      Ich lese immer "Komma". Bei der Verarbeitung von Zahlen ist es üblich, dass der Punkt die Dezimalstellen abgrenzt. Wenn du nach deutscher Manier ein Komma verwendest, musst du dieses per Stringerarbeitung zuerst durch einen Punkt ersetzen.

      in einem Tabellenblatt einer deutschen Excel-Version?

      Wenn in A1 2,5 (mit Komma) steht, ergibt MsgBox Val(Range("A1")) 2. Da ist nichts mit Ersetzen. Anders sieht es natürlich aus, wenn Nachkommastellen im Code verwendet werden, da braucht man den Punkt.

      1. Hallo,

        Ich lese immer "Komma". Bei der Verarbeitung von Zahlen ist es üblich, dass der Punkt die Dezimalstellen abgrenzt. Wenn du nach deutscher Manier ein Komma verwendest, musst du dieses per Stringerarbeitung zuerst durch einen Punkt ersetzen.

        in einem Tabellenblatt einer deutschen Excel-Version?

        Wenn in A1 2,5 (mit Komma) steht, ergibt MsgBox Val(Range("A1")) 2.

        Ja, weil Val bis zum ersten String liest.

        a1 = Cells(1, 1).Value
        Debug.Print VarType(a1)
        Debug.Print a1 + 2

        aber gibt

        5
         4,5

        5 ist: "vbDouble 5 Fließkommawert doppelter Genauigkeit"

        4,5 = 2,5 + 2

        Gruß

        jobo