Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Интерполяция одномерного масива - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Интерполяция одномерного масива (Макросы/Sub)
Интерполяция одномерного масива
Odesey Дата: Понедельник, 14.12.2015, 03:35 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добрый день!
У меня возникла проблема с интерполяцией одномерного массива данных. Если значения находятся в обычных ячейках то код работает, а если в разных то выдает не понятно какой результат(значение функции лежит между нужными аргументами но отличается от нужного на +- 10-15%). Код привожу ниже. Прошу помочь исправить данный код или посоветовать другой. Проблему долго пытался решить своими силами - не вышло.

[vba]
Код
Option Explicit

Function Interp(a As Range, Arng As Range, Krng As Range) As Single
Dim al, ks, i As Integer
al = Arng.Value: ks = Krng.Value
Do
    i = i + 1
Loop While al(i, 1) < a.Value
'If i = 1 Then Exit Function
If al(i, 1) = a.Value Then
    Interp = ks(i, 1)
Else
    Interp = (ks(i, 1) - ks(i - 1, 1)) / (al(i, 1) - al(i - 1, 1)) * _
             (a.Value - al(i - 1, 1)) + ks(i - 1, 1)
End If
End Function
[/vba]

[p.s.] Заранее благодарен.[/p.s.]
[moder]Что-то странное у Вас. Покажите в файле.
К сообщению приложен файл: example.xlsx (9.9 Kb)


Сообщение отредактировал Odesey - Понедельник, 14.12.2015, 10:42
 
Ответить
СообщениеДобрый день!
У меня возникла проблема с интерполяцией одномерного массива данных. Если значения находятся в обычных ячейках то код работает, а если в разных то выдает не понятно какой результат(значение функции лежит между нужными аргументами но отличается от нужного на +- 10-15%). Код привожу ниже. Прошу помочь исправить данный код или посоветовать другой. Проблему долго пытался решить своими силами - не вышло.

[vba]
Код
Option Explicit

Function Interp(a As Range, Arng As Range, Krng As Range) As Single
Dim al, ks, i As Integer
al = Arng.Value: ks = Krng.Value
Do
    i = i + 1
Loop While al(i, 1) < a.Value
'If i = 1 Then Exit Function
If al(i, 1) = a.Value Then
    Interp = ks(i, 1)
Else
    Interp = (ks(i, 1) - ks(i - 1, 1)) / (al(i, 1) - al(i - 1, 1)) * _
             (a.Value - al(i - 1, 1)) + ks(i - 1, 1)
End If
End Function
[/vba]

[p.s.] Заранее благодарен.[/p.s.]
[moder]Что-то странное у Вас. Покажите в файле.

Автор - Odesey
Дата добавления - 14.12.2015 в 03:35
Roman777 Дата: Понедельник, 14.12.2015, 11:25 | Сообщение № 2
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
Odesey, Проблема в том, что у Вас в массиве, при объединённых ячейках, получаются некоторые строки пустые "" - принимают нулевые значения, поэтому и счёт идёт неверный. Я бы создавал массив отдельно и записывал данные в него по условию непустых ячеек:
[vba]
Код
Function Interp(a As Range, Arng As Range, Krng As Range) As Single
Dim al, ks, i As Integer, i1_n As Integer, i2_n As Integer
Dim Arng1() As Single, Krng1() As Single
Dim cel As Range
For Each cel In Arng
If cel <> "" Then
    i1_n = i1_n + 1
    ReDim Preserve Arng1(i1_n)
    Arng1(i1_n) = cel
End If
Next cel
For Each cel In Krng
If cel <> "" Then
    i2_n = i2_n + 1
    ReDim Preserve Krng1(i2_n)
    Krng1(i2_n) = cel
End If
Next cel
Do
    i = i + 1
Loop While Arng1(i) < a.Value
'If i = 1 Then Exit Function
If Arng1(i) = a.Value Then
    Interp = Krng1(i)
Else
    Interp = (Krng1(i) - Krng1(i - 1)) / (Arng1(i) - Arng1(i - 1)) * _
            (a.Value - Arng1(i - 1)) + Krng1(i - 1)
End If
End Function
[/vba]


Много чего не знаю!!!!
 
Ответить
СообщениеOdesey, Проблема в том, что у Вас в массиве, при объединённых ячейках, получаются некоторые строки пустые "" - принимают нулевые значения, поэтому и счёт идёт неверный. Я бы создавал массив отдельно и записывал данные в него по условию непустых ячеек:
[vba]
Код
Function Interp(a As Range, Arng As Range, Krng As Range) As Single
Dim al, ks, i As Integer, i1_n As Integer, i2_n As Integer
Dim Arng1() As Single, Krng1() As Single
Dim cel As Range
For Each cel In Arng
If cel <> "" Then
    i1_n = i1_n + 1
    ReDim Preserve Arng1(i1_n)
    Arng1(i1_n) = cel
End If
Next cel
For Each cel In Krng
If cel <> "" Then
    i2_n = i2_n + 1
    ReDim Preserve Krng1(i2_n)
    Krng1(i2_n) = cel
End If
Next cel
Do
    i = i + 1
Loop While Arng1(i) < a.Value
'If i = 1 Then Exit Function
If Arng1(i) = a.Value Then
    Interp = Krng1(i)
Else
    Interp = (Krng1(i) - Krng1(i - 1)) / (Arng1(i) - Arng1(i - 1)) * _
            (a.Value - Arng1(i - 1)) + Krng1(i - 1)
End If
End Function
[/vba]

Автор - Roman777
Дата добавления - 14.12.2015 в 11:25
Odesey Дата: Понедельник, 14.12.2015, 17:29 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Благодарю, все заработало!=)
 
Ответить
СообщениеБлагодарю, все заработало!=)

Автор - Odesey
Дата добавления - 14.12.2015 в 17:29
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Интерполяция одномерного масива (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!