У меня есть xla с кучей функций. По сути, каждая из этих функций выполняет вертикальный поиск на другом рабочем листе. Вот простой пример одной из них:
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
Это позволяет пользователям просто вызывать функцию с номером проекта на рабочем листе, и она выдает им адрес, без необходимости самостоятельно писать вертикальный поиск.
Сейчас я хочу, чтобы строка текущей ячейки автоматически подгоняла высоту под свое содержимое. Проблема в том, что это, очевидно, должно быть сделано после того, как ячейка будет заполнена адресом, но поскольку функция завершается после возврата, команда автоматического подбора не будет выполнена.
Есть ли способ выполнить команду autofit в функции после return?
Или есть совершенно другой подход, который я мог бы использовать?
решение1
Функции не могут ничего изменить в Excel, кроме ячейки, в которой они вызваны. При этом я почти уверен, что функция может запустить процедуру -
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 и msgbox "привет"
При этом, что выне мочьсделать что-то вроде этого -
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
Так что рутина не может изменить application.caller, насколько я знаю. Так было всегда.
решение2
Если вы не хотите автоматически подгонять весь лист, используйте это в модуле кода рабочего листа:
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