Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1052to1056
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

Format und Str klauen Punkte

Format und Str klauen Punkte
28.02.2009 01:55:44
Reinhard
Hallo Wissende,
ich sah Format() bislang noch nie in Codes ohne daß da außer dem zu formatierenden Term weitere Parameter angegeben waren.
Nun fragte jmd woanders nach warum sein Code nicht läuft. Und er hatte im Code quasi
x=format(y), okay das problem lag woanders, konnte man auch lösen.
Das hat mich neugierig gemacht, so las ich doch mal die Hilfe zu Format durch und bastelte für mich den nachstehenden Code.
Mit dem Dezimaltrennzeichen ind dem Vorzeichenbyte ist ja okay.
Was ich gar nicht verstehe ist der untere Teil des Codes. Wieso schmeißen sowohl Str als auch Format die Punkte raus?
Wieso wird durch Str("27.2.2009") dann 2722009 ?
Ich hab derzeit nur Excel97, ist das ein alter Bug der in höheren Versionen nicht mehr auftritt?
Man seht auskommentiert was angezeigt wird wenn ich den Code laufen lasse.

Sub tt()
Dim a
a = 5.5
MsgBox Len(Format(a))      '3
MsgBox Len(Str(a))         '4
MsgBox Format(a)           '5,5
MsgBox Str(a)              '5.5
a = "27.2.2009"
MsgBox Format(a)           '2722009
MsgBox Str(a)              '2722009
End Sub


Danke ^ Gruß
Reinhard

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

Betreff
Datum
Anwender
Anzeige
AW: Format und Str klauen Punkte
28.02.2009 07:12:34
Tino
Hallo,
also dies ist kein Bug, die Str Funktion erwartet einen Wert vom Typ Long.
Dazu wichtige Ausschnitte aus der Hilfe
Das erforderliche Argument Zahl ist ein Wert vom Typ Long, der einen beliebigen numerischen Ausdruck enthält.
Die Str-Funktion erkennt nur den Punkt (.) als zulässiges Dezimalzeichen. Wenn die Möglichkeit zur Verwendung eines anderen Dezimalzeichens bestehen muß (zum Beispiel in internationalen Anwendungen), sollten Sie Zahlen mit der CStr-Funktion in eine Zeichenfolge umwandeln.
Er macht also aus a = "27.2.2009", den Long Wert 2722009
Er macht also aus a = "07.2.2009", den Long Wert 722009
Gruß Tino
Anzeige
Anmerkung
28.02.2009 07:28:26
Tino
Hallo,
bei String- Zahlen (keine normalen Zahlen), kommt es auch auf die Ländereinstellung an.
Wie bei mir alles auf Deutsch, muss in einem String, Komma verwendet werden.
Bei anderen Einstellungen wo der Punkt als Dezimaltrennzeichen verwendet wird,
muss im String auch der Punkt verwendet werden.
Wird dies nicht beachtet, wird dass Dezimaltrennzeichen einfach ignoriert.
Gruß Tino
was ich auch nicht verstehe,...
28.02.2009 08:09:08
Tino
Hallo,
...wenn die Str Funktion einen Wert vom Typ Long erwartet,
warum er überhaupt Zahlen mit Nachkommastellen verarbeiten kann.
Long ist doch eigentlich eine Ganzzahl und hat keine Nachkommastellen,
daher denke ich es ist ein Schreibfehler und müsste wahrscheinlich so geschrieben werden.
Das erforderliche Argument Zahl ist ein Wert vom Typ Double oder Single,
der einen beliebigen numerischen Ausdruck enthält.
Ich lass die Frage mal offen, vielleicht kennt sich damit einer noch besser aus.
Gruß Tino
Anzeige
AW: automatische Konvertierung
28.02.2009 09:46:38
Erich
Hi Reinhard und Tino,
schaut euch das mal an:

Sub atst()
MsgBox Str("22.02.2009") & vbLf & _
Str(CLng("22.02.2009"))
MsgBox Day("22.02.2009") & vbLf & _
Day(DateValue("22.02.2009"))
End Sub

Day() erwartet als Parameter ein Date - daher wird der String in ein Date umgewandelt.
Analog erwartet Str() ein Long, dann macht VBA aus dem Parameter eben erst mal ein Long.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

AW: automatische Konvertierung
28.02.2009 10:08:12
Tino
Hallo,
das ist schon für mich verständlich. ;-)
Was für mich nicht verständlich ist, wenn Str einen wert vom Typ Long erwartet,
warum akzeptiert er auch einen wert vom Typ Double?
MsgBox Str(1.55555555555556)
Gruß Tino
Anzeige
AW: automatische Konvertierung
28.02.2009 10:30:34
Erich
Hi Tino,
bevor die Fkt. Str tatsächlich aufgerufen wird, wird der Parameter in den dafür erforderlichen Datentyp umgewandelt.
Vielleicht wird das am Beispiel einer eigenen Fkt. klar,
die ein Long als Parameter erwartet:

Sub atst()
MsgBox 3.9 * 1.1
MsgBox MalEinsKommaEins(3.9) ' 3.9 wird zu Long
MsgBox CLng(3.9)
MsgBox MalEinsKommaEins(4)
End Sub
Function MalEinsKommaEins(lngZ As Long) As Double
MalEinsKommaEins = 1.1 * lngZ
End Function

Bei der Vorbereitung des Aufrufs (macht VBA) dem Aufruf wird der Parameter in Long konvertiert,
in der Fkt. kommt nur ein Long an.
Mit Str ist das nicht anders.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: automatische Konvertierung
28.02.2009 10:36:42
Tino
Hallo,
"..in der Fkt. kommt nur ein Long an. Mit Str ist das nicht anders..."
Demnach müsste der Rückgabewert von Str auch Long sein, dem ist aber nicht so.
MsgBox CLng(3.9)
MsgBox Str(3.9)
Gruß Tino
AW: automatische Konvertierung
28.02.2009 10:52:15
Tino
Hallo,
"Demnach müsste der Rückgabewert von Str auch Long sein"
Ist natürlich Quatsch, Rückgabe ist ein String.
Aber der Wert müsste dennoch zuvor Long werden und danach als Rückgabe ein String werden,
also dürfte kein wert mit Nachkomma entstehen.
Oder verstehe ich das falsch.
Gruß Tino
AW: automatische Konvertierung
28.02.2009 11:27:24
Erich
Hi Tino,
zumindest einen Satz in der VBA-Hilfe zu Str halte ich für Unfug:

Str(Zahl)
Das erforderliche Argument Zahl ist ein Wert vom Typ Long, der einen beliebigen numerischen Ausdruck enthält.


"Long" halte ich für falsch. Und wie könnte ein Wert einen beliebigen numerischen Ausdruck enthalten?
Str wandelt Double-Zahlen in Strings um. Beispiel:


Sub a()
Dim strT As String
strT = Str(2# / 3)
MsgBox Len(strT) & " / " & strT
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: automatische Konvertierung
28.02.2009 11:42:54
Tino
Hallo,
demnach war diese Vermutung nicht weit weg.
https://www.herber.de/forum/messages/1054989.html
Ich behaupte, Str macht aus dem Wert Double und gibt als Rückgabe einen String.
Also müsste der Hilfetext so lauten

Das erforderliche Argument Zahl ist ein Wert vom Typ Double,
der einen beliebigen numerischen Ausdruck enthält.


Die Frage ist nun noch was ist ein "beliebiger numerischischer Ausdruck"
Ein beliebiger numerischer Ausdruck ist bei mir ein Wert vom Typ Double.
Also:


Das erforderliche Argument ist ein beliebiger numerischer Wert.


Gruß Tino

Anzeige
AW: Wer lesen kann...
28.02.2009 11:59:41
Erich
Hi Tino,
... ist klar im Vorteil!
Ich war zunächst auf dem falschen Dampfer. Dann bin ich umgestiegen und habe nicht gemerkt,
dass du schon der Käpt'n auf dem richtigen Dampfer bist.
Ich hätte deinen Beitrag einfach besser lesen sollen. Wir sind uns ja völlig einig.
Grüße von Erich aus Kamp-Lintfort und: Schönes Wochenende!
@Erich
28.02.2009 12:04:10
Tino
Hallo,
wir können uns ja mal bei Bill bewerben und ihm etwas unter die Arme greifen. ;-)
Wünsche Dir auch ein schönes Wochenende.
Gruß Tino
Dezimaltrennzeichen bei csv per Registry
28.02.2009 19:03:35
Reinhard
Dankeschön erstmal für alle Antworten,
ich habe es gerade erstmal überflogen und muß das nochmal in Ruhe durchgehen.
Passend zum Thema Dezimaltrennzeichen stieß ich vor Tagen bei der Recherche nach etwas absolut anderem auf den nachfolgenden Link wo u.A. dieses steht:
*************************************************************************************
Damit das Einlesen einer CSV- Datei wie oben beschrieben mit dem angegebenen Semikolon als
Trennzeichen funktioniert, kann man bei Excel97, Excedl2000 und Excel2002 durch das Einfügen eines
DWORD Namens VBAAlwaysLoadUS (Wert = 0) in der Registry unter
HKCU\Software\Microsoft\Office\9.0\Excel\Options
*************************************************************************************
Quelle: http://www.supportnet.de/fresh/2005/9/id1158805.asp
Da ich hier in Jahren noch nie einen Hinweis auf diesen Registry-Eintrag sah mutmaße ich das klappt nicht oder es kennt keiner. Probiert habe ich es noch nicht.
Ich stelle die Frage auf noch offen damit sie eher gefunden wird nicht weil ich dazu noch etwass wissen will, das kommt ggfs. erst wenn ich den Registry-Eintrag getestet habe :-).
Schönes WE wünscht
Reinhard
Anzeige
AW: Dezimaltrennzeichen bei csv per Registry
28.02.2009 19:55:13
Tino
Hallo,
ich kenne dies mit der Registrierung so.
Beispiel:
Option Explicit

'Reg. vor einlesen Bearbeiten **************************************************** 
Sub Registrierung_Aendern()
Dim MerkRegEinstellung As String

'leser der Reg.- einstellung, um diese wieder zurücksetzen zu können 
MerkRegEinstellung = RegLesen

Call Registrierung_Bearbeiten("TabDelimited")      'entsprechenden Wert übergeben 
    
        'Datei einlesen 
        '... 
        '... 

Call Registrierung_Bearbeiten(MerkRegEinstellung)  'Zustand wieder herstellen 
End Sub

'Lesen der Registrierung ********************************************************** 
Private Function RegLesen() As String
Dim objShell As Object
Dim sRegName As String
Set objShell = CreateObject("WScript.Shell")
    sRegName = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text\Format"
    RegLesen = objShell.RegRead(sRegName)
End Function



'Registrierung bearbeiten ********************************************************* 
Sub Registrierung_Bearbeiten(strValue$)
Dim strComputer$, strKeyPath$, strValueName$
Dim objReg As Object
Const HKEY_LOCAL_MACHINE = &H80000002
    
    strComputer = "."
    Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
    strKeyPath = "SOFTWARE\Microsoft\Jet\4.0\Engines\Text"
    strValueName = "Format"
    strValue = strValue
    objReg.SetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue

End Sub


Es gibt aber auch noch die Möglichkeit über Schema.ini zu arbeiten und
die Registrierung ganz in Ruhe lassen oder auch wenn man keinen Zugriff auf die Reg. Hat.
Bei Gelegenheit werde ich mir den Link von Dir näher anschauen.
Ich lass Deinen Beitrag für die anderen offen.
Gruß Tino und ein schönes Wochenende an alle

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige