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

String in einer Spalte suchen und löschen

String in einer Spalte suchen und löschen
29.10.2015 12:24:53
kay
Sehr geehrte Gemeinschaft,
Es geht um diese Tabelle:





ABCDEFGHIJKLMNO
1temIDItemNoItemCOBestehende WertrangeleerleerItemProducerMarkeWert 1Wert 2Wert 3Wert 4Wert 5Wert 6Wert 7
2732100011546631WERTA WERTB WERTC WERTD WERT1 WERT2 WERT3  ProducerMarkeWERTBWERTCWERT2WERT4WERT5WERT6WERT7
3732100011546631WERTA WERTB WERTC WERTD WERT1 WERT2 WERT3  ProducerMarkeWERT6WERT5WERT4WERT3WERT2WERT1WERTA

Wie ihr sehen könnt, sind in Spalte b mehrere Werte in der Zelle, ich möchte alle Zelle von I2-O2 (und dann weiter mit I3-O3 usw) einzel in der Spalte D suchen und diese entfernen (oder durch ein leerzeichen ersetzen).
Problematik dabei ist das die werte nur wnen sie exakt vorkommen gelöscht werden dürfen (wenn da zb eine einzelne Zahl steht beispiel "2" darf diese nicht überall gelöscht werden sondern nru da wo exakt eine 2 nur steht)
Ich kenne mich leider 0 mit makros und VBA aus , wüsste aber wie ich den script in die Mappe bekomme (alt+f11) und den über den makro reiter ausführen kann.
Ich würde auch gerne einen guten Guide entgegennehmen (bevorzugt einen fertigen code und einen guide ^^)
Danke im vorraus an alle Helfer die ihre Zeit investieren möchten :D

31
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: String in einer Spalte suchen und löschen
29.10.2015 12:31:15
Daniel
Hi
wo sollten die Werte entfernt werden:
in D oder in I-O
Gruß Daniel

AW: String in einer Spalte suchen und löschen
29.10.2015 13:26:26
Jürgen
Hallo,
sind die Werte in D durch etwas getrennt?
z.B.: WertA;WertB,, -> hier wäre evtl. ein

wrdArry()= Split(range(Dx).value,";")

siehe: http://www.exceltrick.com/formulas_macros/vba-split-function/ möglich.
oder sind zwischen den Werten Leerstellen, nicht aber innerhalb der Werte?
also: WertA WertB nicht aber WErt A WErtB Wert C
Durch den Split werden die Werte in ein Arry übertragen, dass dann mit den Werten in I-O verglichen werden kann.
Gefundene Werte im Arry durch ein LEER ersetzen und das Arry über Join() wieder in den Range(Dx)einfügen.
Das Ganze mit einem For Next über alle Zeilen laufen lassen.
Gruß
Jürgen

Anzeige
AW: String in einer Spalte suchen und löschen
29.10.2015 13:30:41
kay
Hallo, die Werte in I-O sollen in D gelöscht werden!
Die Werte in D sind alle per Leerzeichen getrennt
ich schaue mir deinen Link an, bin aber was programmierung angeht echt kein Profi (vor allem visual basic)

AW: String in einer Spalte suchen und löschen
29.10.2015 14:10:09
kay
I-O sollen in D gelöscht werden (wenns geht den script anpassbar machen da es bei mir I-Z ist in der richtigen Liste )
^^

Das kann mit StandardFmln erledigt wdn, ...
29.10.2015 14:41:38
Luc:-?
…Kay,
wenn man WECHSELN für jeden Wert in I:O[Z] in der Fml notiert und auf das jeweils vorhergehende Ergebnis anwendet. Leider enthält Xl keine Fkt, die diese Operation entsprd oft für alle Werte eines Bereichs wiederholt auf eine Zelle bzw das jeweils vorhergehende Ergebnis anwendet.
Man kann sich dabei aber mit VBA-gestützten selbstdefinierten Fktt, sog UDFs, behelfen wie nflgd gezeigt:
{=GLÄTTEN(VJoin(SplitVx(" "&D2&" ";" "&I2:O2&" ")))}
Diese MatrixFml ergibt für dein Bsp WERTA WERTD WERT1 WERT3 und für das nächste in D3 WERTB WERTC WERTD.
Die UDFs VJoin und SplitVx sind im Archiv unter RECHERCHE zu finden, wobei die aktuelle Version 1.4 der 1. und auch die andere (im Zusammenhang mit Oberschlumpfs Bücherliste) nur in hochgeladenen Dateien enthalten sind.
Gruß, Luc :-?
Besser informiert mit …

Anzeige
AW: Das kann mit StandardFmln erledigt wdn, ...
29.10.2015 14:52:41
kay
Hi Luc, durch mein Unwissne habe ich leider nur einen Bruchteil von dme verstanden was du geschrieben hast aber dein Ergebnis sieht schonmal super aus mit einer kleinen Ausnahme:
Die werte in I2-O2 müssen in der kompletten spalte D entfernt werden nicht nur in D2 D:
Aber auf alle Fälle schonmal 100 Dank für deine Mühe und Zeit :D!

Dann bliebe in beiden Fällen (D2:D3) nur ...
29.10.2015 15:11:06
Luc:-?
WERTD übrig, Kay,
und die 1zellige MatrixFml für D2 würde so lauten:
{=GLÄTTEN(VJoin(SplitVx(" "&D2&" ";" "&VSplit(VJoin(I$2:O$3;;-1))&" ")))}
VSplit ist an gleicher Stelle wie VJoin zu finden, aber auch direkt im Archiv.
Luc :-?

Anzeige
AW: Das kann mit StandardFmln erledigt wdn, ...
29.10.2015 15:21:54
Daniel
Hi
Luc meint folgendes als Lösungsweg mit Standardformeln:
1. in Zelle P2 kommt die Formel: =" "&D2&" "
2. in Zelle Q2 kommt die Formel: =Wechseln(P2;" "&I2&" ";" ")
3. die Formel aus Q2 ziehst du nach rechts bis W2
4. in die Zelle X2 kommt die Formel: =Glätten(W2)
5. die Formeln P2-X2 ziehst du jetzt soweit nach unten, wie du belegte Zeilen hast
6. in der Spalte X stehen die bereinigten Werte. kopiere also Spalte X und füge sie in die Spalte D als Wert ein.
7. lösche die Spalten P-X
so kannst du das ohne VBA schnell und einfach lösen.
die o.g. Schritte kannst du aber auch in VBA recht einfach nachprogrammieren:
Sub test()
With Range("D2:D" & Cells(Rows.Count, 4).End(xlUp).Row).EntireRow
.Columns(16).Formula = "="" ""&D2&"" """
.Columns(17).Resize(, 7).Formula = "=Substitute(P2,"" ""&I2&"" "","" "")"
.Columns(24).Formula = "=Trim(W2)"
.Columns(24).Copy
.Columns(4).PasteSpecial xlPasteValues
.Columns(16).Resize(, 9).ClearContents
End With
End Sub
Gruß Daniel

Anzeige
AW: Das kann mit StandardFmln erledigt wdn, ...
29.10.2015 15:43:47
kay
@Luc @Daniel ihr seid echt klasse Jungs, dankeschön soweit, wenn ihr mir jetzt nur noch in Form wie Daniel das gemacht hat mit dem Step to Step Guide zu {=GLÄTTEN(VJoin(SplitVx(" "&D2&" ";" "&VSplit(VJoin(I$2:O$3;;-1))&" ")))} wäre ich wunschlos glücklich :D
Danke für eure Zeit und Geduld mit mir :D

AW: Das kann mit StandardFmln erledigt wdn, ...
29.10.2015 15:56:21
kay
Weil bei mir kommt bei den funktionen nur #NAME? {=GLÄTTEN(VJoin(SplitVx(" "&D2&" ";" "&VSplit(VJoin(I$2:Z$8000;;-1))&" ")))} nutze ich (bei mir in der tabelle gehen die werte von I-z es gibt dort auch leere felder hoffe mal das ist kein problem)

Anzeige
Nee leere Felder sind kein Problem, ...
29.10.2015 16:15:01
Luc:-?
…aber du musst natürlich die UDFs in deiner Mappe installieren, Kay,
damit Xl die auch kennt. Das ist genauso wie mit Daniels VBA-Prozedur. Deshalb habe ich auch den Hinweis auf die RECHERCHE gegeben. Dort die UDF-Namen angeben.
Wenn's nicht klappt, kann ich das (viel) später nachreichen. Hab' jetzt k.Zeit dafür.
Luc :-?

Ich meinte mit StandardFml zwar eher nur ...
29.10.2015 16:09:50
Luc:-?
…eine der Art
=WECHSELN(…WECHSELN(WECHSELN(" "&D2&" ";" "&I2&" ";" ");" "&J2&" ";" ");…;" "&O2&" "; " ")
aber da das 1. bis Spalte Z und noch dazu über alle Zeilen gehen soll, wäre in diesem Fall wohl eine Schritt-für-Schritt-Lösung oder UDF-Einsatz besser.
Für meine UDF-Fml gibt's keine Schritt-für-Schritt-Anleitung, denn das ist nur eine 1zellige MatrixFml, die alles erledigt. Erläutern kann man nur ihre Komponenten.
Inneres VJoin kombiniert die Inhalte des angegebenen Bereichs zu einem Text (mit Default-Verbinder Leerzeichen) ohne Wiederholungen gleicher Werte (-1). VSplit trennt diesen Text (auf den zuvor eingefügten Leerzeichen) wieder in Einzel­Elemente, die mit führenden und nachfolgenden Leerzeichen ergänzt wdn.
Dieser DatenfeldVektor wird dann in SplitVx als Trennzeichen benutzt, d.h., auf diesen Werten erfolgt eine Trennung des Textes in D2ff. Dadurch gehen diese Werte verloren. Abschließend verbindet VJoin das Übriggebliebene wieder zu einem Text, wobei GLÄTTEN dann evtl unnötige Leerzeichen beseitigt.
Die MatrixFmlForm ist erforderlich, damit auch immer alle erzeugten EinzelWerte mitgenommen wdn.
Luc :-?

Anzeige
AW: Ich meinte mit StandardFml zwar eher nur ...
29.10.2015 16:17:27
Daniel
Hi Luc
ich glaube, kay braucht da auch eine Step-by-Step-Anleitung die beschreibt was er tun muss, damit die deine Formel nicht nur den #Name-Fehler ausspuckt, weil VSplit,VJoin usw sind ja keine Standardformeln, die in Excel automatisch verfügbar sind.
Gruß Daniel

AW: Ich meinte mit StandardFml zwar eher nur ...
29.10.2015 16:19:22
kay
Das wäre klasse, ich verstehe mitlerweile was Luc´s Formel macht aber wie kriege ich die zusatzfunktionen auch bei meinem Excel hin? Sicher kann ich es auch googlen nur würde ich es lieber von jemandem mit Ahnung hören und direkt verstehen wenn es nicht zu viel Aufwand ist ... dann bitte einfach sagen ^^ danke euch ^^

Anzeige
AW: Ich meinte mit StandardFml zwar eher nur ...
29.10.2015 17:45:37
kay
Guten Abend die Herren,
also ich habe mitlerweile Vsplit, Vjoin und Splitvx als Module eingetragen und leider gibt mir das nur D 1:1 aus.
oder muss ich da mehr machen? natürlich habe ich die spalten angepasst für meine zwecke
{=GLÄTTEN(VJoin(SplitVx(" "&D2&" ";" "&VSplit(VJoin(I$2:Z$8000;;-1))&" "))) } nur leider entfernt der mir nicht die werte die in i-z stehen

AW: Ich meinte mit StandardFml zwar eher nur ...
29.10.2015 18:04:42
Daniel
Hi
da wirst du auf Luc warten müssen.
diese Funktionen sind sein Baby.
Gruß Daniel

AW: Ich meinte mit StandardFml zwar eher nur ...
29.10.2015 18:11:31
kay
Hi Daniel,
Alles klar wird gemacht, versuche gerade nur den Fehler zu erkennen ggfs. ist Luc sogar so nett und möchte sich bei kbo@hotmail.de melden ich würde ihm unter umständen ne leicht abgeänderte version meiner tabelle zeigen unter umständen findet er ja dann den Fehler :D
Ansonsten gute nacht ^^

Anzeige
Aha, dann hast du die also gefunden, ...
30.10.2015 04:49:08
Luc:-?
…Kay,
und brauchst eigentlich keine Anleitung mehr. Allerdings könnte es ein vbLimits-Problem geben, denn du hattest zuvor nicht erwähnt, dass es sich um knapp 8000 Zeilen, also 7999*18 Zellen handelt. In solchen Fällen empfehlen die meisten Fml-Gurus auch für bestimmte komplexe XlFktt/-Fmln Hilfszellen.
Wenn deine Werte Zahlen sind, dürfte die Stellenzahl des einzelnen Werts keine große Rolle spielen, bei Texten deren Länge aber schon. Zwar kann man mit VBA fast beliebig lange Texte bilden, die entstehen hier auch temporär, aber ihre Übergabe von Fkt zu Fkt in der Fml könnte die Xl-Limitierungen überschreiten. Die ursprüngliche Fml hätte da sicher kein Problem. Außerdem geht es zu lasten der Berechnungsperformance, wenn in jeder Zelle von D der Teil I2:Z8000 wieder neu berechnet wdn muss. Das sollte in diesem Fall nur 1× gemacht und dann dieses Ergebnis immer wieder benutzt wdn.
Du kannst ja mal versuchen, ob du mit =VJoin(I$2:Z$8000;;-1) einen zusammen­gefassten Text aus den Inhalten aller relevanten Zellen in einer Hilfszelle erzeugen kannst, der jeden auftretenden Wert nur 1× enthält. Wenn der nicht zu lang wird, kannst du ihn dann in der restlichen MatrixFml verwenden: {=GLÄTTEN(VJoin(SplitVx(" "&D2&" ";" "&VSplit(hilfszelladresse)&" ")))}
Falls das nicht klappt, muss ich mir etwas Anderes einfallen lassen, denn bisher habe ich diese UDFs nur mit maximal 1000 EinzelTexten (unterschiedlicher Länge) getestet(ggf muss auch eine spezielle VBA-SubProzedur benutzt wdn, was übrigens auch eine Spezialität von Daniel wäre ;-]).
Ich hoffe, du hast auch die aktuelle Vs1.4 von VJoin in Gebrauch. Wenn während der Übergabe von UDF zu UDF ein Fehler in SteuerArgumenten auftritt, wird der ursprüngliche Text nämlich idR beibehalten.
Ich fürchte allerdings, dass das alles erst die Spitze des Eisbergs ist, denn es ist doch sehr ungewöhnlich, eine Tabelle derart aufzubauen. Möglicherweise sind die Texte in D auch viel länger, was eine geringere Redundanz in I:Z bedeuten könnte. Interessant wäre auch, ob die Daten in D primär sind oder irgendwie ermittelt wdn. Im letzteren Fall sollte man evtl besser dort ansetzen.
Vielleicht wäre es auch sinnvoller, die Werte in D zellenweise zu splitten, jeden einzelnen in der ganzen Matrix zu suchen und nur zu behalten, wenn er nicht gefunden wird. Dann würdest du auch mit nur 2 UDF auskommen:
{=VJoin(WENN(ZÄHLENWENN(I$2:Z$8000;VSplit(D2))>0;"";VSplit(D2));;-1)}

Diese MatrixFml solltest du viell zuerst ausprobieren, bevor du anderes versuchst!
Morrn, Luc :-?

Anzeige
AW: Aha, dann hast du die also gefunden, ...
30.10.2015 11:45:30
kay
Hi Luc, ja das hat schonmal besser funktioniert aber auch das hat nicht so unbedingt funktioniert, wäre vllt ein Makro besse?
Es könnte in I2 - Z6000 den exakten wert nehmen vllt mit Leertasten davor und danach? also zb : " WERTD " und löscht das überall in der mappe? Da ich ja nur 2 Datenbanken miteinander abgleiche und die unterschiede wissen möchte, wäre das machbar?

AW: Aha, dann hast du die also gefunden, ...
30.10.2015 14:25:39
Daniel
Hi
ums nochmal abzusichern, folgende Situaion:
D2: "a b c d" | I2: "a"
D3: "a b c d" | I3: "b"
D4: "a b c d" | I4: "c"
wie soll dann das Ergebnis in D aussehen:
a) Ersetzung erfolgt zeilenweise:
D2: "b c d"
D3: "a c d"
D4: "a b d"
b) die Ersetzung berücksichtit alle Zeilen:
D2: "d"
D3: "d"
D4: "d"
Gruß Daniel

AW: Aha, dann hast du die also gefunden, ...
30.10.2015 14:56:21
kay
b) die Ersetzung berücksichtit alle Zeilen:
D2: "d"
D3: "d"
D4: "d"
So sollte es aussehen ^^
Zum Verständnis ich habe zwei datenbanken, die eine enthält unser aktuelles "Wissen" das ist bei mir I-P
D enthällt das gesammte "Wissen" und ich möchte unser "Wissen" davon abziehen.
Wichtig ist, dass die Werte Exakt abgezogen werden, also zb "5" nur abziehen wo genau nur 5 steht und nicht zb "C-95" und daraus "C-9" machen
Danke euch echt wegen der Mühe und Geduld die ganzen Tage jungs ^^

AW: Aha, dann hast du die also gefunden, ...
30.10.2015 15:03:29
Daniel
jetzt muss ich dann doch nochmal nachfragen:
so wie ich dich verstanden hatte, hat mein erster Lösungsvorschlag (die Step-by-Step-Anleitung sowie deren Ausführung als Markocode doch funktioniert, oder?
zumindest war deine Reaktion darauf folgende:
"@Luc @Daniel ihr seid echt klasse Jungs, dankeschön soweit, wenn ihr mir jetzt nur noch in Form wie Daniel das gemacht hat mit dem Step to Step Guide zu {=GLÄTTEN(VJoin(SplitVx(" "&D2&" ";" "&VSplit(VJoin(I$2:O$3;;-1))&" ")))} wäre ich wunschlos glücklich :D"
und das bedeutet für mich, das das Problem doch eingentlich gelöst it.
Gruß Daniel

AW: Aha, dann hast du die also gefunden, ...
30.10.2015 15:06:58
kay
Leider nein, mein Problem bei {=GLÄTTEN(VJoin(SplitVx(" "&D2&" ";" "&VSplit(VJoin(I$2:O$3;;-1))&" ")))}
ist leider das er nicht alle Felder ordentlich abzieht (es macht bei einigen das was er soll aber es gibt noch felder die er in I-P nicht berücksichtigt) wenn du willst könnte ich dir ne roh version der Tabelle schicken und du kannst es selbst sehen (brauche dann nur ne mail)

AW: Aha, dann hast du die also gefunden, ...
30.10.2015 15:23:58
Daniel
Hi
das Forum hat ne upload-funtktion, in der jeder Dateinen bis 300kb hochladen kann.
das Zusenden per Mail ist also nicht notwendig.
Trotzdem, ich hatte dir auch ne Lösung geschickt und für hattest du doch geschrieben, dass sie dich glücklich macht.
Gruß Daniel

AW: Aha, dann hast du die also gefunden, ...
30.10.2015 15:42:08
kay
In der Datei sind leider Private Daten drin, die kann ich schnlecht für die öffentlichkeit freigeben ... deine funktion hat leider immer nur reihenweise die daten entfernt, dass das nicht das ich was ich wollte habe ich leider zu spät gesehen.
Würde da doch gerne auf ne mail variante zurückgreifen.

AW: Aha, dann hast du die also gefunden, ...
30.10.2015 15:44:30
kay
oder kennst du ggfs einen file uploader bei dem man die downlaods begrenzen kann?

AW: Aha, dann hast du die also gefunden, ...
30.10.2015 15:58:16
Daniel
Fileuploader? - Dieses Forum hat einen.
wenn deine Datei Daten enthält, die du nicht veröffenlichen willst, dann musst du diese Daten eben durch Dummywerte ersetzen.
und beim nächsten mal die Lösungen genauer prüfen, bevor du Feedback gibst.
Gruß Daniel

AW: Aha, dann hast du die also gefunden, ...
30.10.2015 16:08:37
kay
https://www.herber.de/bbs/user/101142.xlsm
Hier die Datei, wird notiert und in Zukunft auch detailierter wiedergegeben.
I-P sollen exakt in D gelöscht werden

AW: Aha, dann hast du die also gefunden, ...
30.10.2015 16:52:12
Daniel
Hi
probier mal das:

Sub test()
Dim dicLösch
Dim a
With ActiveSheet.UsedRange
'--- Kompatibliltätenliste Trennzeichen am Anfang und End hinzu
With .Columns(5)
.Formula = "="" ""&RC[-1]&"" """
.Formula = .Value
End With
'--- Liste der zu löschenden Komatibilitäten ermitteln
Set dicLösch = CreateObject("scripting.dictionary")
For Each a In .Columns(9).Resize(.Rows.Count - 1, 18).Offset(1, 0).Value
If a  "" Then dicLösch(a) = 0
Next
'--- Löschen
With .Columns(5)
For Each a In dicLösch.keys
.Cells.Replace " " & a & " ", " ", xlPart
Next
End With
'--- Trennzeichen am Anfang und ende wieder wegmachen
With .Columns(4)
.FormulaR1C1 = "=Trim(RC5)"
.Formula = .Value
End With
.Columns(5).Offset(1, 0).ClearContents
End With
End Sub
das Ergebnis wird in Spalte D ausgegeben
Spalte E wird für das Zwischenergebnis genutzt.
wenn du alt und neu sehen willst, dann lass einfach den Codeteil ab
'--- Trennzeichen am Anfang und ende wieder wegmachen

weg. Dann bleiben die Werte in Spalte E stehen, sie haben dann nur noch das Leerzeichen am Anfang und Ende.
das muss hinzu, damit das löschen von Leerzeichen-Wert-Leerzeichen auch für die Randwerte funktioniert.
Gruß Daniel

AW: Geschwindigkeitsoptimiert
30.10.2015 22:09:44
Daniel
Hi
du sprachst von 6000 Zeilen, bei 18 Spalten.
dann probier mal lieber das, damit die Aufgabe in akzeptabler Zeit erledigt wird:
Sub test1()
Dim dicLösch
Dim a
Dim arr
Dim txt As String
Dim T
Dim z As Long
With ActiveSheet.UsedRange
'--- Liste der zu löschenden Komatibilitäten ermitteln
Set dicLösch = CreateObject("scripting.dictionary")
For Each a In .Columns(9).Resize(.Rows.Count - 1, 18).Offset(1, 0).Value
If a  "" Then dicLösch(a) = 0
Next
'--- Löschen
With .Columns(4)
arr = .Value
For z = UBound(arr, 1) To 2 Step -1
txt = ""
Application.StatusBar = "noch zu bearbeiten: " & z
For Each T In Split(arr(z, 1), " ")
If Not dicLösch.exists(T) Then txt = txt & " " & T
Next
arr(z, 1) = Mid(txt, 2)
Next
.Value = arr
End With
Application.StatusBar = False
End With
End Sub
Gruss Daniel

Das fktioniert schon, ...
30.10.2015 20:22:27
Luc:-?
…Kay,
du hast nur meinen Versionshinweis nicht beachtet! Im Archiv sind die Vss1.0…1.4 von VJoin enthalten und du hast mit 1.0 die älteste genommen. Ich habe deshalb in deine BspDatei die richtige Version reingesetzt und mit beiden Fmln (in Spalte E bzw F) demonstriert, dass sie fktionieren. Wahrscheinlich dürfte es aber besser sein, die in F zu verwenden. Dann kann sicher auch immer die Hilfszelle entfallen.
Luc :-?

333 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige