Функция Log10 в диапазоне - ошибка несоответствия типа 13 - PullRequest
0 голосов
/ 15 марта 2020

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

Проблема заключается в том, что я хочу преобразовать диапазон данных (xrng и yrng), перенеся журнал в базу 10. Его значение, но когда я пытаюсь использовать функцию Log10 или WorksheetFunction.Log10, указывает, что данные должны быть удваивается, и я получаю ошибку несоответствия типов, если я запускаю код.

Option Explicit

Sub Button7_Click()

    Dim xrng As Range, yrng As Range, lxrng As Range, lyrng 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 c 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")
    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
    R = 1

    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 Value"
    dsws.Range("D1").Value = "k Value"
    dsws.Range("E1").Value = "R Value"

    Do While R < c
        Arr = Application.LogEst(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


Любая помощь будет оценена.

Ответы [ 2 ]

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

Попробуйте этот кусок кода, пожалуйста. Не проверено по понятным причинам. Должен признаться, что я не мог понять, где определение функции Drop range must exist. Its row must be updated for each cell iteration. Looking to the LogEst`, оно получает аргумент типа range. Не Log10, который не может быть применен к диапазону ... Если вам нужно значение логарифми c каждой ячейки диапазона, необходимо выполнить предварительную обработку диапазона.

Sub testLog10()
 Dim ws As Worksheet, dsws As Worksheet, Arr As Variant, Drop As Range
  Set ws = ActiveSheet 'use here your sheet
  dsws = Worksheets("Your sheet") ' use here your sheet name
        Arr = Application.LogEst(ws.Range(ws.Cells(11, 3), ws.Cells(11, 94)), _
                                ws.Range(ws.Cells(201, 3), ws.Cells(201, 94)), True, False)
      Set Drop = dsws.Range("A2")
      Drop.Resize(1, UBound(Arr)).value = Arr
End Sub
0 голосов
/ 15 марта 2020

UNTESTED

заменить:

Arr = Application.LogEst(Log10(yrng), Log10(xrng), True, False)

на:

With Application.WorksheetFunction
   Arr = .LogEst(.Log10(yrng), .Log10(xrng), True, False)
End With

(могут потребоваться другие изменения.)

...