Ist fetter Text in einer Zelle?

Hallo VBA-ler,

ich möchte mir in Excel VBA eine Funktion schreiben, die mir angibt, ob in der aktiven Zelle Teile des Textes (oder der ganze Text) fett formatiert ist. Ich habe das so gelöst, was auch funktioniert:

Sub f()
 MsgBox fett(ActiveCell)
End Sub

Function fett(zelle As Range) As Boolean
 Dim pos As Long

 fett = False
 For pos = 1 To Len(zelle.Value)
 fett = fett Or (zelle.Characters(Start:=pos, Length:=1).Font.FontStyle = "Fett")
 Next pos
End Function

Allerdings finde ich es unschön, dass ich hier eine Schleife benutzen muss. Das macht das Ganze doch recht langsam, wenn es sehr viele Zellen sind.
Gibt es eine bessere/schnellere Lösung? Ich habe schon bei der Excel4-Funktion ZELLE.ZUORDNEN geschaut. Die kann aber nur feststellen, ob das erste oder alle Zeichen fett sind. Beginnt die „Fettigkeit“ irgendwo mitten im Text, geht’s nicht.

Experten vor!

Danke und Gruß,
Andreas

Allerdings finde ich es unschön, dass ich hier eine Schleife
benutzen muss. Das macht das Ganze doch recht langsam, wenn es
sehr viele Zellen sind.
Gibt es eine bessere/schnellere Lösung? Ich habe schon bei der
Excel4-Funktion ZELLE.ZUORDNEN geschaut.

Hallo Andreas,

ich kenne bei XL4-makros auch bei ZELLE.ZUORDNEN nur die Nummer 20.
In meiner bescheidenen Expertenklasse kann ich nur eweng den Code
tunen.
Probiere es mal so:

Function fett(zelle As Range) As Boolean
Dim pos As Integer
For pos = 1 To Len(zelle.Value)
 If zelle.Characters(Start:=pos, Length:=1).Font.FontStyle = "Fett" Then
 fett = True
 Exit For
 End If
Next pos
End Function

Experten vor!

Sehe ich genauso in dem Fall, respektvoll zurücktret :smile:)

Was (ungetestet) evtl. klappen könnte. Du willst ja nicht pro Zelle
eine Msgbox *gg* aber anscheinend eine Funktion fett() die du
benutzen kannst um zu welchem Zweck auch immer mit
=fett(A1) in B1 stehen zu haben ob in A1 was dickes ist.
Dies natürlich für A1:A500.000 pro Zelle.
In der tat kann das dauern.

Wie wäre es denn du nutzt das Worksheet_SelectioonChange aus?
Du überwachst die Zellen in A. Betrittst du eine so wird beim
Betreten-Ereignis von beispielsweise A65536 in einem Hilfsblatt
in Zelle A65536 festgehalten ob die Zelle fetten Anteil hat.
Beim Verlassen der Zelle (=Anspringen einer neuen Zelle, wird
vom Code nochmals das Fette von A65536 überprüft und im
Hilfsblatt notiert.

Das kostet wenig zeit und du hast im Hilfsblatt einen aktuellen
weight watcher Stand über A.

Gruß
Reinhard

Grüezi Andreas

Allerdings finde ich es unschön, dass ich hier eine Schleife
benutzen muss. Das macht das Ganze doch recht langsam, wenn es
sehr viele Zellen sind.

Wie Reinhard schon zeigte kannst Du ja die Schleife verlassen sobald das erste fette Zeichen gefunden worden ist. Es ist nicht notwendig alle weiteren Zeichen ebenfalls zu prüfen.

Gibt es eine bessere/schnellere Lösung?

Nein, die gibt es nicht - einzeln formatierte Zeichen in einer Zelle kannst Du auch nur einzeln prüfen und das braucht ein wenig Zeit.

Experten vor!

…die helfen hier auch nix… :wink:

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hallo Andreas

ich habe folgendes beobachtet (Excel 2010):

ein kurzer Code:

Private Sub CommandButton1_Click()
Laenge = Len(Cells(2, 2).Text)
If ActiveCell.Characters(1, Laenge).Font.Bold Then Cells(2, 4) = „true“
End Sub

Die Zelle 2,2 muß natürlich markiert sein, bevor das Makro startet.

Wenn ich z.B. bei „if“ eine Stopmarke setze und mir dann im Debugger den Überwachungsausdruck „ActiveCell.Characters(1, Laenge).Font.Bold“ ansehe, steht dort bei

Inhalt Cells(2,2) = fett: wahr
Inhalt Cells(2,2) = standard: falsch
nur 1 Buchstabe aus Cells(2,2) ist fett (egal, welcher): null

Da ich nicht weiß, wie ich die null abfragen soll, kann ich hierfür keinen Code schreiben, aber zumindest unterscheidet VBA zwischen den 3 Fällen „alles fett“ - „alles standard“ - „nur teilweise fett“.

Vielleicht hilft es Dir weiter.

Gruß
Pauli

Ergänzung
folgender Code erkennt die 3 eben genannten Zustände (wenn die Zelle markiert ist):

Private Sub CommandButton1_Click()
Laenge = Len(Cells(2, 2).Text)
If ActiveCell.Characters(1, Laenge).Font.Bold Then
Cells(2, 4) = „true“
Else
If ActiveCell.Characters(1, Laenge).Font.Bold = False Then
Cells(2, 4) = „false“
Else
Cells(2, 4) = „truefalse“
End If
End If
End Sub

Gruß
Pauli

1 Like

Grüezi Pauli

Private Sub CommandButton1_Click()
Laenge = Len(Cells(2, 2).Text)
If ActiveCell.Characters(1, Laenge).Font.Bold Then Cells(2, 4)
= „true“
End Sub

Die Zelle 2,2 muß natürlich markiert sein, bevor das Makro
startet.

Wenn Du die Zelle bei der Abfrage auch direkt ansprichst, ist die Markierung derselben nicht notwendig.

Jedoch funktioniert das Ganze nur dann, wenn die ganze Zelle fett formatiert ist. Sind es nur einzelne Zeichen davon, liefert der Code immer ‚False‘ zurück.

Daher muss eben in einer Schleife jedes einzelne Zeichen geprüft werden, daran kommen wir hier nicht vorbei.

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Grüezi Pauli nochmals

Jedoch funktioniert das Ganze nur dann, wenn die ganze Zelle
fett formatiert ist. Sind es nur einzelne Zeichen davon,
liefert der Code immer ‚False‘ zurück.

Daher muss eben in einer Schleife jedes einzelne Zeichen
geprüft werden, daran kommen wir hier nicht vorbei.

Und hier korrigiere ich mich gerne - die Abfrage auf ‚Null‘ also ohne Ergebnis wenn nur ein einzelnes Zeichen Fett formatiert ist funktioniert in der Tat, das hatte ich so nicht vermutet und bisher auch nicht gewusst.

Ich habe den Code mal so umgeschrieben, damit entfällt dann zumindest das vorherige Markieren der Zelle:

Sub tr\_Bold()
 With Range("A1")
 Select Case .Characters(1, Len(.Text)).Font.Bold
 Case True
 MsgBox "Zelle komplett fett formatiert"
 Case False
 MsgBox "Zelle nicht fett formatiert"
 Case Else
 MsgBox "Zelle teilweise fett formatiert"
 End Select
 End With
End Sub

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Danke an alle!
Ihr seid klasse!
Dass das ohne Schleife funktioniert, hätte ich nicht gedacht. ich bin begeistert.

Gruß, Andreas

Inhalt Cells(2,2) = fett: wahr
Inhalt Cells(2,2) = standard: falsch
nur 1 Buchstabe aus Cells(2,2) ist fett (egal, welcher): null

Da ich nicht weiß, wie ich die null abfragen soll,

Hallo Pauli,

auf Null kann man so prüfen:

Sub test()
MsgBox Pruef(Range("A1"))
End Sub

Function Pruef(Zelle As Range) As Boolean
With Zelle.Characters(, Len(Zelle.Text)).Font
 Pruef = IsNull(.Bold) Or .Bold
End With
End Function

Gruß
Reinhard