Pregunta Tamaño automático de la celda después del retorno de la función


Tengo un xla con muchas funciones. Básicamente, cada una de estas funciones realiza una búsqueda vertical en otra hoja de trabajo. Aquí hay un ejemplo básico de uno de ellos:

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

Esto permite a los usuarios simplemente llamar a la función con el número del proyecto en la hoja de trabajo y les da la dirección, sin tener que escribir la búsqueda vertical ellos mismos.
Lo que quiero hacer ahora es tener la fila de la celda actual para configurar automáticamente su altura a su contenido. El problema es que, obviamente, esto debe hacerse después de que la celda se haya llenado con la dirección, pero dado que la función finaliza después de la devolución, el comando de autoajuste no se ejecutará.

¿Hay alguna forma de ejecutar el comando autofit en una función después de la devolución?
¿O hay un enfoque completamente diferente que podría usar?


0


origen


Puedes escribir código en Worksheet_calculate evento y se ejecutará cada vez que se vuelva a calcular la hoja. - Máté Juhász
No estoy seguro de qué versión de Excel está utilizando, pero ¿ha mirado el Método de autoaprendizaje? Posiblemente lo agregue al final de su función o lo llame por separado. - CharlieRB
No puede usar una función de hoja de cálculo para alterar algo que no sea el contenido de la celda. Hay una solución alternativa utilizando Application.Evaluate pero no pude hacerlo funcionar con Autofit. Pienso que el Worksheet_calculate el evento es tu mejor apuesta. - Kyle
@ Máté El uso del evento no funciona, ¿es posible que esto solo se aplique a las funciones de la hoja de trabajo, no a las funciones escritas de VBA? - Nils Tiebos
@CharlieRB Estoy usando Excel 2013. Conozco el método Autofit, pero el problema es que no puedo llamarlo dentro de la función, porque cuando los datos se ponen en la celda, la función finaliza, porque este es el retorno. valor. - Nils Tiebos


Respuestas:


Las funciones no pueden cambiar nada en Excel excepto en la celda a la que se llama. Dicho esto, estoy bastante seguro de que una función puede desencadenar una rutina:

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 y msgbox "hola"

Dicho eso, lo que hipocresía haz algo como esto -

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

Entonces, la rutina no puede cambiar la aplicación. Llamada hasta donde yo sé. Siempre ha sido así.


0



Su segundo ejemplo funciona si en lugar de Test() Usas el Worksheet_Calculate() evento para autofit basado en una variable global. Me.Cells(x,1).EntireRow.Autofit - Kyle
@Kyle, sí, lo tengo para trabajar usando Worksheet_Change para poder pasar el objetivo, pero no es consistente. Podría simplemente ponerlo en worksheet_change y dejar que se autoajuste todo lo que sucede, pero eso es débil. Necesitaríamos un método de intersección. - Raystafarian
Creo que, en su mayoría, todos han renunciado a una solución porque el formato condicional hará prácticamente lo que la gente quiere. - Raystafarian


Si no desea configurar automáticamente toda la hoja, use esto en el módulo de código de hoja de trabajo:

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

0