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

Funktion Verketten ohne ""

Funktion Verketten ohne ""
16.09.2016 16:13:57
Chris
Hallo zusammen,
Werte (E-Mail-Adressen) sollen zusammengefügt werden, dabei sollen leere Felder und Felder mit den Inhalt "NO DATA" ausgelassen werden.
habe mir folgende Funktion zusammengesucht

Function Verketten2(ByRef bereich As Range, Trennzeichen As String) As String
Dim rng As Range
For Each rng In bereich
If rng  "" Or rng = "NO DATA" Then
Verketten2 = Verketten2 & rng & Trennzeichen
End If
Next
If Len(Verketten2) > 0 And Not "NO DATA" Then _
Verketten2 = Left(Verketten2, Len(Verketten2) - Len(Trennzeichen))
End Function

Leider funktioniert sie nicht ganz, bin Laie daher finde ich den Fehler nicht.
Gruß, Chris

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Funktion Verketten ohne ""
16.09.2016 16:27:43
UweD
Hallo
so....
Function Verketten2(ByRef bereich As Range, Trennzeichen As String) As String
    Dim rng As Range
     For Each rng In bereich
        If rng <> "" Or rng = "NO DATA" Then
            Verketten2 = Verketten2 & rng & Trennzeichen
        End If
    Next
    If Len(Verketten2) > 0 And Verketten2 <> "NO DATA" Then _
         Verketten2 = Left(Verketten2, Len(Verketten2) - Len(Trennzeichen))
End Function

Gruß UweD
Anzeige
Variante
16.09.2016 16:36:59
Michael
Hi,
warum das NO DATA nicht gleich rauswerfen?
Function Verketten2(ByRef bereich As Range, Trennzeichen As String) As String
Dim rng As Range
For Each rng In bereich
If rng  "" And rng  "NO DATA" Then
Verketten2 = Verketten2 & rng & Trennzeichen
End If
Next
If Len(Verketten2) > Len(Trennzeichen) Then _
Verketten2 = Left(Verketten2, Len(Verketten2) - Len(Trennzeichen))
End Function
Schöne Grüße,
Michael
Das ist keine Variante von Uwes Variante, ...
16.09.2016 17:56:15
Uwes
…Michael (& all),
sondern eine, die im Ggsatz zu Uwes das macht, was Chris erreichen will. Nur halte ich so etwas für kontraproduktiv in allen Varianten. Eine UDF ist nicht dazu da, dauernd in ihrer Wirkung verändert zu wdn! Wenn das MS mit seinen Fktt auch machen würde, würdet ihr euch zu recht beschweren.
Im Netz wimmelt es förmlich von UDFs dieses Namens; anscheinend ein Massen­Phänomen offen­sicht­licher Einfallslosigkeit!
Eine primär für den Einsatz in ZellFmln bestimmte UDF sollte mehrere Kriterien erfüllen:
1. Sie sollte ergebnisstabil sein, d.h., ein Pgm eines bestimmten Namens sollte immer das gleiche Ergebnis haben und nicht nach Gutdünken verändert wdn. Das kann man mit Xl-Fktt ja auch nicht tun. Für Modifikationen ist dann die Fml, in der die UDF verwendet wird, zuständig.
2. Aus Letzterem ergibt sich, dass die UDF möglichst universell einsetzbar sein muss. Bei den gezeigten Varianten von Verketten2 ist das nicht möglich. Das HptArgument kann nicht weiter spezifiziert wdn, weil die UDF unnötigerweise nur ZellBereiche* zulässt.
3. Falls die UDF nachträglich erweitert wird, muss das auch aus ihrer VersionsNr ersichtlich sein. Dabei darf es sich nur um Fehler­Korrekturen und zusätzliche optionale Argumente handeln. Bisherige Verwendungen älterer Versionen sollten ihr Ergebnis auf Grund ihres Ersatzes durch die neue Version idR nicht ändern, allenfalls FehlerWert-Ausgaben durch nun uU mögliche Ergebnis­Werte.
Es muss unbedingt vermieden wdn, dass durch eine quasi unüberschaubare Vielzahl von UDF-Varianten ein Vermüllungs­Zustand des PCs eintritt. Spätestens ein potenzieller Nachfolger hat dann keinen Überblick mehr und löscht uU alles. So etwas kann zu Stö­rungen im Büro­Ablauf führen und wird deshalb zu recht von vielen EDV-Administratoren unterbunden. Dem fallen dann natürlich auch bessere Lösungen zum Opfer.
Man kann das also auch besser machen. Wer das will, sollte sich bspw eine meiner Standard-UDFs ansehen. Mit einer (*) davon würde ich dieses Problem mit singularer (1zelliger) MatrixFml so lösen:
{=VJoin(WENN(A1:A5="NO DATA";"";""&A1:A5);"")}
Hier wird ein leeres VerbindungsZeichen verwendet, Standard (auch ohne explizite Angabe) wäre Leer­Zeichen, ansonsten kann alles Mögliche als Arg2 angegeben wdn. Die UDF VJoin ist im Archiv enthalten. Den aktuellsten Link (zur letztpublizierten Version1.4) habe ich vor relativ Kurzem in einem BT gesetzt.
Feedback nicht unerwünscht! Gruß, Luc :-?
Besser informiert mit …
Anzeige
@Luc:-? Prinzip vs. Praxis
17.09.2016 16:27:34
Michael
Hi,
Deine "prinzipiellen" Ausführungen sind natürlich nicht von der Hand zu weisen.
In diesem speziellen Fall (Level) sehe ich aber eher nicht das Problem, daß die Anzahl von UDFs ins Uferlose steigt...
Ganz allg. verfolge ich tendenziell "geschwindigkeitsoptimierte" Ansätze, was sich denn (wenn ich überhaupt UDFs einsetze - ich bevorzuge eher "reines VBA", damit die Kiste nur dann "rechnet", wenn ich es definitiv will) so auswirkt, daß ich lieber mehrere UDFs für "relativ ähnliche" Zwecke einsetzen würde, weil dann bei jeder einzelnen UDF der "bürokratische Overhead", die Fallunterscheidungen nämlich, entfallen.
200 Datensätze sind ja unkritisch, aber bei 200.000 würde ich auf alle Fälle so vorgehen...
Teste mal das simple Beispiel:
Option Explicit
Sub DatenErzeugen()
Dim a$(1 To 200000, 1 To 1)
Dim i&, k&, s$
Dim t0 As Single, t1 As Single
t0 = Timer
Randomize
For i = 1 To 200000
s = Chr(Int(Rnd() * 26 + 65))
For k = 1 To 5
s = s & Chr(Int(Rnd() * 26 + 65))
Next
a(i, 1) = s
Next
Range("A1").Resize(UBound(a)) = a
t1 = Timer
MsgBox "t1-t0: " & (t1 - t0) * 1000
End Sub
Sub Fct_Test()
Dim t0 As Single, t1 As Single
Range("B1:B200000").Clear
t0 = Timer
Range("B1:B200000").FormulaLocal = "=BuchSt1(A1)"
t1 = Timer
Range("G1") = "BuchSt1": Range("H1") = (t1 - t0) * 1000
Range("B1:B200000").Clear
t0 = Timer
Range("B1:B200000").FormulaLocal = "=BuchSt2(A1)"
t1 = Timer
Range("G2") = "BuchSt2": Range("H2") = (t1 - t0) * 1000
Range("B1:B200000").Clear
t0 = Timer
Range("B1:B200000").FormulaLocal = "=BuchStX(A1;2)"
t1 = Timer
Range("G3") = "BuchStX": Range("H3") = (t1 - t0) * 1000
Range("B1:B200000").Clear
t0 = Timer
Range("B1:B200000").FormulaLocal = "=BuchStX2(A1;2)"
t1 = Timer
Range("G4") = "BuchStX2": Range("H4") = (t1 - t0) * 1000
End Sub
Function BuchStX(r As Range, p&) As String
BuchStX = Mid(r, p, 1)
End Function
Function BuchStX2(r As Range, p&) As String
BuchStX2 = Mid(r.Value, p, 1)
End Function
Function BuchSt1(r As Range) As String
BuchSt1 = Mid(r, 1, 1)
End Function
Function BuchSt2(r As Range) As String
BuchSt2 = Mid(r.Value, 1, 1)
End Function
Es gibt zwei Varianten, einmal "fix" und einmal mit 2. Parameter, und die jeweils mit r oder r.value.
Bei 200.000 Werten sieht man schon einen Unterschied: r.value ist einen Ticken schneller, so um die 5%, und die Functions mit 2. Parameter benötigen rund 7% mehr Zeit.
In dem Fall wird mit dem Parameter ja nicht mal gerechnet (oder verglichen usw.), er wird nur 1:1 übernommen.
Ach so, in meiner "Variante" und überhaupt ist das ByRef ziemlich fehl am Platze...
Schöne Grüße,
Michael
Anzeige
Ja, das ist die übliche Pgmmierer-Praxis, nicht …
18.09.2016 00:20:55
Luc:-?
…aber das, was eine fml-orientierte Kalkulation benötigt, Michael;
auch war Xl ursprünglich nicht für Massen-DV gedacht, dafür gibt's DBen und ausgefeilte SQL-Befehle bzw eigenes VBA.
Das Schreiben anspruchsvoller UDFs hat mit üblicher Verarbeitungs­Automati­sierung nicht viel zu tun, denn hierbei muss zT Anderes und dann uU auch noch mehr beachtet wdn, was sich im Gesamt­Rahmen von Xl, nicht eines bestimmten Projektes bewegt. Das Projekt ist hier die UDF selbst nebst ihren Einsatz­Möglich­keiten und nicht die Lösung einer bestimmten mehr oder weniger komplexen DV-Gesamt­Aufgabe. Deshalb folgt so etwas dem Bereich der Xl-System­Pgmmierung unmittelbar nach, während Auto­mati­sierungs­Aufgaben eher unter spezielle Xl-Anwen­dungs­Pgmmierung fallen.
Dass dieser Unterschied besteht, wird gemeinhin verkannt, wodurch die Bedeutung von UDFs als Lücken­Schließer im Xl-Fkts­Stan­dard­Angebot, die - bei entsprd Arbeits­platz­Organi­sation - genauso zu werten wären wie Standard-XlFktt, in der allgemeinen Wahr­nehmung meist unter­geht.
Daraus folgt auch, dass eine gute UDF so zu schreiben ist, dass nachträgliche Eingriffe in ihr Pgmm unnötig sind. Und falls sie doch erfolgen und dadurch andere Ergebnisse entstehen, muss sie zwingend einen anderen Namen erhalten.
Dein auf den einzelnen Nutzer bezogenes Argument greift hier nicht, denn das INet ist weit und wohl täglich wird dort nach Pgmm gesucht, die dann meist an eine konkrete Situation angepasst wdn. Das konter­kariert den Univer­salitäts­Gedanken, der hinter der Schaffung jedweder Kalku­lations-Software für den allge­meinen, unspezi­fizierten Gebrauch steht.
Mich würde der Gedanke nicht befriedigen, nur Pgmm für eine momentane Situation zu schreiben. Da ist dann zu erwarten, dass sie demnächst schon im Papierkorb landen!
Nebenbei, ständig ist die Rede von Recycling (das wäre hier dann die ständige Anpassung eines Pgms an eine geänderte Aus­gangs­Situation - aber auch an die Erleich­terung derartiger Anpas­sungen wird oft nicht gedacht!) und Wieder­Verwendung (auch in der Raum­fahrt). Warum in aller Welt soll dann mit dem, was hinter dem ganzen Fort­schritt steckt, mensch­licher Erfinder­geist, seine Ideen und Produkte, derart verschwen­derisch umgegangen wdn?! UDFs - im Dtzd billiger…
Luc :-?
Anzeige
@Luc:-? zusammenfassend...
19.09.2016 17:14:34
Michael
Hi,
naja, das ist dann wohl eine Frage der Philosophie bzw. Geschmackssache...
Ich mag lieber konkrete Probleme angehen als allgemeine Lösungen zu produzieren, die denn den Excel-Funktionsumfang abrunden (warum heißt das nicht aufrunden?) würden. Da möchte ich dann aber auch anregen, daß Du Dir einen Blog oder eine site ("Lucs-Powertools.de") schnappst und Deine Sachen "griffig" darstellst: ich lese hin und wieder (konkret grad in dem anderen Thread zu dem Unicode) von Dir "man könnte auch meine (unveröffentlichte) UDF xyz einsetzen" - eine Veröffentlichung sollte doch Deiner Philosophie entsprechen?
Naja, als ob "man" sonst nix zu tun hätte.
Sag, im aktuellen "Alifa" bin ich auf eine Geschichte gestoßen, daß nämlich
dim a&(1 to 2)
for a(1) = 1 to 2
for a(2) = 3 to 4
nicht geht: "Variable bereits verwendet" oder so. Die "Variable" vielleicht, aber doch nicht die konkrete "Speicherstelle" innerhalb derselben? Na gut, ich hab's zur Kenntnis genommen.
Dafür, daß Excel vielleicht mal nicht für "irgendwas" ausgelegt war, isses aber richtig gut: bisher hab ich's nicht geschafft, irgendwas nicht umzusetzen - es tut wirklich seeehhhr brav!
Gute Zeit & Grüße,
Michael
Anzeige
Naja, ich habe vor vielen Jahren mal einen ...
20.09.2016 01:02:44
Luc:-?
…Vgl in einem (glaube pop-wissensch) Buch gelesen, Michael,
in dem die Mathematik bzw der sie betreibende Mathematiker mit einem Schneider vgln wurde, der Kleidung für alle möglichen denkbaren Spezies anfertigt, egal, ob es jemand gibt, der sie je tragen wird. Damit wird der Vorteil bestens charakterisiert, den quasi ein (wissenschaftl) Hobby anderen Wissenschaften bietet → sie müssen nur eine Anwendung finden oder besser sie müssen bei Bedarf suchen, welches von den fertigen (mathematischen) „Kleidern“ am besten passt, um eine bestimmte Aufgabe zu lösen, sie müssen nicht die ganze Methode erst erfinden.
Das macht Xl auch und stellt dem Anwender Fktt zV, mit denen er sein Problem lösen soll. Nur leider ist dieser universelle Werk­zeug­Kasten etwas unter­besetzt, wie man hier und anderswo immer wieder mal erleben kann. Deshalb muss man nun nicht unbe­dingt gleich auf (im wahren Leben teure) Spezial­Instru­mente ausweichen, die man uU nur ein einziges Mal benötigt, wenn ein all­gemein nutz­barer Erwei­terungs­Kasten zV steht. Im Forum geschilderte Probleme sind somit für mich ggf Anregung, Angebots­lücken zu schließen, weniger allein befrie­digende Aufgabe. Das ist Sache der Fml-Freaks und ggf Stan­dard-Pgmmierer und inter­essiert mich nur am Rande bzw als evtl weitere Möglich­keit, UDFs in einem uU neuen bzw anderen Zusammen­spiel mit Standard­Fktt in einer Fml zu testen. Daraus können dann auch UDF-Verbesse- bzw -Erweite­rungen resultieren.
Eine WebSite plane ich schon seit Jahren, komme aber nie dazu, damit wirklich anzufangen, obwohl ich alle Voraus­set­zungen habe. Ohne Contents war das wenig sinnvoll, aber inzwi­schen habe ich mehr davon als ich bewäl­tigen kann. Außerdem sollte sie neben freien Bspp auch (geschütztes) Kosten­pflichtiges für die reinen Benutzer ent­halten. Eine Sisyphos-Arbeit…
Zum LaufVariablenProblem:
Eine LaufVariable kann zwar uU ein ganzes Array enthalten (vor allem in For Each-Zyklen*), darf selber aber nicht Bestand­teil eines Arrays sein (merke: es gibt keine Arrays aus Lauf­Variablen → folglich darf eine Lauf­Variable auch nicht primär indiziert vorliegen)! Das verursacht diesen Fehler.
* Bsp: For Each x In Array(Array(4, 2, 3), Array(3, 2, 4)): Debug.Print x(0) + x(1) - x(2): Next x → Hier enthält x einen ganzen Vektor, dessen Elemente man mit x(i) abfragen kann.
Und was deinen letzten Satz betrifft, kannste ma' sehn, wie damals die Pgmmierer gedacht haben. Heute fangen sie an, alte Fktt nutzer­(un)­freundlich in spezielle Dot-Varianten aufzu­teilen. Dazu demnächst mehr…
Ebenso, Luc :-?
Anzeige
der "Schneider" ist ja richtig poetisch,
20.09.2016 15:27:37
Michael
Luc:-?,
aber ich bin mir nicht ganz sicher, ob das so zutrifft: für mich ist Mathematik ein nettes Spielzeug, und mir persönlich umso lieber, je weniger sie von anderen Sachen (mein LK-Physik-Abi: 0 Punkte, einen Mathe-LK gab's leider nicht, das wären 15 gewesen: der "humanistische" Rektor bekam kein Griechisch zusammen, da hat er gezickt) "verunreinigt" wird.
In der Praxis wird es eher so sein, daß man sich im Zweifelsfall die Mathematik "erfindet", die man zur Lösung eines Problems benötigt.
Vielleicht sollten wir uns zusammentun? Dieses Jahr ist zwar bei mir "gelaufen", was derartige Aktivitäten angeht, aber ab Januar?
Die For-Schleife ist lustig, die landet im Hinterkopf.
Die aktuellen Entwicklungen passen mir auch nicht recht: im Prinzip kann XL2000 alles, was ich brauche (auch wenn ich Arial nimmer sehen kann); zu DOS-Zeiten habe ich alles Mögliche in eine .exe gepackt, und die ist gelaufen, unabhängig von irgendwelchen Bibliotheken - WIR (Programmierer, Anwender) haben keinen Vorteil davon, daß Programme irgendwann ohne Netz gar nicht mehr laufen, nur die Hersteller.
Laß es Dir gutgehen,
Michael
Anzeige
Na dann, bis denne... ;-) owT
20.09.2016 20:11:31
Luc:-?
:-?
Die Xl-Version ist schon von Relevanz, ...
16.09.2016 18:01:23
Relevanz,
…Chris,
denn vor Xl9/2k gab's die hier statt des Zyklus verwendbare vbFkt Join nicht und ab den allerneuesten Xl-Versionen gibt's die neuen Xl-Fktt TEXTKETTE und TEXTVERKETTEN.
Gruß, Luc :-?
Besser informiert mit …
AW: Funktion ...and NODATA? o.r.T.
16.09.2016 21:37:57
Gerd
GRUSS GERD

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige