Microsoft Excel

Herbers Excel/VBA-Archiv

Dezimalzahl in FormulaR1C1 | Herbers Excel-Forum


Betrifft: Dezimalzahl in FormulaR1C1 von: Mario
Geschrieben am: 18.11.2009 11:13:30

Hallo!

Ich würde gerne eine Formel mit einer Konstanten in mehrere Zelle schreiben.
Die Konstante kann eine Dezimalzahl sein. Hier mein Code

Dim Preis 'As Double
Dim Gewicht ' As Double
Dim i As Byte

'
Preis = 1245.5
Gewicht = 15.45

' Spalte A == Anzahl

For i = 1 To 10
With ActiveSheet

.Cells(i, 2).FormulaR1C1 = "=RC[-1]*" & Preis
.Cells(i, 3).FormulaR1C1 = "=RC[-2]*" & Gewicht

End With

Next i

Kann mir jemand sagen, wieso das nicht funktioniert wenn meine Konstante eine Dezimalzahl ist? Bei einer ganzen Zahl geht es.

hab schon CStr(Preis) und CStr(Gewicht) probiert - geht nicht.

Verschiedene Variablendeklarationen (Currency, Long usw) haben auch nicht funktioniert - wo liegt mein Denkfehler???

Vielen Dank für die Hilfe!

Mario

  

Betrifft: AW: Dezimalzahl in FormulaR1C1 von: IngGi
Geschrieben am: 18.11.2009 11:29:28

Hallo Mario,

in VBA musst du den amerikanischen Dezimalpunkt an Stelle des deutschen Dezimalkommas verwenden. Oder du verwendest FormulaR1C1Local, dann gelten für die Formel die Regionaleinstellungen von Excel, bzw. des Betriebssystems.

Gruß Ingolf


  

Betrifft: AW: Dezimalzahl in FormulaR1C1 von: Mario
Geschrieben am: 18.11.2009 11:39:59

Hallo Ingolf,

danke für die schnelle Antwort.

Wenn ich den Code mit FormulaR1C1Local wie folgt (siehe unten) abändere bringt er mir trotzdem Laufzeitfehler 1004 in Zeile 50.

Ändere ich 1245.5 mit einem Komma in 1245,5 bringt er mir einen Kompilierungsfehler in Zeile 10.
Ich habe schon anstelle des Kommas einen Punkt verwendet.
Zur Info: Die Mappe soll später in verschiedenen Ländern (also Betriebssystemsprachen) laufen.

VBA (bzw. ich ;-) hab an der Stelle einfach ein Problem mit Dezimalzahlen.

Noch eine Idee wie der Code abzuändern ist???

Gruß

Mario

10 Preis = 1245.5
20 Gewicht = 15.5


30 For i = 1 To 10
40 With ActiveSheet
50 .Cells(i, 4).FormulaR1C1Local = "=RC[-1]*" & Preis
60 .Cells(i, 5).FormulaR1C1Local = "=RC[-2]*" & Gewicht
70 End With

80 Next i


  

Betrifft: AW: Dezimalzahl in FormulaR1C1 von: Björn B.
Geschrieben am: 18.11.2009 12:01:59

Hallo,

die variable als String definieren, zur Not über Hilfsvariable.
Bei Zuweisen der Formel dann das local weglassen.

Z.B. so:

Dim preis as string
preis = "1234.5"
ActiveSheet.Cells(1, 2).FormulaR1C1 = "=RC[-1]*" & Preis
Gruß
Björn


  

Betrifft: Das ist ja wohl ein Scherz! von: Mario
Geschrieben am: 18.11.2009 12:13:10

So sehr ich mich auch vor den Entwicklern von Excel verbeuge - machne Sachen sind absolut nicht nachvollziehbar... bzw. sehr umständlich...

Folgender Code funktioniert:

Dim Preis 'As String 'As Double
Dim Gewicht ' As Double
Dim i As Integer

'
10 Preis = 1298.454545
20 Gewicht = 15.4546

30 Preis = Replace(Preis, ",", ".")
40 Gewicht = Replace(Gewicht, ",", ".")

50 For i = 1 To 10
60 With ActiveSheet
70 .Cells(i, 4).FormulaR1C1 = "=RC[-1]*" & Preis
80 .Cells(i, 5).FormulaR1C1 = "=RC[-2]*" & Gewicht
90 End With

100 Next i

@Björn B: danke für den Hinweis. In meinem speziellen Fall wird die Kontante aus einer Datenbank gezogen.


  

Betrifft: AW: Das ist ja wohl ein Scherz! von: Daniel
Geschrieben am: 18.11.2009 23:32:03

Hi

da schlägt ein bisschen die Sprachverwirrung in VBA und Excel zu und dein etwas nachlässiger Umgang mit den verschiedenen Datentypen STRING und DOUBLE sowie deren Umwandlung.

die Markros schreibst du in VBA und das spricht englich, also musst du im Code den Dezimalpunkt verwenden.
Wenn du jetzt aber einer Variablen eine Zahl zugewiesen hast, dann wird diese vom Deutschen Excelkern verwaltet und hat jetzt das Komma als Dezimalzeichen.

Wenn du jetzt diese Zahl wieder in einen String umwandelst, dann wird auch das Komma in den String übernommen (Excel spricht ja deutsch mit dir).
Allerdings kannst du jetzt diesen String nicht in der VBA-Programmierung verwenden, da du in VBA ja den Englischen Punkt brauchst.
Also hilft dir nur die Replace-Funktion.

Gruß, Daniel


  

Betrifft: AW: Das ist ja wohl ein Scherz! von: Mario
Geschrieben am: 19.11.2009 17:09:21

Hi Daniel,



sowas in die Richtung hab ich mir ja schon gedacht. Mein "nachlässiger" Umgang war auskommentiert (siehe Hochkomma - war ein Test...) somit verwendet VBA den Typ Variant und sucht sich den Datentyp selbst. Tut also nix zur Sache.



Finde die Lösung trotzdem bescheuert. Das bedeutet nämlich, dass wenn ich den Code auf nem englischen Rechner schreibe und eventuell auf einem deutschen ausführen will, es zu einem Fehler kommt.



Das darf meiner Meinung nicht passieren. Die Zeile 30+40 muss Excel meines Erachtens selbst erledigen insbesondere wenn "Preis" und "Gewicht" als Dezimalvariablen deklariert sind (As Double).



Beste Grüsse

Mario


  

Betrifft: AW: Das ist ja wohl ein Scherz! von: Daniel
Geschrieben am: 21.11.2009 14:33:15

Hi
naja, die verwendung von VARIANT ist meiner ansicht nach nachlässiger Umgang mit den Variablentypen, außerdem ist oft nicht notwendig, VARIANT zu verwenden, da VBA sowieso das kombinieren verschiedener Datentypen zulässt, falls es möglich ist (dh. VBA selbst ist in dieser Beziehung nachlässig)
der Vorteil ist allerdings, daß die Programmierung in vielen Fällen einfacher wird, da man selbst nicht umwandeln muss.

nochmal zum Problem:
mit der Replace-Methode sollte es beim Einsatz in verschiedenen Sprachversionen kein Problem geben.
arbeitest du mit der deutschen Variante, wird das Komma in einen Punkt gewandelt, verwendest du die englische version, dann hast du den Punkt ja sowieso drin und die Replace-Funktion läuft halt durch, ohne was machen zu müssen.

gruß, Daniel