2016-04-13 4 views
0

VBAの新機能で、2つの配列の傾きを計算し、指定されたアドレスの列に配置するコードでこの修飾子エラーが発生しました。スロープ関数の無効な修飾子エラー

これまでのところ私を打ち負かすので、助けてもらえます。配列のサイズは一致しています。

この1つは(その時点まで元に戻すことはできません:/)の前に、コンパイルエラーが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 

.Slopeバージョンで与えられ、それが停止し、得られた時点まで後処理しました。修飾子エラー。私はExcelのスロープ関数をデータセットに使用して横並びに比較しました。#DIV/0の結果でこのエラーが発生していました(ただし、VBAではそのエラーが表示されませんでした)。

+0

Slope関数呼び出しから '.Value'を削除します。 – OldUgly

答えて

0

ありがとう@OldUgly!エラーを修正するために管理されます。 VBAの理由:同じフォーマットで複数のデータシートを自動化し、列と行の

WorksheetFunction.Slopeは、データポイントが1つしかなく、残りの1つの配列が空の場合、WorksheetFunction.Slopeはそれを気に入らない。

私は、各行に対してForループ内の空でないセルを数えるために別のループを作成しました。いいえ。空でないセルの数が特定の行について< 2である場合、出力は「不十分なデータ」になります。

そうでない場合、勾配値が計算されます。

もう1つ、この問題を回避するには、この具体的なケースでは単に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、"> "" ")、SLOPE(C1:C7、$ B $ 1:$ B $ 7)そしてそれを埋める。 – OldUgly

関連する問題