Excel VBA Функция для переключения между диапазонами и измерения нескольких корреляций - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь создать функцию Excel VBA, которая циклически перебирает cycle_range и вычисляет корреляцию каждого диапазона из 5 записей в этом диапазоне до base_range из 5 записей в ячейках.Функция должна возвращать максимальную корреляцию в cycle_range.Например, следующие данные должны возвращать выход 0.506 ....., поскольку второй набор номеров диапазона циклов, 7, 8, 9, 0, 8, имеет эту корреляцию с базовым диапазоном, который является самой высокой корреляцией:

cycle range     base range       output
     4              3          0.506253796
     7              7   
     8              3   
     9              2   
     0              9   
     8      
     5      
     4  

Код, который у меня есть, приведен ниже, он не работает.Ясно, что есть проблема с добавлением rng и элементов вместе из cycle_range, но я не уверен, что делать:

Function best_correl(correl_length As Double, base_range As Range, cycle_range As Range)


Dim i As Double
Dim rng As Range
Dim cycle_range_length As Double
Dim element As Variant
Dim max_correl As Double
Dim curr_correl As Double


cycle_range_length = cycle_range.Count - correl_length


For i = 1 To cycle_range_length

    For element = 1 To correl_length
        rng = rng + element
    Next element

    curr_correl = WorksheetFunction.Correl(base_range, rng)

    If curr_correl > max_correl Then
        max_correl = curr_correl
    End If

Next i


best_correl = max_correl


End Function

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

PS Я тут кое-что набрал - vba передать группу ячеек в качестве диапазона для работы

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018
Function best_correl(correl_length As Double, base_range As Range, cycle_range As Range)

    Dim c As Range
    Dim cycle_range_length As Long
    Dim max_correl As Double
    Dim curr_correl As Double, n As Long, pos as Long

    cycle_range_length = 1 + (cycle_range.Count - correl_length)
    n = 0
    pos = 0
    For Each c In cycle_range.Resize(cycle_range_length, 1).Cells
        n = n + 1             
        curr_correl = WorksheetFunction.Correl(base_range, c.Resize(correl_length, 1))
        If curr_correl > max_correl Then  
            max_correl = curr_correl
            pos = n  
        End If
    Next c

    'best_correl = max_correl '<< max correlation
    best_correl = pos         '<< position of max 

End Function
0 голосов
/ 30 сентября 2018

Я думаю, это то, что вы ищете

Function best_correl(correl_length As Double, base_range As Range, cycle_range As Range)

Dim MyCell As Range
Dim max_correl As Double
Dim curr_correl As Double

For Each MyCell In cycle_range
    curr_correl = Application.WorksheetFunction.Correl(base_range, MyCell)
        If curr_correl > max_correl Then
            max_correl = curr_correl
        End If
Next MyCell

best_correl = max_correl


End Function
...