поместить результаты функции VBA в другую ячейку Excel - PullRequest
0 голосов
/ 02 октября 2019

Мне нужна функция VBA, которая хранит один из своих результатов в ячейке, отличной от ячейки, которая вызывает функцию. Я успешно передал функции адрес этой другой ячейки. Моя функция отлично работает, когда вызывается из другого макроса VBA, но когда моя функция вызывается из ячейки на листе Excel, происходит сбой с #VALUE! в вызывающей ячейке и не помещая ничего в целевую ячейку.

Когда я выполняю свою функцию, я вижу, что она правильно имеет адрес ячейки, в которую я хочу поместить значение.

Sub callMyFunc()     'when I call myFunc this way it works perfectly

    Dim theAddrRang As Range, resp%

    Set theAddrRang = Range("B17")

    resp = myFunc(theAddrRang)

    MsgBox "resp = " & resp

End Sub  



Function myFunc(addrR As Range) As Integer  
                        'If this function is called from worksheet it crashes
    Dim theAddr$, addrRstr$

    addrRstr = addrR.Address

    theAddr = "B14"

    MsgBox "Two address strings: " & addrRstr & "    " & theAddr

    Worksheets("Linda").Range(theAddr).Value = 44      'B14   crashes at this step

    Worksheets("Linda").Range(addrRstr).Value = 66     'B17

    myFunc = 88

End Function       

Я хочу, чтобы функция myFunc поместила значения 44 и 66 в ячейки B14 и B17. Когда я вызываю свою функцию из другого макроса, она работает отлично. Когда я вписываю в ячейку на своем листе следующее: = myFunc (B17), он правильно отображает окно сообщения с двумя адресами, а затем вылетает на следующей строке кода. (Два адреса просто для проверки того, что оба работают; мне действительно нужен только один, переданный в качестве аргумента.)

1 Ответ

1 голос
/ 02 октября 2019

... но здесь есть обходной путь, использующий Evaluate:

Function myFunc(addrR As Range) As Integer

    Dim wb, sht, addr

    'where is the target cell?
    addr = addrR.Address           'cell
    sht = addrR.Parent.Name        'sheet
    wb = addrR.Parent.Parent.Name  'workbook

    'pass the location of the cell to be updated and the value to be inserted
    Application.Evaluate "SetIt(""" & wb & """,""" & sht & """,""" & addr & """,99)"

    myFunc = 88 'return a value to the calling cell

End Function


'Calling this using evaluate seems to bypass the restrictions
'  Excel places on UDF's called from a worksheet
Function SetIt(wb As String, sht As String, addr As String, v)
    Workbooks(wb).Sheets(sht).Range(addr).Value = v
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...