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
)
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… 
Mit freundlichen Grüssen
Thomas Ramel
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 „Gefällt mir“
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
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
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