+ Ответить в теме
Страница 1 из 2
1 2 ПоследняяПоследняя
Показано с 1 по 10 из 11

Тема: VBA: проблема с функцией

  1. #1
    Irbis is on a distinguished road
    Регистрация
    15.10.2006
    Сообщений
    7
    Вес репутации
    0

    По умолчанию VBA: проблема с функцией

    Короче, такая беда.
    Написал функцию линейного интерполирования

    Код :
    1. Function Agp(xt(), yt(), x, n As Integer)
    2. Dim i As Integer, j As Integer, j1 As Integer
    3. For i = 0 To n
    4. If x <= xt(i) Then
    5. GoTo a25
    6. End If
    7. Next i
    8. i = n
    9. a25: j1 = i - 1
    10.      j = i
    11. dy = (x - xt(j1)) / (xt(j) - xt(j1)) * (yt(j) - yt(j1))
    12. Agp = yt(j1) + dy
    13. End Function

    Когда вполняю ее как функцию в ячейке экселя - ввожу диапазон данных и переменные - в результате выдается #ЗНАЧ!

    В самом же VBA эта функция работает (вот пример её вызова и проверки значений)

    Код :
    1. Public xt(0 To 20), yt(0 To 20), n, x
    2. Sub dan()
    3. Open "D:\rez.txt" For Output As #1
    4. For i = 0 To 20
    5. xt(i) = Cells(i + 5, 1)
    6. yt(i) = Cells(i + 5, 2)
    7. Next i
    8. Lint1 = Agp(xt(), yt(), 5.5, 21)
    9. Print #1, Lint1
    10. Close #1
    11. End Sub

    Почему так?
    Как мне заставить работать функцию?

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #2
    Irbis is on a distinguished road
    Регистрация
    15.10.2006
    Сообщений
    7
    Вес репутации
    0

    По умолчанию

    Пришел к выводу, что таким образом не передается массив из ячеек...
    По одной переменные передаются. а массивом - нет...

    Как же мне передать в функцию массив?

  4. #3
    senior developer Sokl is on a distinguished road
    Регистрация
    12.09.2005
    Адрес
    ОМ
    Сообщений
    449
    Вес репутации
    14

    По умолчанию

    Диапазон ячеек - двумерный массив...
    Можно с этим поэкспериментировать:
    Код :
    1. Function My(myArray As Range) As String
    2.     Dim myArrayV As Variant
    3.         myArrayV = myArray
    4.         My = "[" & LBound(myArrayV, 1) & "x" & UBound(myArrayV, 1) & "]" & "[" & LBound(myArrayV, 2) & "x" & UBound(myArrayV, 2) & "]"
    5. End Function

  5. #4
    Irbis is on a distinguished road
    Регистрация
    15.10.2006
    Сообщений
    7
    Вес репутации
    0

    По умолчанию

    Хм... но ведь одну ячейку мы не описываем как одномерный массив!
    Почему тогда несколько сразу становятся двумерным? Разве в функцию не значения самих ячеек передаются?

  6. #5
    senior developer Genyaa is on a distinguished road
    Регистрация
    11.10.2006
    Адрес
    Moscow
    Возраст
    52
    Сообщений
    307
    Вес репутации
    13

    По умолчанию

    Цитата Сообщение от Irbis
    Разве в функцию не значения самих ячеек передаются?
    В Excel на уровне формул в ячейках обычно передаются именно ссылки (адреса) на ячейки и области ячеек. Но в случае несоответствия типов передаваемых данных в аргументах, Excel преобразует данные, так, чтобы функция смогла работать. Именно поэтому, хотя в функциях, созданных пользователем, может быть указано значение переменной в качестве входящего аргумента функции, однако при вызове этой функции на входе ее может быть указана ссылка на ячейку - в этом случае Excel сопоставляет типы данных аргументов и сам решает, что вместо ссылки на ячейку нужно передать ее значение.

    Точно так же, в качестве результата довольно многие встренные функции Excel возвращают не значение, а ссылку (адрес). Так функция ИНДЕКС возвращает именно ссылку, а не значение ячейки. Поэтому такую функцию можно использовать в качестве аргумента для передачи в другую функцию диапазона ячеек. Например, так:

    =СУММ(A1:ИНДЕКС(A2:A500;B2))

    - в этом случае область (размер диапазона) суммирования будет зависеть от того, какое значение в ячейке B2.
    Всякое решение плодит новые проблемы.

  7. #6
    Irbis is on a distinguished road
    Регистрация
    15.10.2006
    Сообщений
    7
    Вес репутации
    0

    По умолчанию

    Ну,, речь и идет только о функциях, определенных пользователем.
    Sokl - тво йрпимер что-то не понял...

  8. #7
    senior developer Genyaa is on a distinguished road
    Регистрация
    11.10.2006
    Адрес
    Moscow
    Возраст
    52
    Сообщений
    307
    Вес репутации
    13

    По умолчанию

    Возможно, Sokl хотел сказать, что стоит Вашу функцию сделать приблизительно такой:

    Код :
    1. Function Agp(xt as Range, yt as Range, x as Single, n As Integer)  'возможно n аргумент вообще не нужен.
    2. Dim i As Integer, j As Integer, j1 As Integer
    3. For i = 1 To xt.Cells.Count
    4. If x <= xt.Cells(i).Value Then
    5. GoTo a25
    6. End If
    7. Next i
    8. i = xt.Cells.Count
    9. a25: j1 = i -1
    10.      j = i
    11. dy = (x - xt.Cells(j1).Value) / (xt.Cells(j).Value - xt.Cells(j1).Value) * (yt.Cells(j).Value - yt.Cells(j1).Value)
    12. Agp = yt.Cells(j1).Value + dy
    13. End Function

    Саму работу функции я не проверял. Просто продствил структуры операндов с областями ячеек (Range). Попробуйте.
    Всякое решение плодит новые проблемы.

  9. #8
    Irbis is on a distinguished road
    Регистрация
    15.10.2006
    Сообщений
    7
    Вес репутации
    0

    По умолчанию

    Genyaa, Спасибо огромное, все понял! (Кстати, заработала с первого раза! )

  10. #9
    senior developer Sokl is on a distinguished road
    Регистрация
    12.09.2005
    Адрес
    ОМ
    Сообщений
    449
    Вес репутации
    14

    По умолчанию

    Irbis, пример мой показывает:
    При передаче в пользовательскую функцию аргумента типа Range можно работать с объектом Range, как говорит Genyaa, т.е. xt.Cells(...).Value, а можно "проглотить" диапазон в переменную Variant и иметь в ней двумерный массив значений исходного диапазона Range. Работать с двумерным массивом, а не с объектом Range.

  11. #10
    senior developer Sokl is on a distinguished road
    Регистрация
    12.09.2005
    Адрес
    ОМ
    Сообщений
    449
    Вес репутации
    14

    По умолчанию

    Вот ещё несколько примеров, можно на досуге поразбираться:
    Код :
    1. Function f(x) ' В качестве аргумента - ссылка на ячейку или значение (текст, число)
    2.     Dim item
    3.         If (IsArray(x)) Then
    4.             For Each item In x
    5.                 f = f & CStr(item) & ";"
    6.             Next
    7.         Else
    8.             f = x
    9.         End If
    10. End Function
    11.  
    12. Function s(x) ' В качестве аргумента - ссылка на дипазон, сумму в которо следует подсчитать, либо число
    13.     Dim item
    14.         If (IsArray(x)) Then
    15.             For Each item In x
    16.                 If IsNumeric(item) Then s = s + item
    17.             Next
    18.         Else
    19.             If IsNumeric(x) Then s = x Else s = CVErr(xlErrNum)
    20.         End If
    21. End Function
    22.  
    23. Function a(ParamArray args() As Variant) ' В качестве аргумента - ссылка на диапазон, сумму в котором следует подсчитать или массив чисел.
    24.     Dim arg
    25.         For Each arg In args
    26.             a = a + s(arg)
    27.         Next
    28. End Function

+ Ответить в теме
Страница 1 из 2
1 2 ПоследняяПоследняя

Похожие темы

  1. Проблема с функцией CountIf (VBA for Excel)!!!
    Проблема с функцией CountIf. Есть таблица с данными: 495 168 168 00623800000042263000 00623800000042263680 00623800000042263680 для подсчета...
    от AleksME в разделе MS Office и VB(A).
  2. Проблема с функцией GetOpenFileName
    Функция GetOpenFileName почему то не работает на машинах с Windows XP Professionsonal. Причем на машинах с Windows XP Home Edition эта же функция...
    от Nata в разделе MS Office и VB(A).
  3. Проблема с пользовательской функцией
    Здраствуйте! Работаю в Excel 2003 Требуется: при определенном значении в ячейке 1 записывать в ячейку 2 определённый текст. Среди...
    от BelkaJul в разделе MS Office и VB(A).
  4. Проблема с функцией chomp
    Суть проблемы Из 1 файла достаются построчно значения вид такой 192.168.0.1\n 192.168.0.2\n 192.168.0.3\n и т.д. После чего значение ipшников...
    от Diver mps в разделе Perl, PHP, ASP ...
  5. Проблемы с функцией
    Подскажите из-за чего функция scan не хотит пахать (пишет ошибку). Есть подозрение, что это не хочет работать for-next (там обоащение к ячейкам)....
    от Azazel в разделе MS Office и VB(A).

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения