Можем ли мы изменить лист в функции? - PullRequest
0 голосов
/ 06 сентября 2010

Я пытаюсь написать функцию vba, которая принимает диапазон в качестве аргумента и возвращает некоторые коэффициенты на лист.Но когда я пытаюсь что-то написать в свой рабочий лист из функции, я получаю неопределенное значение (#VALUE!).Когда я изменяю функцию на макрос (sub) и жестко кодирую аргументы в функции, это позволяет мне задавать значения на рабочем листе.

' these don't work
Sheets("Sheet1").Cells(4, 1) = x
Sheets("Sheet1").Range(4, 1) = x

Можете ли вы привести простой пример функции, которая принимает диапазонзначений в качестве аргументов, что-то вычисляет и записывает ответы обратно на лист.

Ответы [ 2 ]

1 голос
/ 06 сентября 2010

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

Public Function TestMe(rangeX As Range) As String
    TestMe = "This is a test - " & rangeX.Value
End Function

но произойдет ошибка, если вы попытаетесь повлиять на другие ячейки

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

Public Sub RunTest()
    'A1 and A2'
    Test2 Sheets("Sheet1").Cells(1, 1), Sheets("Sheet1").Cells(2, 1)
End Sub

Public Sub Test2(rangeX as Range, rangeY as Range)
    'write values out to A4 and B4'
    Sheets("Sheet1").Cells(4, 1) = rangeX
    Sheets("Sheet1").Cells(4, 2) = rangeY
End Function
0 голосов
/ 12 сентября 2010

Если вам нужна пользовательская функция, которая возвращает более одного значения, попробуйте использовать функцию массива.
Функция массива вводится путем выбора диапазона ячеек на листе, ввода функции и нажатия Ctrl-Shift-Enter. Результат - введенная вами функция в каждой из выбранных ячеек, обернутая в {}

Ваша пользовательская функция должна затем вернуть массив значений. Например

Function MyArrayFunction(r As Range) As Variant
Dim cl As Range
Dim i As Long, j As Long
Dim v() As Variant

ReDim v(1 To Application.Caller.Rows.Count, 1 To Application.Caller.Columns.Count)
For i = 1 To UBound(v, 1)
    For j = 1 To UBound(v, 2)
        v(i, j) = i * j + r.Value
    Next
Next

MyArrayFunction = v

Функция завершения

Чтобы использовать, выберите диапазон, скажем, A1: B4, введите =MyArrayFunction(D1), нажмите Ctrl-Shift-Enter если D1 содержит 0, результатом будет A1 = 1, B1 = 2, A2 = 2, B2 = 4, A3 = 3, B3 = 6, A4 = 4, B4 = 8

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...