У меня есть 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 не будет выполнена.

Есть ли способ выполнить команду autofit в функции после возврата?
Или я мог бы использовать совершенно другой подход?

2 ответа2

0

Функции не могут ничего изменить в 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, насколько я знаю. Так было всегда.

0

Если вы не хотите автоматически устанавливать весь лист, используйте это в модуле кода Worksheet:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .