2016-12-09 21 views
1

私はいくつかのVBAコードに取り組んでいると私は"引数は省略可能な" VBA ExcelのSUB

エラーオプションではありません

引数を取得しています。私はこの問題に対する他の答えのいくつかを見て、彼らは私の問題に答えるように見えませんでした。

コードはSub Finding_number()の最初の反復で固まってしまい、混乱しています。私はそのSubにまたはSubから何か引数を渡さないので、なぜエラー?

私のコード

Sub Pedal_Actuations_per_hour() 

Dim counter As Integer 
Dim average_actuations As Single 

counter = 1  
Do While IsEmpty(ActiveCell.Value) = False  
    Finding_number 
    average_actuations = (average_actuations + Pedal_actuations())/counter 
    counter = counter + 1  
Loop 

Range("J2").Value = average_actuations  

End Sub 


Sub Finding_number() 

    Dim index As Integer 
    index = 1   
    Range("E2").Select 

    Do While index = 1 
     If ActiveCell.Value = 121 Then 
      index = 0 
     End If 

     Range.Offset (1) 
    Loop 

End Sub 

Function Pedal_actuations() As Integer 

Dim time_sum As Single 
Dim index As Integer 

index = 1 
time_sum = 0  
Do While time_sum < 1    
    If IsEmpty(ActiveCell.Value) = 0 Then 
     date_number = Int(ActiveCell(, -2).Value) 
     ActiveCell(, 6).Value = ActiveCell(, -2).Value - date_number 
     ActiveCell(, 7).Value = Abs(ActiveCell(, 6).Value - ActiveCell(2, 6)) *24 
    Else 
     index = 0 
    End If 

    Pedal_actuations = Pedal_actuations + 1 
    time_sum = time_sum + ActiveCell(, 7).Value     
Loop 

End Function 
+5

は 'Range.Offsetは、(1)'間違っている、何の意味もありません。 –

+2

エラーは 'Range.Offset(1)'です。どのセルをオフセットしたり、そのセルで何をするかを教えたりしているわけではありません。 –

答えて

2

です。

Sub Finding_number() 

    Dim index As Integer 
    index = 1 

    Dim Rng As Range 
    Set Rng = Range("E2") 

    Do While index = 1 
     If Rng.Value = 121 Then 
      index = 0 
     End If 

     Set Rng = Rng.Offset(1) 
    Loop 

End Sub 

以下の短いバージョンは、あなたにも同じ結果が得られます:

Sub Finding_number() 

    Dim Rng As Range 
    Set Rng = Range("E2") 

    Do While Rng.Value <> 121 
     Set Rng = Rng.Offset(1) 
    Loop 

End Sub 
+0

RangeはActivecellと同じ機能をすべて備えていますが、より効率的/高速ですか?例えば、私のコードの機能では、特定のことを実行するためにactivecellを使用しています。範囲オブジェクトを使ってすべてを行うことができ、Rng(、6).value = ...を実行できますか? –

+0

@VincentCeyssensここでは 'Range'オブジェクトの詳細を読むことができます:https://msdn.microsoft.com/en-us/library/office/ff838238.aspx2番目の部分、私はあなたが 'オフセット 'を意味すると思います、そうですか?正しい構文は 'Rng.Offset(、6).Value'です –

2

それはそう

Range.Offset (1) 

あなたは何が悪かったのか、そう

Sub Finding_number() 

    Dim index As Integer 
    index = 1 

    Dim rng As Range 
    Set rng = Range("E2") 

    Do While index = 1 
     If rng.Value = 121 Then index = 0 
     Set rng = rng.Offset(1, 0) 
    Loop 
End Sub 

ような何かにあなたのコードを変更したい場合がありますか?

コードで前に選択した範囲で作業し、次のセルに移動するなどしたかったのです。あなたがそうやってみたかった何

は、それを選択し、これが私たちの現在の選択したセルの下のセルにオフセット

Selection.Offset(1, 0).Select 

ました。

しかし:ちょうど定義し、設定された範囲のオブジェクトを

Dim rng As Range 
Set rng = Range("E2") 

と、次いで

最後
Set rng = rng.Offset(1, 0) 

と各ループの後の次のセルに設定するためのより良い実践にあなたのサブをさらに改善し、本当にあなたのindex - 変数が必要かどうか検討してください。ここで、ショットは は代わりにSheetsRange sと参照されたオブジェクトを使用して...それはSelectActiveCellなどの使用を避ける方が良いでしょうそれなし

Sub Finding_number() 

    Dim rng As Range 
    Set rng = Range("E2") 

    Do While Not rng.Value = 121 
     Set rng = rng.Offset(1, 0) 
    Loop 
End Sub 
関連する問題