Использование функции LinEst и возвращаемых значений в столбце переменной длины - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь использовать функцию LinEst, чтобы взять значения из диапазона строк данных и ввести их в новый лист под некоторыми заголовками. Я хочу сделать это только для определенного количества строк (до номера строки, определенного как "c". Мои навыки VBA очень просты c.

Sub Button7_Click()

Sheets.Add.Name = "Down Sweep Power Law"

 Dim xrng As Range, yrng As Range
    Dim i As Long
    Dim Rng As Range
    Dim l As Long
    Dim k As Long
    Dim i2 As Long
    Dim c As Long
    Dim j As Long
    Dim drop As Range
    Dim drop2 As Range
    Dim DownSweep As Chart, UpSweep As Chart, cht As Chart
    Dim ws As Worksheet, smallest
    Dim dsws As Worksheet

    Set ws = Worksheets("Template") '<< use variables for worksheets!

    Set dsws = Worksheets("Down Sweep Power Law")

    Set Rng = ws.Range(ws.Range("B11"), ws.Range("B11").End(xlDown))

    smallest = WorksheetFunction.Small(Rng, 1)
    l = Rng.Find(what:=smallest, LookIn:=xlValues, lookat:=xlWhole).Row
    k = Rng.Rows.Count

    c = l - 10

    Set xrng = ws.Range("C11:CP11")
    Set yrng = ws.Range("C201:CP201")
    Set drop = dsws.Range("A2")
    Set x2rng = xrng.Offset(1, 0)
    Set y2rng = yrng.Offset(1, 0)
    Set drop2 = drop.Offset(1, 0)

dsws.Range("A1").Value = "(n-1) Value"
dsws.Range("B1").Value = "log(k) Value"
dsws.Range("C1").Value = "(n-1) Value"
dsws.Range("D1").Value = "n Value"
dsws.Range("E1").Value = "R Value"

If i < c Then

Set drop = Application.LinEst(Log10(yrng), Log10(xrng), True, False)

i = i + 1

End If

ITERATE:

If i < c Then

Set drop2 = Application.LinEst(Log10(y2rng), Log10(x2rng), True, False)

x2rng = x2rng.Offset(1, 0)
y2rng = y2rng.Offset(1, 0)
drop2 = drop2.Offset(1, 0)
i = i + 1
GoTo ITERATE

End If


End Sub


, код выполняется, но когда я go на созданном листе, ошибка #NAME (2029) и никакие значения отсутствуют.

Есть ли способ исправить это?

Любая помощь будет признательна.

1 Ответ

0 голосов
/ 15 марта 2020

Я думаю, что вы пропустили шаг в вашем плане. LinEst возвращает массив, и вы хотите присвоить значения в этом массиве диапазону Drop. Вы не можете назначить массив непосредственно диапазону. Пожалуйста, попробуйте этот код.

Option Explicit

Sub Button7_Click()

    Dim xrng As Range, yrng As Range
    Dim Drop As Range
    Dim Arr As Variant                          ' LinEst result array
    Dim Rng As Range
    Dim R As Long
    Dim l As Long
    Dim k As Long
    Dim i2 As Long
    Dim c As Long
    Dim j As Long
    Dim DownSweep As Chart, UpSweep As Chart, cht As Chart
    Dim ws As Worksheet, Smallest As Variant
    Dim dsws As Worksheet

    Set ws = Worksheets("Template") '<< use variables for worksheets!
    Sheets.Add.Name = "Down Sweep Power Law"
    Set dsws = Worksheets("Down Sweep Power Law")
    Set Rng = ws.Range(ws.Range("B11"), ws.Range("B11").End(xlDown))

    Smallest = WorksheetFunction.Small(Rng, 1)
    l = Rng.Find(what:=Smallest, LookIn:=xlValues, LookAt:=xlWhole).Row
    k = Rng.Rows.Count
    c = l - 10

    Set xrng = ws.Range("C11:CP11")
    Set yrng = ws.Range("C201:CP201")
    Set Drop = dsws.Range("C2:CP2").Offset(0, -2)

    dsws.Range("A1").Value = "(n-1) Value"
    dsws.Range("B1").Value = "log(k) Value"
    dsws.Range("C1").Value = "(n-1) Value"
    dsws.Range("D1").Value = "n Value"
    dsws.Range("E1").Value = "R Value"

    Do While R < c
        Arr = Application.LinEst(Log10(yrng), Log10(xrng), True, False)
        Drop.Value = Arr    ' or perhaps: = Application.Transpose(Arr)
        Set xrng = xrng.Offset(1, 0)
        Set yrng = yrng.Offset(1, 0)
        Set Drop = Drop.Offset(1, 0)
        R = R + 1
    Loop
End Sub

Я не знаю, какой массив вернет LinEst. Возможно, вам придется транспонировать результат.

Я также пытался улучшить ваше управление диапазонами. Тем не менее, код полностью не проверен, из-за отсутствия данных. В моем коде могут быть логические ошибки, а также опечатки, но синтаксис должен быть надежным. Возможно, вам не удастся пройти весь путь до финиша sh, но я надеюсь, что это поможет вам в вашем квесте.

...