Wir wünschen allen Forenteilnehmern ein frohes Fest und einen guten Rutsch ins neue Jahr. x

Gezielt Zeilen in einer Zelle löschen
#1
Hallo zusammen,

ich hätte mal wieder eine Frage und hoffe ihr könnt mir helfen.

Ich habe eine einzelne Zelle (A1), die wie nachfolgend befüllt sein kann:

Name: Fischer, Max
Alter: 38
Geschlecht: Männlich

Die Attribute "Name", "Alter" und "Geschlecht" sind fix und durch Zeilenumbrüche getrennt, können jedoch beliebig untereinander angeordnet bzw. vertauscht sein. Die zugehörigen Daten sind variabel.

Ich möchte nun bei Bedarf bestimmte Daten in der Zelle löschen. Beispielsweise die Zeile "Name: Fischer, Max".

Mein erster Gedanke war hierfür die "Replace" Funktion zu verwenden. Allerdings ist der Name (hier "Fischer, Max") variabel, somit kann ich der Funktion nicht zuordnen bis zu welchem Punkt sie es ersetzen bzw. löschen soll. Ich habe es dann dank nachfolgendem Zeilenumbruch wie folgt gelöst:
Code:
Worksheets("Tabelle1").Cells(1, 1).Replace what:="Name:" & "*" & vbLf, replacement:=""

Dies funktioniert aber eben nur, wenn die Zeile mit "Name: ..." nicht in der letzten Zeile steht, bzw. nachfolgend noch ein Zeilenumbruch kommt, was nicht immer der Fall sein muss.

Mein nächster Gedanke war deshalb über die Anzahl der Zeichen die Start- und Endposition zu ermitteln und diese dann gezielt mit "Replace" zu entfernen. Mit "InStr" könnte ich ja die Startposition der jeweiligen Zeile in der Zelle ermitteln, aber wie ermittle ich die zugehörige Endposition? Gibt es hierfür auch eine Funktion?

Oder gibt es allgemein eine viel einfachere Lösung wie ich das angehen kann?

Über Tipps würde ich mich sehr freuen.

Danke und Gruß
Sebbo
Antworten Top
#2
Warum werden die Daten so gespeichert? In Excel hält man die Daten nicht in einer Zelle!

Ansonsten so
Code:
Option Explicit
Function replaceData(inp As String, fieldDelimiter As String, lineDelimiter As String, fieldName As String) As String
    Dim vDat As Variant
    vDat = Split(inp, fieldDelimiter)
    Dim i As Long
    For i = LBound(vDat) To UBound(vDat)
        If Split(vDat(i), lineDelimiter)(0) = fieldName Then
            DeleteArrayElement vDat, i, True
            Exit For
        End If
    Next i
    replaceData = Join(vDat, fieldDelimiter)
End Function
Sub testIt()
Dim Res As String
    Res = replaceData(Range("A1").Value, vbLf, ":", "Geschlecht")
    Debug.Print Res
End Sub

DeleteArrayElement

Oder einfacher 
Code:
Function replaceDataA(inp As String, fieldDelimiter As String, lineDelimiter As String, fieldName As String) As String

    Dim vdat As Variant, rdat As Variant
   
    vdat = Split(inp, fieldDelimiter)
    ReDim rdat(0 To UBound(vdat) - 1)
    Dim i As Long, j As Long
   
    For i = LBound(vdat) To UBound(vdat)
        If Split(vdat(i), lineDelimiter)(0) <> fieldName Then
            rdat(j) = vdat(i)
            j = j + 1
        Else
        End If
    Next i
   
    replaceDataA = Join(rdat, fieldDelimiter)
   
End Function


Sub testItA()

Dim Res As String

    Res = replaceDataA(Range("A1").Value, vbLf, ":", "Geschlecht")
    Debug.Print Res

End Sub
Antworten Top
#3
Hallo,

mit
Code:
i=1
Ar = split(cells(i,1), vbLF)

trennt man die 3 Zeilen in 3 Elemente eines 1-d Arrays. Dies wird dann je nach Bedarf weiterverarbeitet.

mfg
Antworten Top
#4
Hallo ihr beiden,

vielen Dank für eure Antworten!

Die Split Funktion kannte ich noch nicht. Ich muss mich da erst mal einarbeiten/-lesen. Feedback folgt in jedem Fall!

@DeltaX Ich habe auf diese Frage schon gewartet :D Ist leider eine vorgegebene Liste, welche ich nicht nach eigenem Belieben abändern kann.

Viele Grüße
Sebbo
Antworten Top
#5
Zitat:@DeltaX Ich habe auf diese Frage schon gewartet :D Ist leider eine vorgegebene Liste, welche ich nicht nach eigenem Belieben abändern kann.
So, so, darauf hast Du also gewartet. Und Deine Ausrede ist jetzt völlig unerwartet und absolut neu. Damit hätte ich nie gerechnet. [/Ironie aus]

Wenn die Liste vorgegeben ist, dann soll doch bitte derjenige, der die Liste vorgibt, das Problem lösen.

Viel Erfolg noch!
Antworten Top
#6
Hallo ihr beiden,

ich habe mir das Ganze jetzt angeschaut und versucht nachzuvollziehen und mit nachfolgendem Code klappt es wie gewünscht (hier am Beispiel "Name"):

Code:
Sub Loeschen()

Dim Zeile() As String

Zeile = Split(Worksheets("Tabelle1").Cells(1, 1), vbLf)
ZeilenZahl = UBound(Zeile)

For i = 0 To ZeilenZahl

If Zeile(i) Like "*" & "Name" & "*" Then
   
    If i < ZeilenZahl Then
    Worksheets("Tabelle1").Cells(1, 1).Replace what:=Zeile(i) & vbLf, replacement:=""
    Else
    Worksheets("Tabelle1").Cells(1, 1).Replace what:=vbLf & Zeile(i), replacement:=""
    End If

End If

Next

End Sub

Die Split-Funktion war der Schlüssel! Danke für eure Hilfe!

Viele Grüße und noch ein schönes Wochenende
Sebbo

Zitat:So, so, darauf hast Du also gewartet. Und Deine Ausrede ist jetzt völlig unerwartet und absolut neu. Damit hätte ich nie gerechnet. [/Ironie aus]

Wenn die Liste vorgegeben ist, dann soll doch bitte derjenige, der die Liste vorgibt, das Problem lösen.

Ich glaube nicht, dass eine Ausrede nötigt ist ;)

Mir ging es darum für diesen speziellen Fall eine Lösung zu finden, da ich die Liste wie gesagt nicht nach eigenem Belieben ändern kann.  Das hat dank eurer Hilfe geklappt. Alles super
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste