Excel 2013: Zelle aus Funktion formatieren

Mnyut

Grünschnabel
Hallo, ich komme gerade nicht weiter, weil ich den Fehler nicht finde:
wie kann ich die Zelle, aus der die Funktion aufgerufen wird, formatieren?

Visual Basic:
Function Test(ByVal Eingabe As String) As String
    Dim Selection As Range
    Set Selection = Application.Caller
    Debug.Print Selection.Address
    Debug.Print Selection.Font.Size
    Selection.Font.Size = 35
    Debug.Print Selection.Font.Size
  
    Test = Eingabe
End Function

Fehlermeldung bekomme ich keine und in der Debug Konsole sehe ich auch, dass ich die richtige Zelle habe und kann auch die Schriftgröße lesen, aber nicht setzen.
 
Zuletzt bearbeitet:
Dein Test ist eine Funktion, die ein Wert zurückgibt für ein Feld. Das sieht man an 'Application.Caller'.
Somit ist beim verlassen des Feldes Excel noch im Wert des Feldes. Da lässt sich nix formatieren
.
VBA Excel Trigger auf einzelnes Feld

Aber du kannst den Change-Event abfangen und dann formatieren.
Erstell dazu im VBA hinter dem Sheet die folgende funktion
Visual Basic:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Formula Like "=Test(*)" Then Target.Font.Size = 24
End Sub
Und im Modul deine Funktion ohne formatierungen
Visual Basic:
Function Test(ByVal Eingabe As String) As String 
    Test = Eingabe
End Function
 
Mit murksen. Mit einer Klasse kann man auf die Events eines anderen Objektes horchen und reagieren

Ich habe mal die Klasse clsListener erstellt
Visual Basic:
Option Explicit

'WorkSheet auf das reagiert wird. Inkl. Zusatz WithEvents
Private WithEvents ws As Worksheet

'/**
' * Klasse initialisieren
' * @param  WorkSheet
' */
Public Sub init(ByRef iWs As Worksheet)
    'Abbrechen falls da der ws bereits richtig verlinkt ist
    If Not ws Is Nothing Then
        If iWs.Name = ws.Name Then Exit Sub
    End If
   
    'WorkSheet setzen
    Set ws = iWs
End Sub

'/**
' * Auf den Chenge-Event des WorkSheets reagieren
' * Hier alle Fledformatierungen hineinprogrammieren
' * @params Range
' */
Private Sub ws_Change(ByVal Target As Range)
    If Target.Formula Like "=Test(*)" Then
        Target.Font.Size = 24
    End If
End Sub

Und im Modul für die Funktionen sthet die Test()
Visual Basic:
Private li As clsListener

Function Test(ByVal Eingabe As String) As String
    'Listener an das ActiveSheet hängen
    If li Is Nothing Then Set li = New clsListener
    li.init ActiveSheet
   
    Test = Eingabe
End Function

Somit brauchst du keinen Code mehr hinter dem Sheet.
 
Das funktioniert wie ich es brauche :)
Vielen Dank!

Gut, dann habe ich heute auch gleich gelernt, wie ich Klassen in Excel verwenden kann^^.
 
Zurück