2016-04-13 41 views
0

VBA新手,並且得到了此限定符錯誤代碼,該代碼應該計算兩個數組的斜率並將其放在具有給定地址的列中。帶有坡度函數的限定符錯誤無效

打敗了我,所以很高興有一些幫助!數組的大小是匹配的。

編譯錯誤是在.SlopeTargetSheet.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 

一個版本中此人之前給定的(不能撤銷,直到這一點:/)是工作截止到一個地步,它停下來,給了限定符錯誤。我在數據集上使用了Excel的SLOPE函數並進行了比較:它在#DIV/0結果中給出了此錯誤(但VBA未顯示)。

+0

從Slope函數調用中刪除'.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

如前所述,從斜坡調用中移除.Value允許它通過編譯器。

否則,它似乎工作。

此輸入...

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