Anzeige
Archiv - Navigation
1184to1188
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

Hilf = Split(Hilf, "-")(0)

Hilf = Split(Hilf, "-")(0)
ing.grohn
Hallo Forum,
warum muß die (0) hinter Split
Hilf = Split(Hilf, "-")(0)
ohne erhalte ich Fehlermeldung Type unverträglich
van harten bedankt
Mit freundlichen Grüßen
Albrecht

41
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Hilf = Split(Hilf, "-")(0)
Rudi
Hallo,
Split macht aus dem String ein eindimensionales, nullbasiertes Array.
Hilf="aa-bb-cc"
Hilf=Split(Hilf,"-")
ergibt
Hilf(0)="aa"
Hilf(1)="bb"
Hilf(2)="cc"
Gruß
Rudi
AW: Hilf = Split(Hilf, "-")(0)
ing.grohn
Hallo Rudi,
alles klar auf ...
Vielen Dank
Albrecht
...und die Fehlermeldung wird vermieden,...
Luc:-?
…wenn Hilf As Variant (bzw ohne Typbezeichnung) deklariert wurde, Albrecht.
Denn, was Split erzeugt ist kein gewöhnliches Feld, sondern ein Variant mit einem Horizontalvektorfeld, dessen Elemente ebenfalls vom Typ Variant sind. 1dimensionale Vektorfelder sind immer horizontal und können nur so, mittels Zuweisung (Let) oder durch direkte Deklaration und Elementezuweisung hergestellt wdn. Senkrechte Vektorfelder sind dahingg ebenso wie alle Zellbereiche stets 2dimensional angelegt, egal ob nur 1Zeile, 1Spalte (Vektor) oder m Zeilen X n Spalten (Matrix).
Gruß Luc :-?
Anzeige
AW: ...und die Fehlermeldung wird vermieden,...
ing.grohn
Hallo Luc,
das meiste hab ich verstanden (steht eigentlich auch in der Hilfe!!, na ja, genaues lesen?)
Aber warum die Festlegung auf "Horizontal" und "Vertikal".
Bei eindimensional ist es dem Index doch egal ob er von oben nach unten oder von links nach rechts läuft
Ist das nicht nur ne Sichtweise
Ich muß mir bei mehreren Dimensionen immer klar sein, welcher Index gemeint ist (Matrix(a,b,c))
Die Richtung ist doch sekundär (oder?)
Mit freundlichen Grüßen
Albrecht
Nicht für Xl/VBA, denn wie gesagt,...
Luc:-?
…Albrecht,
ein horizontales Vektorfeld ist 1-, ein senkrechtes 2-dimensional, d.h., du hast 1 Dimension mehr, die berücksichtigt wdn muss, auch, wenn sie =1|0 ist. Damit das nicht so oft ins Auge geht, ist das so geregelt, dass der einzige Index im horizontalen Vektorfeld [L/UBound(vektor) bzw L/UBound(vektor, 1)] über die Spalten variiert, während das im vertikalen Vektorfeld der 2.Index besorgt [L/UBound(vektor, 2)] — der 1. variiert dann über die Zeilen. Zu beachten ist weiterhin, dass ein normales VertikalVektorfeld (i, j) indexiert wird, ein Variant mit einem solchen Feld aber (i)(j) [j=0|1]! Außerdem könnten die Elemente eines solchen Variants auch aus Matrizen bestehen, die dann (i)(j, k)* indexiert wdn müssen. D.h., es können Mischformen generiert wdn, indem ein Feld vom Typ Variant deklariert wird, dessen Elementen dann ganze Matrizen zugewiesen wdn. Da muss man schon aufpassen, wenn man solchen Elementen dann VertikalVektorfelder zuweist [(i)(j, 0|1)], sonst kann einen so etwas an den Rand der Verzweiflung bringen… ;-)
Gruß Luc :-?
* Matrizen in Matrizen sollten auch mögl sein (i, j)(k, l). Außerdem kann VBA bis zu 60 Dimensionen verkraften! Das so etwas nicht von udFktt zurückgegeben, geschweige denn im TabBlatt abgebildet wdn kann, versteht sich wohl von selbst. Das gilt für alle Tensoren, auch die 3dimensionalen. Bei 2 Dimensionen (Matrix) ist Schluss. Wenn ein in den Elementen Matrizen enthaltender Vektor nur aus 1 Element besteht, kann er noch abgebildet wdn. Ab 2 Elementen nicht mehr! Des weiteren gibt's hier etliche xl- nicht unbedingt vb-Limitierungen, je nachdem wie das Feld zustande kommt bzw weiterverarbeitet wdn soll. Ziemlich starke Einschränkungen gelten für etliche feldverarbeitende Fktt wie bspw MMULT und für Matrixkonstanten. Auch die Limitierung von Textargumenten von udFktt (XL/VBA-Beschränkung), aus denen man ja per Split Felder machen könnte, auf 255 Zeichen ist äußerst lästig. Ab Xl12 wurden diese Beschränkungen nicht aufgehoben, sondern nur erweitert, was verständl wird, wenn man zusehen muss, wie sich die CPU mit einem maximal großen Feld bei MMULT quälen muss (zu hoher Rechenaufwand - nur was für HiTec-Hardware!).
Anzeige
AW: ist ja fast ne Mathe-Vorlesung...
ing.grohn
..die Du mir da gegeben hast!
ich werde das in Ruhe durchdenken!
Vielen Dank für die Ausfürlichkeit!
Was so (0) alles bewirkt.
einen schönen weiteren Tag wünscht
Albrecht
Split ist String nicht Variant, glaube ich oT.
Tino
Split ist eine vbFkt, Tino...! :-)) Gruß owT
Luc:-?
:-?
ja, und? ...
Tino
Hallo,
Expression erwartet einen String oder versucht diesen in einen umzuwandeln.
Die Function Split gibt immer ein Array vom Typ String zurück und ist auch ein Element von VBA.Strings, also denke ich dass diese Funktion kein Variant zurückgibt. 'denke ich ;-)'
Gruß Tino
AW: ja, nein, ja ...
Gerd
Guten Abend,
die Split-Funktion gibt einen Variant (eindimensionales Array) vom Typ String zurück; String rein, Strings raus.
Gruß Gerd
Anzeige
Das ist richtig, Gerd! Insofern darf ich...
Luc:-?
…präzisieren, dass die gesplitteten Feldelemente sogar immer vom Untertyp String sind, egal welchen Typ bzw Untertyp das Argument hatte. Eine Fehlermeldung tritt dann auf, wenn der ganze feldenthaltende Variant einer Operation unterzogen wird, für die unter VBA nur Einzelwerte zulässig sind. Da gibt's einen immensen Unterschied zu Xl!
Meine Antwort bezog sich ironisierend auf deine sinnentstellend verkürzte Formulierung, Tino… ;->
Gruß Luc :-?
was habt ihr nur mit Variant
Tino
Hallo,
bei mir spuckt er String() aus.
Debug.Print TypeName(Split("a,b,c", ","))
Gruß Tino
Das ist der Untertyp,...
Luc:-?
…Tino,
versuch's mal mit VarType! Außerdem ist mit Variant der ganze Ausdruck gemeint. Es gibt in VBA nämlich grdsätzl 2 konzeptionell verschiedene Feldtypen. Da eine Variable vom Typ Variant alles Mögliche enthalten kann, ist es nur folgerichtig, dass das ggf auch ein Datenfeld ist. Das wäre dann der hier vorliegende 2.Feldtyp. Aber das steht auch alles in der VBE-Hilfe, wo du es nachlesen kannst, so du es findest… ;-)
Gruß+schöWE, Luc :-?
Anzeige
Ich denke ich liege richtig.
Tino
Hallo,
was in der Hilfe steht hinterfrage ich schon länger und glaube nicht gleich alles was in der Hilfe steht.
Mit TypeName bekommst Du gezeigt von welchem Typ dieses Array ist und ein String Array kann niemals richtige Zahlen enthalten.
Dies wird Dir auch gezeigt wenn Du Split an eine Variable vom Typ Variant übergibst (wie es in der Regel gehandhabt wird),
diese Variable wird zu einem String Array, daher Du kannst in diesem angeblichen Variant Datenfeld nichts umwandeln.
Somit könntest Du diese Variable auch gleich z. Bsp. Dim vntDatenfeld() As String deklarieren,
dies macht keinen Unterschied außer das dieses nicht extra umgewandelt werden muss wenn es von Split das Datenfeld übergeben bekommt.
Mit TypName + vbString wird Dir auch das gleiche gezeigt, es ist ein Array vom Typ String und nicht Variant.
Aber egal lassen wir es an dieser stelle gut sein.
@Albrecht
Das Du diese Textzahlen in Excel als richtige Zahl angezeigt bekommst ist Excel zu verdanken,
Excel denkt in diesem Fall für dich mit und übernimmt die Umwandlung.
Gruß Tino
Anzeige
Scheinst mir ein eigensinniger Querkopf zu...
Luc:-?
…sein, Tino,
der das nicht begreifen will! Aber lassen wir das! :->>
Deine Bemerkung für Albrecht trifft auch nicht den Kern der Sache — XL wandelt gar nichts um! Außerdem wäre hierfür in diesem Fall auch VBA zuständig. Du scheinst mir nicht nur der VBE-Hilfe nicht zu trauen, sondern überhpt niemandem! Dann musst du halt alle (negativen) Erfahrungen selber machen! :-<<
Luc :-?
mir kann man halt nicht alles auftischen ;-)
Tino
Hallo,
auf jedem Fall ist bei mir String kein Variant und Zauberei ist es auch nicht das aus einem Text eine Zahl oder sogar ein Datum wird.
Gruß Tino
ein weiteres Beispiel...
Tino
Hallo,
wenn es wie von Dir felsenfest behauptet ein Variant Array ist,
sollte es mir gelingen die einzelnen Fächer in eine Zahl zu verwandeln.
Dim varVariant
varVariant = Split("12,9", ",")
varVariant(0) = CLng(varVariant(0))
varVariant(1) = CLng(varVariant(1))
MsgBox varVariant(0) > varVariant(1)
Nein gelingt mir nicht, weil es ein Array vom Typ String ist,
zugleich zeigt es auch das VBA da mit Sicherheit nichts automatisch umwandelt
sondern dies auch als Text behandelt und was passieren kann wenn man glaubt es wäre Variant.
Bei einem Array vom Typ Variant kann ich diese umwandeln.
Dim varVariant
varVariant = Array("12", "9")
varVariant(0) = CLng(varVariant(0))
varVariant(1) = CLng(varVariant(1))
MsgBox varVariant(0) > varVariant(1)
Gruß Tino
Anzeige
AW: Split-Funktion
Gerd
Hallo Tino,
was die Auswertungsmöglichkeiten betrifft, ist alles richtig, was Du beschreibst.
Das ist in seiner Struktur ein "kastrierter" Variant. MS hat den Rückgabetyp String/String so festgelegt, damit Du in die Split-Funktion keine Steuerelemente oder andere Objekte reinschüttest. :-)
Und ein Datenfeld (oder engl. Array) mit dem selben Verhalten, kann ein Benutzer nicht nachbauen.
Leider müssen wir die Rückgabewerte erst in einen selbst deklarierten Variant einlesen, um die
Items aus der Split-Funktion konvertieren zu können, wenn Ziffern drin stehen.
Gruß Gerd
Anzeige
wie meinst Du ...
Tino
Hallo,
"Und ein Datenfeld (oder engl. Array) mit dem selben Verhalten, kann ein Benutzer nicht nachbauen."
Wenn ich doch ein Array als String Deklariere, habe ich genau dieses Verhalten.
Ich kann auch die Rückgabe an ein solches Array übergeben weil es ja auch ein solches ist.
An ein Array vom Typ Variant geht dies nicht, weil ein Array nicht umgewandelt werden kann.
'bringt Fehler
'varArray kann nicht umgewandelt werden in ein Array vom Typ String
Dim varArray() As Variant
varArray = Split("1.2.5", ".")
'strArray ist der gleiche Typ,
'daher kann ich dies auch übergeben
Dim strArray() As String
strArray = Split("1.2.5", ".")
Gruß Tino
Anzeige
Du scheinst es wirklich nicht zu begreifen,...
Luc:-?
…Tino,
ein Variant, der ein Datenfeld aus Elementen eines beliebigen Untertyps enthält, ist konzeptionell etwas anderes als ein Datenfeld aus Elementen des Typs Variant, auch wenn er bzw seine Elemente auf analoge Weise angesprochen wdn kann (können). So etwas kannst du auch nicht durch elementweise Zuweisung erzeugen, da hat Gerd völlig recht, aber mit Split oder durch direkte Zuweisung eines solchen Variants an eine Variable vom Typ Variant. Da Split als Argument einen String verlangt, wird ein Argument beliebigen, kompatiblen Typs automatisch in einen solchen umgewandelt. Und die Elemente sind dann nach dem Split ebenfalls Strings und können nur per Zuweisung an eine neue Variable einzeln in etwas Anderes umgewandelt wdn.
Insofern musst du der VBE-Hilfe schon trauen, denn es geht um die VB(A)-Konzeption. Der Entwickler wird doch wohl wissen, was er da umgesetzt hat! Ihm zu unterstellen, er kenne sein eigenes Produkt nicht, ist ja wohl ziemlich… Bei XL ist das was anderes. Das ist wohl mal zugekauft worden. Deshalb sind wohl auch die erst später hinzugefügten Fktt mitunter deutlich leistungs­schwächer als die ursprünglich vorhandenen. An das Original-Matrix-Konzept gehen die MS-Pgmierer offensichtl nicht so gern ran…!
Gruß Luc :-?
Anzeige
was ein Quatsch...
Tino
Hallo,
überlege mal selbst, wie kann aus einem Variant() automatisch ein String() werden,
Du kannst den Typ einer Matrix nicht ändern einmal Variant() bleibt Variant() und String() bleibt String().
Den Zaubertrick musst Du mir zeigen, bin mal gespannt. ;-)
Gruß Tino
Meinetwegen kannst du ja glauben was...
Luc:-?
…du willst, Tino,
auch das die Erde 'ne Scheibe ist und die Sonne sich um sie dreht — nur recht hast du damit nicht, auch, wenn der Augenschein dafür spricht… :->>
Jedenfalls hast du dich mit deinen Auslassungen als unbelehrbar borniert geoutet → was nicht sein kann, das nicht sein darf
Luc :-?
dann überzeuge mich mit einem Beispiel...
Tino
Hallo,
wie Du den Zaubertrick anwendest um den ich badeten habe.
Einen klitzekleinen Beweis das Split ein Array vom Typ Variant zurückgibt und dessen Elemente auch Variant sind (so waren Deine Worte), dass es ein Array vom Typ String ist habe ich ja nun zu genüge nachgewiesen.
Mach Dir die Mühe nicht, Du kannst es nicht nachweisen weil es einfach nicht so ist.
Gruß Tino
Das hast du völlig fehl interpretiert,...
Luc:-?
…Tino;
was Gerd und ich dir jetzt schon seit x Threads sagen, ist, dass Split einen Variant, also so etwas wie einen Container, zurück gibt, der in diesem Fall ein Feld enthält, dessen Elemente vom Variant-Untertyp String sind. Nur den Untertyp kannst du nachweisen, alles andere musst du akzeptieren wie es der Entwickler erklärt! Wenn dir das auf Grund einer gewissen Ver­bohrtheit nicht möglich ist, hast du halt Pech gehabt. Das ändert aber nichts an den Tatsachen!
Ein Variant kann bekanntlich alles mögliche enthalten, auch Objekte und wahrscheinl auch Objektfelder wie ShapeRanges u.ä.
Wenn MS also schreibt, dass ein Variant, der ein Feld (Array) enthält, konzeptionell etwas Anderes ist als ein Feld vom Typ Variant, dann ist das von dir zu akzeptieren, denn nicht du hast diese Konzeption gemacht! Und Split erzeugt solch einen Variant — oder kannst du mir einen String zeigen, der ein Feld enthält…? :->
Es ist einfach nicht anders möglich, weil „normale“ Arrays nur mit entsprechender Deklaration und per Einzel­element­wert­zuweisung belegt wdn können. Wenn ich nicht irre, kann man solch einen Variant auch per vbFkt Array erzeugen. Kennzeichen für das Vorliegen eines solchen ist stets die dimensionslose Deklaration und die etwas andere Art der Indexie­rung ab der 2.Dimension, nämlich varFeld(i)(j) statt strFeld(i, j).
Gruß Luc :-?
hast Du jetzt Deine Meinung geändert?
Tino
Hallo,
na oben hast Du es aber noch anders geschrieben, oder hab ich Dich endlich überzeugt.
Zitat:
was Split erzeugt ist kein gewöhnliches Feld,
sondern ein Variant mit einem Horizontalvektorfeld, dessen Elemente ebenfalls vom Typ Variant sind

Natürlich ist die Funktion ein Variant aber was ich zurückbekomme
(davon und nicht anderes habe ich geschrieben, dem Rückgabewert) ist ein Array vom Typ String und nur dies ist Maßgeblich,
was Du dann noch dem Variant anfangen willst ist mir schleierhaft oder für mich so wichtig wie wenn in China ein Sack Reis umfällt ;-)
Gruß Tino
Du beweist immer wieder, dass du das...
Luc:-?
…Konzept nicht verstehst, Tino;
Sicher hatte ich das am Anfang geschrieben, aber längst präzisiert. Was du da immer feststellst, ist der Untertyp des Variants. Ob die Elemente nun vom Variant-Untertyp String oder gleich vom Typ String sind, wird man evtl gar nicht unterscheiden können.
Zitat: Natürlich ist die Funktion ein Variant aber was ich zurück bekomme (…Rückgabewert) ist ein Array vom Typ String
Und genau das ist falsch! Abgesehen davon, dass eine Fkt kein Variant sein kann, sondern nur ihr Ergebnis bzw ihre Argumente, ist das, was du zurück bekommst, das Ergebnis bzw der Rückgabewert, tatsächlich ein Variant, der ein Feld aus Elementen des Typs oder Variant-Untertyps String enthält. Das ist so definiert, damit auch alle über das Gleiche reden können und nicht aneinander vorbei. Aber eine solche, in Wissenschaft & Technik übliche, wenn auch nicht immer konsequent umgesetzte Verfahrensweise scheint dir ja fremd zu sein. So hat sich meinem Verständnis auch nicht die Aussage deines letzten Satzes vollends erschlossen… :->
Gruß Luc :-?
PS: Auf Grund dieser Diskussion habe ich mich dazu hinreißen lassen, zur Lösung einer bestimmten Aufgabe extra einen Variant, der ein Feld enthält, dessen Elemente ebenfalls aus Variants bestehen, die Felder enthalten, zu erzeugen…
noch ein Beispiel, dann ist wirklich Schluss
Tino
Hallo,
die Funktion gibt ein Array vom Typ String zurück und nicht Variant.
Der Typ wird nicht durch die Funktion oder durch die Daten die ich an diese übergebe bestimmt sondern durch die Matrix strArray() in der Funktion die in diesem Beispiel ein String ist.
Sub Beispiel()
Dim varVariable
varVariable = MeineFunction(1, 2, 3, 4)
End Sub
Function MeineFunction(ParamArray Daten())
Dim strArray() As String, nCount&
ReDim strArray(LBound(Daten) To UBound(Daten))
For nCount = LBound(Daten) To UBound(Daten)
strArray(nCount) = Daten(nCount)
Next nCount
MeineFunction = strArray
End Function
So nun machen wir aber wirklich Schluss,
wenn die Rückgabe für Dich ein Variant ist dann soll es halt so sein.
Gruß Tino
AW: In der Praxis klemmt 's ja nicht!
Gerd
Hallo Tino,
ich auch. :-)
Sub test()
Dim varVariant
varVariant = Split("12,9", ",")
varVariant(0) = CLng(varVariant(0))
varVariant(1) = CLng(varVariant(1))
MsgBox varVariant(0) > varVariant(1)
Dim varBenDef As Variant
ReDim varBenDef(UBound(varVariant))
varBenDef(0) = CLng(varVariant(0))
varBenDef(1) = CLng(varVariant(1))
MsgBox varBenDef(0) > varBenDef(1)
End Sub
Gruß Gerd
AW: ja, nein, ja ...
ing.grohn
Hallo Gerd, Luc, Tino
noch mal zu Split und String oder Variant ein Beispiel:
Sub TestSplit()
Dim Feld
Dim i As Integer
Dim k As Integer
'Feld = Split(Cells(4, 3).Value, "!")
Feld = Split("abc:111:abcd:defgh:1234:rrttzzz:20", ":")
k = UBound(Feld)
For i = 0 To k
If IsNumeric(Feld(i)) Then
Debug.Print "Zahl  " & Feld(i)
Else
Debug.Print "Text  " & Feld(i)
End If
Cells(i + 5, 3).Value = Feld(i)
Next i
End Sub
im Direktfenster:
Text  abc
Zahl  111
Text  abcd
Text  defgh
Zahl  1234
Text  rrttzzz
Zahl  20

in der Tabelle wird auch nach Zahl und Text getrennt.
Also nicht Text rein viele Text raus!
(ist auch egal ob mit Text oder Zahl beginnt)
Ein schönes Wochenend und
Mit freundlichen Grüßen
Albrecht
Das ist ein klassischer Trugschluss deinerseits,..
Luc:-?
…Albrecht… ;-)
Die vbFkt IsNumeric eignet sich nicht für diesen Nachweis, denn sie stellt nur fest, ob das Argument in eine Zahl umgewandelt wdn könnte. Nimm mal WorksheetFunction.IsText bzw …IsNumber, dann merkst du das…
Dito WE u.Gruß Luc :-?
AW klassischer Trugschluss?
ing.grohn
Hallo Luc,
Dein gibt zu denken, allerdings erkenne mit isnumeric oder mit isdate, ob es sich der Ausdruck als Zahl oder Datum behandeln läßt. Ob damit hinreichend bewiesen ist will ich nicht sagen. Zumindest kann ich mit den ausdrücken (ohne Wandlung) rechnen. Zumindest ist bei Split keine Typensicherheit gegeben: Ist es eine Zahl, dann scheints immer eine Gleitkommazahl zu sein.
Wie man isnumeric, isdate einstuft, scheint unterschiedlich bewertet zu werden: "Es kann überprüft werden, ob eine Variable dengewünschten Datentyp enthält" Can-Weber/Wendel zum Thema Datentypen prüfen
Seis drum Split gibt nicht nur String zurück. Darauf können wir uns sicher einigen oder!!?
einen schönen Sonntag und
mit freundlichen Grüßen
Albrecht
AW: AW klassischer Trugschluss?
Tino
Hallo,
nein darauf können wir uns nicht einigen.
Split gibt definitiv nur Text zurück,
dies kannst Du einmal durch den Einschluss durch die Anführungszeichen erkennen.
Zum zweiten kannst Du es auch erkennen wenn Du mal eine einfache Prüfung versuchst.
Bei richtigen Zahlen ist die 12 größer als die 9,
Text wird aber anders sortiert (alphabetisch) als eine Zahl.
Bei alphabetischer Reihenfolge kommt die 1 vor 9, daher ist bei Text "12" und 12 > 9.
Daher kannst Du Dir bestimmt vorstellen was es nun bedeutet wenn ich z. Bsp.
Gruß Tino
hier ein Beispiel
Tino
Hallo,
hier noch ein Beispiel.
Angenommen ich habe eine Zeile aus einer Textdatei. ("9;50;20;19;2;80")
Der erste Wert sagt aus ab wie viel Stück ich Provision erhalte,
die nachfolgenden sind die verkauften Stück.
Nun rechne ich es mit dem Taschenrechner
50, 20, 19 und 80 >= 9 also müsste ich 4*25 Euro Provision erhalten.
Nun baue ich mir ein VBA Programm weil ich das gern automatisieren will.
Das VBA Programm sagt mir aber jetzt ich bekomme nix?!
Sub Makro1()
Dim varVariant, A As Long, nCount As Long

Const Provision As Currency = 25

varVariant = Split("9;50;20;19;2;80", ";")

For A = Lbound(varVariant) + 1 To Ubound(varVariant)
    If varVariant(A) >= varVariant(0) Then
        nCount = nCount + 1
    End If
Next A

MsgBox "Sie erhalten " & Format(Provision * nCount, "0.00 €") & " Provision"
End Sub
Daher muss ich erst den Wert in eine Zahl umwandeln damit ich rechnen kann.
In diesem Fall ist es ja schnell gemacht,
den Text mit 1 Multipliziert wandelt das Ergebnis in den Type Double um
oder ich verwende die Umwandlungsfunktionen clng(),csng(),cdbl().
(Achtung bei Text und Dezimalzahlen spielt in VBA der vom System verwendete
Dezimal- Separator eine Rolle, auf deutschen Systemen ist es in der Regel Komma
auf viele anderen der Punkt)
Sub Makro1()
Dim varVariant, A As Long, nCount As Long

Const Provision As Currency = 25

varVariant = Split("9;50;20;19;2;80", ";")

For A = Lbound(varVariant) + 1 To Ubound(varVariant)
    If CDbl(varVariant(A)) >= varVariant(0) * 1 Then
        nCount = nCount + 1
    End If
Next A

MsgBox "Sie erhalten " & Format(Provision * nCount, "0.00 €") & " Provision"
End Sub
Gruß Tino
AW: hier ein Beispiel
ing.grohn
Hallo Tino,
ganz echt, das hatte ich nicht erwartet!!!
(kleine Frage: warum machst Du einmal cdbl und dann *1)
Mit freundlichen Grüßen
Albrecht
die zusätzliche Frage war quatsch
ing.grohn
AW: hier ein Beispiel
Tino
Hallo,
ich wollte mit beschrieben beide Varianten aufzeigen wie man eine Text (Zahl) umwandeln kann,
bevorzugen sollte man die Umwandlungsfunktionen.
Mir fällt noch ein sehr guter unterschied ein, versuch mal die Werte zu Addieren also mit +.
VBA verwendet bei String das + als & und setzt die beiden Teile nur zusammen
wie es eben für Text üblich ist.
Dim varVariant
varVariant = Split("10;20", ";")
MsgBox varVariant(0) + varVariant(1)
MsgBox CLng(varVariant(0)) + CLng(varVariant(1))
Gruß Tino
AW: hier ein Beispiel (anders)
ing.grohn
Hallo Tino,
bitte schau dir mal folgendes an:
Sub TestSplit()
Dim Feld
Dim i As Integer
Dim k As Integer
Dim b As Byte
Dim d As Double
Dim Z As Integer
Dim l As Long
' Feld(Z) = Split(Cells(4, 3).Value, "!")
Feld = Split("75001!abcd!01.11.1954!2450!defgh!false!1234,2345!true!rrttzzz!20", "!")
k = UBound(Feld)
For Z = 0 To k
If IsDate(Feld(Z)) Then
Debug.Print Z & "      Datum   " & Feld(Z)
ElseIf IsNumeric(Feld(Z)) Then
If Feld(Z)  33000 Then
Debug.Print Z & " >33..  Wert        " & Feld(Z)
Feld(Z) = Feld(Z) + 1000.45678
Debug.Print "         Summe  = " & Feld(Z)
End If
Else
If Feld(Z) = True Then
Debug.Print Z & "        wahr"
ElseIf Feld(Z) = False Then
Debug.Print Z & "        falsch"
Else
Debug.Print Z & "        Text   " & Feld(Z)
End If
End If
Cells(Z + 5, 3).Value = Feld(Z)
Next Z
End Sub

hier der Direktbereich:
0 >33..  Wert        75001
Type  = 76001,45678
1        Text   abcd
2      Datum   01.11.1954
3 

Mit freundlichen Grüßen
Albrecht
AW: hier ein Beispiel (anders)
Tino
Hallo,
in diesen Fällen haben wir einfach Glück das VBA für uns kleine Fehler korrigiert.
Als Beispiel Feld(Z) = Feld(Z) + 1000.45678 steht ein Text einer Zahl gegenüber.
Ist das gleiche wie mit der Multiplikation mit 1, ich könnte auch + 1 – 1 schreiben um den Text umzuwandeln.
Normalerweise kommt es zum Konflikt, aber VBA erzeugt im Speicher eine neue Variable aus dem Feld(Z), der Text wird also umgewandelt.
Dies hat auch zur folge wenn Du es sehr oft so verwendest,
dass mehr speicher benötigt wird und dadurch der Code länger braucht.
Wie Luc ja auch schon geschrieben hat,
prüft IsNumeric und IsDate nur ob er Wert in eine Zahl oder ein Datum umgewandelt werden kann.
Umwandlung von Datum macht man mit CDate(…), ob der Wert letztendlich gewandelt werden kann kommt aber auf den Inhalt selbst an, Grundsätzlich kann man fast jede Zahl von 0 bis 2958465 in ein Datum umwandeln, weil in Excel und im VBA ein Datum vom Wert her auch nur eine Zahl ist.
Dim sText$
sText$ = "15.09.1974"
Debug.Print IsDate(sText), CDate(sText)

sText$ = "31.12.9999"
Debug.Print IsDate(sText), CDate(sText)
Debug.Print IsNumeric(sText), CDbl(CDate(sText))
'hier wird ein falscher Wert erzeugt 
'weil das Datum noch nicht vorliegt und somit nur ein Text. 
Debug.Print IsNumeric(sText), sText * 1
Debug.Print IsNumeric(sText), CDate(sText) * 1
Gruß Tino
AW: hier ein Beispiel (anders)
Tino
Hallo,
das mit der Umwandlung kann ich Dir so zeige.
TestText braucht für den Ablauf ca. 15 mal mehr Zeit nur weil aus dem summanden
sText immer wieder ein kompatibler Typ im speicher erzeugt werden muss.
Sub TestText()
Dim sText As String, A As Long, Ergebnis As Double
Dim dSummand As Double
Dim dTimer As Double

sText = "12345"
dSummand = 1

dTimer = Timer

For A = 1 To 10 ^ 6
    Ergebnis = sText + dSummand
Next A
Debug.Print Timer - dTimer
End Sub

Sub TestZahl()
Dim dZahl As Double, A As Long, Ergebnis As Double
Dim dSummand As Double
Dim dTimer As Double

dZahl = 12345

dTimer = Timer
For A = 1 To 10 ^ 6
    Ergebnis = dZahl + dSummand
Next A
Debug.Print Timer - dTimer
End Sub
Ich weiß dies ist alles sehr verwirrend (Text Zahl Text),
aber wenn man sich mal etwas damit beschäftigt ist es eigentlich Logisch.
Gruß Tino
AW: nicht verwirrend
ing.grohn
Hallo Tino,
verwirrend ist nicht der richtige Ausdruck.
Allerdings sollte man immer sehr genau sein und Dinge hinterfragen.
Selbstverständlich hätte ich das auch sehen sollen, dass das (+1) genauso funktioniert wie das (*1).
(finde ich nicht gut, dass man das machen kann)
Seis drum, wäre nicht schlecht wenn Mikisoft da ein bischen "sauber" werden würde, z.B. verbieten, dass Byie + Integer geht unmd nicht nur beim Überlauf protestiert.
Ich wünsche einen schönen Abend und
mit freundlichen Grüßen
Albrecht
()
AW: nicht verwirrend
Tino
Hallo,
so ist es nun mal, was für die einen ein Segen ist, ist für die anderen ein Fluch.
Gruß Tino

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige