2016-04-13 2 views
0

Новое для VBA и получило эту ошибку классификатора для кода, который должен рассчитать наклон двух массивов и поместить его в столбец с заданным адресом.Недопустимая ошибка квалификатора с функцией наклона

Бьет меня до сих пор, так что было бы неплохо помочь! Размеры массивов соответствуют.

Ошибка компиляции дается в .Slope в TargetSheet.Cells(n, (MyRange.Columns.Count) + 1).Value = Application.WorksheetFunction.Slope(TargetSheet.Range(TargetSheet.Cells(n, 5), TargetSheet.Cells(n, MyRange.Columns.Count)), TargetSheet.Range(TargetSheet.Cells(1, 5), TargetSheet.Cells(1, MyRange.Columns.Count))).Value

Dim n As Long 
Dim MyRange As Range 
Set MyRange = ActiveSheet.UsedRange 
Dim TargetSheet As Worksheet, SourceSheet As Worksheet 
Dim TargetBook As Workbook 

Set TargetBook = Application.ActiveWorkbook 
Set TargetSheet = Application.ActiveSheet 

For n = 3 To MyRange.Rows.Count 

    TargetSheet.Cells(n, (MyRange.Columns.Count) + 1).Value = Application.WorksheetFunction.Slope(TargetSheet.Range(TargetSheet.Cells(n, 5), TargetSheet.Cells(n, MyRange.Columns.Count)), TargetSheet.Range(TargetSheet.Cells(1, 5), TargetSheet.Cells(1, MyRange.Columns.Count))).Value 

Next n 

End With 
End Sub 

A версии перед этим (не может отменить до этого момента: /) работает до сих точки, где он остановился и дал ошибка классификатора. Я использовал функцию SLOPE Excel в наборе данных и сравнивал ее рядом: она давала эту ошибку с результатом # DIV/0 (но VBA этого не показывал).

+0

Удалить «.Value» из вызова функции «Склон». – OldUgly

ответ

0

Thanks @OldUgly! Удалось устранить ошибку. Причина для VBA: автоматизировать несколько листов данных в том же формате с переменным номером. столбцов и строк.

WorksheetFunction.Slope не нравится, когда есть только одна точка данных, а остальная часть одного массива пуста.

Я создал еще один цикл для подсчета непустых ячеек в цикле For для каждой строки. Если нет. непустых ячеек < 2 для определенной строки, выход будет «Недостаточно данных».

Если нет, тогда будет рассчитано значение наклона.

Другой, менее кропотливый способ обойти эту проблему - просто использовать On Error Resume Next для этого конкретного случая.

Dim n As Long, o As Range, CurrentRow As Range, NonEmptyCellCountRow As Integer 


For n = 3 To MyRange.Rows.Count `Within each row, counting non-empty cells 

    Set CurrentRow = TargetSheet.Range(TargetSheet.Cells(n, 5), TargetSheet.Cells(n, MyRange.Columns.Count)) 

    NonEmptyCellCountRow = 0 

    For Each o In CurrentRow 

     If o.Value <> "" Then NonEmptyCellCountRow = NonEmptyCellCountRow + 1 

    Next o 

    If NonEmptyCellCountRow < 2 Then _ 

     TargetSheet.Cells(n, (MyRange.Columns.Count) + 1) = "Insufficient Data" 

    Else 

     TargetSheet.Cells(n, (MyRange.Columns.Count) + 1) = Application.WorksheetFunction.Slope(TargetSheet.Range(TargetSheet.Cells(n, 5), TargetSheet.Cells(n, MyRange.Columns.Count)), TargetSheet.Range(TargetSheet.Cells(1, 5), TargetSheet.Cells(1, MyRange.Columns.Count))) 

    End If 

Next n 
0

Как указано, удаление. Значение по вызову slope позволяет передать компилятор.

В противном случае это сработает.

Этот вход ...

enter image description here

При условии, этот выход ...

enter image description here

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

Sub main() 
Dim n As Long 
Dim MyRange As Range 

Set MyRange = ActiveSheet.UsedRange 
Dim TargetSheet As Worksheet, SourceSheet As Worksheet 
Dim TargetBook As Workbook 

Set TargetBook = Application.ActiveWorkbook 
Set TargetSheet = Application.ActiveSheet 

For n = 2 To MyRange.Rows.Count 

    TargetSheet.Cells(n, (MyRange.Columns.Count) + 1).Value = _ 
     Application.WorksheetFunction.Slope(TargetSheet.Range(TargetSheet.Cells(n, 1), TargetSheet.Cells(n, MyRange.Columns.Count)), _ 
     TargetSheet.Range(TargetSheet.Cells(1, 1), TargetSheet.Cells(1, MyRange.Columns.Count))) 

Next n 

End Sub 

Ниже приведено rev чтобы получить регистр, когда присутствует только 1 Y значение, чтобы избежать деления на ноль. Это предполагает, что строка 1 на листе не будет иметь ничего справа от заголовков.

Option Explicit 

Sub main() 
Dim n As Long 
Dim MyRange As Range 
Dim nRows As Long, nCols As Long, ColCount As Long 

Set MyRange = ActiveSheet.UsedRange 
Dim TargetSheet As Worksheet, SourceSheet As Worksheet 
Dim TargetBook As Workbook 

Set TargetBook = Application.ActiveWorkbook 
Set TargetSheet = Application.ActiveSheet 

nRows = MyRange.Rows.Count 
nCols = MyRange.Rows(1).End(xlToRight) 

For n = 2 To nRows 

    ColCount = Application.CountIf(TargetSheet.Range(TargetSheet.Cells(n, 1), Sheet1.Cells(n, nCols)), """<>""""""") 
    If ColCount > 1 Then 
     TargetSheet.Cells(n, (MyRange.Columns.Count) + 1).Value = _ 
      Application.Slope(TargetSheet.Range(TargetSheet.Cells(n, 1), TargetSheet.Cells(n, MyRange.Columns.Count)), _ 
      TargetSheet.Range(TargetSheet.Cells(1, 1), TargetSheet.Cells(1, MyRange.Columns.Count))) 
    End If 
Next n 

End Sub 
+0

Он работал до появления ошибки «# DIV/0», как показано здесь: http://i.imgur.com/oXyo1nZ.png – StarrySky

+0

@StarrySky - я изменил ответ, чтобы зафиксировать случай, когда есть только по значению Y, а затем не вычислять наклон. Он полагается на отсутствие данных справа от ваших дат в первой строке. – OldUgly

+0

снова напомните мне, почему вы используете VBA. Это было бы просто с формулами Excel: '= IF (GT (COUNTIF (C1: C7," <> "" "), 1), SLOPE (C1: C7, $ B $ 1: $ B $ 7)," ") и затем заполните. – OldUgly

Смежные вопросы