HERBERS Excel-Forum - das Archiv
Einzelne Zeichen aus Zelle löschen...
Mirko

Hallo,
ich habe ein kleines Problem.
Ich habe eine Zelle mit Text, aus der ich mittels VBA bestimmte Zeichen löschen muss. Hierbei ist jedoch nicht das Zeichen selbst, sondern die Formatierung des Zeichens ausschlaggebend.
Beispiel:
Eine Zelle enthält überwiegend schwarzen Text, innerhalb des Textes gibt es aber rot-durchgestrichene Wörter. Diese sollen entfernt werden.
Daher arbeite ich mit der Cells.Character-Eigenschaft. Solange die Zelle Text unterhalb von 256 Zeichen beinhaltet funktioniert alles wunderbar, aber ab 257 Zeichen passiert entweder nichts oder, es gibt den Fehler 1004.
Code-Beispiel:
Sub CharDelete()
ChAnz = ActiveCell.Characters.Count
For z = 1 To ChAnz
If ActiveCell.Characters(z, 1).Font.ColorIndex = 3 _
And ActiveCell.Characters(z, 1).Font.Strikethrough = True Then
ActiveCell.Characters(z, 1).Delete
ChAnz = ChAnz - 1
z = z - 1
End If
Next
End Sub
Diese Beschränkung gilt nur die Delete-Funktion, wenn ich statt

ActiveCell.Characters(z, 1).Delete

den Befehl

ActiveCell.Characters(z, 1).Font.Bold = True

verwende, funktioniert es wunderbar auch bei mehr als 256 Zeichen.
Hat jemand eine Idee, wie ich diese Beschränkung umgehen kann. Gern auch ein anderer Lösungsansatz, immer unter Beibehaltung der unterschiedlichen Formatierung des Zell-Textes (Farbe, Form, etc.)
Danke und Gruß
Mirko

AW: Einzelne Zeichen aus Zelle löschen...
Nepumuk

Hallo,
bei mir löscht dein Makro bei längeren Zelleinträgen nichts mehr und damit laufe ich in eine Endlosschleife. Ist Rot und Durchgestrichen das einzige Ausnahmeformat oder gibt's noch andere die unbedingt erhalten bleiben müssen?
Gruß
Nepumuk

AW: Einzelne Zeichen aus Zelle löschen...
Mirko

Ja, kursiv und fett, kommt auch vor, sollte also auch erhalten bleiben. Nur Rot-durchgestrichen soll aus der Zelle entfernt werden.

AW: Einzelne Zeichen aus Zelle löschen...
Gerd

Hallo,
ich sehe da eher ein Problem beim verwendeten Schleifenkonstrukt mit eingebauter Zählerreduzierung als 257 u. mehr Zeichen.
Sub CharDelete2()
Dim ChAnz As Long, Z As Long
With ActiveCell
ChAnz = .Characters.Count
For Z = ChAnz To 1 Step -1
With .Characters(Z, 1)
If .Font.ColorIndex = 3 Then
If .Font.Strikethrough = True Then
.Delete
End If
End If
End With
Next
End With
End Sub
Gruß Gerd

AW: Einzelne Zeichen aus Zelle löschen...
Nepumuk

Hallo Gerd,
selbes Ergebnis, bei mehr wie 256 Zeichen in der Zelle läuft die Delete-Methode ins Leere. Sprich es wird kein Zeichen gelöscht. Ich hab Excel 2013.
Gruß
Nepumuk

AW: Einzelne Zeichen aus Zelle löschen...
Mirko

Hallo Gerd,
Danke für deine Antwort. Ich glaube allerdings nicht das die Schleife das Problem ist, auch wenn sie in der Tat nicht optimal ist.
Es ist einfach nicht möglich ein Zeichen oder eine Zeichenkette mit Hilfe der Characters.Delete-Eingenschaft zu löschen, wenn die Zelle mehr als 256 Zeichen enthält. Ich hab es mit allen Excel-Versionen von 2003-2013 versucht, ohne Erfolg.
Gruß Mirko

AW: Einzelne Zeichen aus Zelle löschen...
Daniel

Hi
wenn das direkte Löschen der Zeichen nicht funktioniert,
dann probiers mal mit folgendem Workaround:
1. merke dir in einer Schleife für jeden Buchstaben der nicht gelöscht werden soll den den Buchstaben und die benötigten Formate (du musst für jede relevante Formatart eine Variable anlegen)
2. schreibe dein neuen Text in die Zelle und formatiere entsprechend den gespeicherten Werten:
hier der Code dazu:

Sub RotDgEntfernen()
Dim txt1 As String, txt2 As String
Dim i As Long, x As Long
'--- zu speichernde Formate
Dim FoFarbe() As Long
Dim FoFett() As Boolean
Dim FoItalic() As Boolean
Dim FoSize() As Long
txt1 = Zelle.Value
With ActiveCell
txt1 = .Text
ReDim FoFarbe(1 To Len(txt1))
ReDim FoFett(1 To Len(txt1))
ReDim FoItalic(1 To Len(txt1))
ReDim FoSize(1 To Len(txt1))
'--- Format und Text Speichern
For i = 1 To Len(txt1)
With .Characters(i, 1).Font
If .Strikethrough = True And .ColorIndex = 3 Then
Else
x = x + 1
txt2 = txt2 & .Parent.Text
FoFarbe(x) = .ColorIndex
FoFett(x) = .Bold
FoItalic(x) = .Italic
FoSize(x) = .Size
End If
End With
Next
'--- neuen Text in Zelle schreiben
.Value = txt2
'--- Zeichen formatieren
For i = 1 To Len(txt2)
With .Characters(i, 1).Font
.ColorIndex = FoFarbe(i)
.Bold = FoFett(i)
.Italic = FoItalic(i)
.Size = FoSize(i)
End With
Next
End With
End Sub
Gruß Daniel

AW: Einzelne Zeichen aus Zelle löschen...
Mirko

Hallo Daniel,
Danke für die Antwort. Ja, an die Variante alle Zeicheninformationen zu sichern, hatte ich auch schon gedacht, hatte aber bisher den Aufwand gescheut. Zudem wird diese Variante sicherlich etwas weniger performant sein. Es handelt sich um mehrere Dateien, die viele Texte und oft auch mehrere Blätter enthalten. Ich werde aber wohl nicht um diese Variante rumkommen.
Gruß Mirko

AW: Einzelne Zeichen aus Zelle löschen...
Daniel

Hi
schneller und Performanter wäre sicherlich, die Formatierung nicht für jedes Zeichen einzeln zu sichern, sonderen so wie die formatierung auch gesetzt wird mit von-bis.
aber hierfür wird der Programmieraufwand sicherlich höher sein.
Gruß Daniel

Tja, dann mach mal, ...
Luc:-?

…Mirko! ;-)
Was heißt weniger performant? Weniger als gar nichts und dafür 'ne Endlosschleife…? ;->
Das folgende Bsp zu erzeugen, hat kaum 'ne Sekunde erfordert, obwohl viel mehr Formatie­rungens­items abgefragt wurden (das Schreiben des Pgms allerdings wesentlich mehr!):
 A
10Hallo, ich habe ein kleines Problem. Ich habe eine Zelle mit Text, aus der ich mittels VBA bestimmte Zeichen löschen muss. Hierbei ist jedoch nicht das Zeichen selbst, sondern die Formatierung des Zeichens ausschlaggebend.
Beispiel: Eine Zelle enthält überwiegend schwarzen Text, innerhalb des Textes gibt es aber rot-durchgestrichene Wörter. Diese sollen entfernt werden. Daher arbeite ich mit der Cells.Character-Eigenschaft. Solange die Zelle Text unterhalb von 256 Zeichen beinhaltet, funktioniert alles wunderbar, aber ab 257 Zeichen passiert
entweder nichts oder es gibt den Fehler 1004.

Gruß, Luc :-?

Stringlänge
lupo1

http://www.xlam.ch/xlimits/ (Limit Nr. 9) sagt:
"mal 37676, mal 1024, mal 256 Zeichen Länge in Excel, Unterschiede in einzelnen Versionen ... eigene VBA-Sektion siehe dort"
256 Zeichen in VBA ist jedenfalls eine häufige max. Stringlängengrenze. Z.B. xl2000, VBA-Function mit String-Argument UND -Rückgabewert. Die Rückgabe des durch die Function verlängerten Strings klappt noch über 256 Zeichen, aber dann als Argument in der nächsten Funktion nicht mehr (aber nicht zuverlässig, manchmal rutscht die Grenze etwas höher).
Vermutlich gesichert: Teilformatierte Strings haben "kleiner gleich große" Möglichkeiten wie ganzformatierte.

AW: Einzelne Zeichen aus Zelle löschen...
haw

Hallo Mirko,
eine weitere Möglichkeit:
Sub CharDelete_2()
Dim ChAnz%, z%, tmp$, x$
ChAnz = ActiveCell.Characters.Count
x = ActiveCell.Value
For z = 1 To ChAnz
If ActiveCell.Characters(z, 1).Font.ColorIndex <> 3 _
And ActiveCell.Characters(z, 1).Font.Strikethrough = False Then
tmp = tmp & Mid(x, z, 1)
End If
Next
ActiveCell.Value = tmp
End Sub
Gruß
Heinz

AW: Einzelne Zeichen aus Zelle löschen...
Mirko

Hallo Heinz,
danke für deinen Lösungsvorschlag, doch leider geht die Formatierung der anderen Texte, welche nicht gelöscht werden verloren. Du speicherst in der Variable "tmp" ja nur das Zeichen, aber keine Fontinformation (Farbe, Fett, kursiv etc.).
Danke Trotzdem und Gruß
Mirko

Einzelne Zeichen aus Zelle löschen...
Mirko

Hallo,
ich habe ein kleines Problem.
Ich habe eine Zelle mit Text, aus der ich mittels VBA bestimmte Zeichen löschen muss. Hierbei ist jedoch nicht das Zeichen selbst, sondern die Formatierung des Zeichens ausschlaggebend.
Beispiel:
Eine Zelle enthält überwiegend schwarzen Text, innerhalb des Textes gibt es aber rot-durchgestrichene Wörter. Diese sollen entfernt werden.
Daher arbeite ich mit der Cells.Character-Eigenschaft. Solange die Zelle Text unterhalb von 256 Zeichen beinhaltet funktioniert alles wunderbar, aber ab 257 Zeichen passiert entweder nichts oder, es gibt den Fehler 1004.
Code-Beispiel:
Sub CharDelete()
ChAnz = ActiveCell.Characters.Count
For z = 1 To ChAnz
If ActiveCell.Characters(z, 1).Font.ColorIndex = 3 _
And ActiveCell.Characters(z, 1).Font.Strikethrough = True Then
ActiveCell.Characters(z, 1).Delete
ChAnz = ChAnz - 1
z = z - 1
End If
Next
End Sub
Diese Beschränkung gilt nur die Delete-Funktion, wenn ich statt

ActiveCell.Characters(z, 1).Delete

den Befehl

ActiveCell.Characters(z, 1).Font.Bold = True

verwende, funktioniert es wunderbar auch bei mehr als 256 Zeichen.
Hat jemand eine Idee, wie ich diese Beschränkung umgehen kann. Gern auch ein anderer Lösungsansatz, immer unter Beibehaltung der unterschiedlichen Formatierung des Zell-Textes (Farbe, Form, etc.)
Danke und Gruß
Mirko

AW: Einzelne Zeichen aus Zelle löschen...
Nepumuk

Hallo,
bei mir löscht dein Makro bei längeren Zelleinträgen nichts mehr und damit laufe ich in eine Endlosschleife. Ist Rot und Durchgestrichen das einzige Ausnahmeformat oder gibt's noch andere die unbedingt erhalten bleiben müssen?
Gruß
Nepumuk

AW: Einzelne Zeichen aus Zelle löschen...
Mirko

Ja, kursiv und fett, kommt auch vor, sollte also auch erhalten bleiben. Nur Rot-durchgestrichen soll aus der Zelle entfernt werden.

AW: Einzelne Zeichen aus Zelle löschen...
Gerd

Hallo,
ich sehe da eher ein Problem beim verwendeten Schleifenkonstrukt mit eingebauter Zählerreduzierung als 257 u. mehr Zeichen.
Sub CharDelete2()
Dim ChAnz As Long, Z As Long
With ActiveCell
ChAnz = .Characters.Count
For Z = ChAnz To 1 Step -1
With .Characters(Z, 1)
If .Font.ColorIndex = 3 Then
If .Font.Strikethrough = True Then
.Delete
End If
End If
End With
Next
End With
End Sub
Gruß Gerd

AW: Einzelne Zeichen aus Zelle löschen...
Nepumuk

Hallo Gerd,
selbes Ergebnis, bei mehr wie 256 Zeichen in der Zelle läuft die Delete-Methode ins Leere. Sprich es wird kein Zeichen gelöscht. Ich hab Excel 2013.
Gruß
Nepumuk

AW: Einzelne Zeichen aus Zelle löschen...
Mirko

Hallo Gerd,
Danke für deine Antwort. Ich glaube allerdings nicht das die Schleife das Problem ist, auch wenn sie in der Tat nicht optimal ist.
Es ist einfach nicht möglich ein Zeichen oder eine Zeichenkette mit Hilfe der Characters.Delete-Eingenschaft zu löschen, wenn die Zelle mehr als 256 Zeichen enthält. Ich hab es mit allen Excel-Versionen von 2003-2013 versucht, ohne Erfolg.
Gruß Mirko

AW: Einzelne Zeichen aus Zelle löschen...
Daniel

Hi
wenn das direkte Löschen der Zeichen nicht funktioniert,
dann probiers mal mit folgendem Workaround:
1. merke dir in einer Schleife für jeden Buchstaben der nicht gelöscht werden soll den den Buchstaben und die benötigten Formate (du musst für jede relevante Formatart eine Variable anlegen)
2. schreibe dein neuen Text in die Zelle und formatiere entsprechend den gespeicherten Werten:
hier der Code dazu:

Sub RotDgEntfernen()
Dim txt1 As String, txt2 As String
Dim i As Long, x As Long
'--- zu speichernde Formate
Dim FoFarbe() As Long
Dim FoFett() As Boolean
Dim FoItalic() As Boolean
Dim FoSize() As Long
txt1 = Zelle.Value
With ActiveCell
txt1 = .Text
ReDim FoFarbe(1 To Len(txt1))
ReDim FoFett(1 To Len(txt1))
ReDim FoItalic(1 To Len(txt1))
ReDim FoSize(1 To Len(txt1))
'--- Format und Text Speichern
For i = 1 To Len(txt1)
With .Characters(i, 1).Font
If .Strikethrough = True And .ColorIndex = 3 Then
Else
x = x + 1
txt2 = txt2 & .Parent.Text
FoFarbe(x) = .ColorIndex
FoFett(x) = .Bold
FoItalic(x) = .Italic
FoSize(x) = .Size
End If
End With
Next
'--- neuen Text in Zelle schreiben
.Value = txt2
'--- Zeichen formatieren
For i = 1 To Len(txt2)
With .Characters(i, 1).Font
.ColorIndex = FoFarbe(i)
.Bold = FoFett(i)
.Italic = FoItalic(i)
.Size = FoSize(i)
End With
Next
End With
End Sub
Gruß Daniel

AW: Einzelne Zeichen aus Zelle löschen...
Mirko

Hallo Daniel,
Danke für die Antwort. Ja, an die Variante alle Zeicheninformationen zu sichern, hatte ich auch schon gedacht, hatte aber bisher den Aufwand gescheut. Zudem wird diese Variante sicherlich etwas weniger performant sein. Es handelt sich um mehrere Dateien, die viele Texte und oft auch mehrere Blätter enthalten. Ich werde aber wohl nicht um diese Variante rumkommen.
Gruß Mirko

AW: Einzelne Zeichen aus Zelle löschen...
Daniel

Hi
schneller und Performanter wäre sicherlich, die Formatierung nicht für jedes Zeichen einzeln zu sichern, sonderen so wie die formatierung auch gesetzt wird mit von-bis.
aber hierfür wird der Programmieraufwand sicherlich höher sein.
Gruß Daniel

Tja, dann mach mal, ...
Luc:-?

…Mirko! ;-)
Was heißt weniger performant? Weniger als gar nichts und dafür 'ne Endlosschleife…? ;->
Das folgende Bsp zu erzeugen, hat kaum 'ne Sekunde erfordert, obwohl viel mehr Formatie­rungens­items abgefragt wurden (das Schreiben des Pgms allerdings wesentlich mehr!):
 A
10Hallo, ich habe ein kleines Problem. Ich habe eine Zelle mit Text, aus der ich mittels VBA bestimmte Zeichen löschen muss. Hierbei ist jedoch nicht das Zeichen selbst, sondern die Formatierung des Zeichens ausschlaggebend.
Beispiel: Eine Zelle enthält überwiegend schwarzen Text, innerhalb des Textes gibt es aber rot-durchgestrichene Wörter. Diese sollen entfernt werden. Daher arbeite ich mit der Cells.Character-Eigenschaft. Solange die Zelle Text unterhalb von 256 Zeichen beinhaltet, funktioniert alles wunderbar, aber ab 257 Zeichen passiert
entweder nichts oder es gibt den Fehler 1004.

Gruß, Luc :-?

Stringlänge
lupo1

http://www.xlam.ch/xlimits/ (Limit Nr. 9) sagt:
"mal 37676, mal 1024, mal 256 Zeichen Länge in Excel, Unterschiede in einzelnen Versionen ... eigene VBA-Sektion siehe dort"
256 Zeichen in VBA ist jedenfalls eine häufige max. Stringlängengrenze. Z.B. xl2000, VBA-Function mit String-Argument UND -Rückgabewert. Die Rückgabe des durch die Function verlängerten Strings klappt noch über 256 Zeichen, aber dann als Argument in der nächsten Funktion nicht mehr (aber nicht zuverlässig, manchmal rutscht die Grenze etwas höher).
Vermutlich gesichert: Teilformatierte Strings haben "kleiner gleich große" Möglichkeiten wie ganzformatierte.

AW: Einzelne Zeichen aus Zelle löschen...
haw

Hallo Mirko,
eine weitere Möglichkeit:
Sub CharDelete_2()
Dim ChAnz%, z%, tmp$, x$
ChAnz = ActiveCell.Characters.Count
x = ActiveCell.Value
For z = 1 To ChAnz
If ActiveCell.Characters(z, 1).Font.ColorIndex <> 3 _
And ActiveCell.Characters(z, 1).Font.Strikethrough = False Then
tmp = tmp & Mid(x, z, 1)
End If
Next
ActiveCell.Value = tmp
End Sub
Gruß
Heinz

AW: Einzelne Zeichen aus Zelle löschen...
Mirko

Hallo Heinz,
danke für deinen Lösungsvorschlag, doch leider geht die Formatierung der anderen Texte, welche nicht gelöscht werden verloren. Du speicherst in der Variable "tmp" ja nur das Zeichen, aber keine Fontinformation (Farbe, Fett, kursiv etc.).
Danke Trotzdem und Gruß
Mirko

Bewerten Sie hier bitte das Excel-Portal