Ich habe ein XLA mit einer Reihe von Funktionen. Im Grunde führt jede dieser Funktionen eine vertikale Suche in einem anderen Arbeitsblatt durch. Hier ist ein einfaches Beispiel für eine davon:
Function ax2Project_Address(projectnumber)
If (projectnumber = "?") Then
ax2Project_Address = "Unknown address"
Else
ax2Project_Address = Application.VLookup(projectnumber, Sheets("AX Data").Range("A:K"), 11, False)
End Function
Dadurch können Benutzer die Funktion einfach mit der Projektnummer auf dem Arbeitsblatt aufrufen und erhalten die Adresse, ohne die vertikale Suche selbst schreiben zu müssen.
Was ich jetzt tun möchte, ist, die Höhe der Zeile der aktuellen Zelle automatisch an ihren Inhalt anzupassen. Das Problem ist, dass dies offensichtlich erfolgen sollte, nachdem die Zelle mit der Adresse gefüllt wurde, aber da die Funktion nach der Rückgabe endet, wird der Autofit-Befehl nicht ausgeführt.
Gibt es eine Möglichkeit, den Autofit-Befehl nach der Rückgabe in einer Funktion auszuführen?
Oder gibt es einen völlig anderen Ansatz, den ich verwenden könnte?
Antwort1
Funktionen können in Excel nichts ändern, außer die Zelle, in der sie aufgerufen werden. Davon abgesehen bin ich ziemlich sicher, dass eine Funktion eine Routine auslösen kann -
Option Explicit
Public Function eieio(numb As Long) As Long
eieio = Int(numb / 2)
Test
End Function
Sub Test()
MsgBox ("hi")
End Sub
eieio(12) = 6 und msgbox "hi"
Das heißt, was Siekippentun, ist so etwas wie dies -
Option Explicit
Public Function eieio(numb As Long) As Long
eieio = Int(numb / 2)
Test
End Function
Sub Test()
Dim str As String
str = Application.Caller.Address
Dim rng As Range
Set rng = Range(str)
MsgBox (rng.Address)
rng.EntireRow.AutoFit
End Sub
Die Routine kann also den application.caller nicht ändern, soweit ich weiß. Das war schon immer so.
Antwort2
Wenn Sie nicht das gesamte Blatt automatisch anpassen möchten, verwenden Sie Folgendes im Arbeitsblatt-Codemodul:
Private Sub Worksheet_Calculate()
Dim a As Range
For Each a In Me.UsedRange
If a.Formula Like "=ax2Project_Address(*" Then a.EntireRow.AutoFit
Next a
End Sub