2016-12-22 12 views
1

excel 各行をスキャンして特定のセルを取り出し、変数として格納したいとします。私が行の最後に着くと、一連の数式とvlookupを実行したいと思います。私は式とvlookupsをすべてセットアップしましたが、私は各行をスキャンし、それらの式の結果を取り、別のセルに戻す必要があります。ここにコード例があります行をループしてセルの値を変数として格納し、別のセルに結果を返します。

Dim height As Double 
Dim weight As Double 
Dim gender As String 
Dim newWeight as Double 

'I'd like to set the loop here 
'for each row do this 
height = d2.value 
weight = f2.value 
gender = k2.value 

'then run through my equations 
If gender = "F" and weight < 20 Then 
newWeight = weight + 5 
ElseIf gender = "F" and weight > 20 Then 
newWeight = weight -2 
End If 

l2.value = newWeight.value 
'Then clear variables and run through the new row 

私の方程式はそれより少し複雑ですが、私はそれを開始すると思います。

**編集:私が使用しているシートを参照する必要がありますか?私は

+1

あなたのコードでは、 'd2'は"セルD2 "を意味するものではなく、' d2'という変数(おそらくオブジェクト)を意味します。 'Range(" D2 ")'や 'Cells(2、" D ")'に変更したいと思うかもしれません。 'Cells'という方法を使うと' For'ループ(例えば 'For rowNum = 2 To 20')やループ内で' Cells(rowNum、 "D") 'を使うのは簡単でしょう。 – YowE3K

+0

この情報をお寄せいただきありがとうございます。私のVBA経験はフォームのみであり、ワークシートで直接作業していません – mcadamsjustin

+1

デフォルトでは、 'ActiveSheet'はすべての範囲とセルオブジェクトが参照しているシートとして使用されます。したがって、シートがアクティブなときにコードが実行されている間は、エラーが発生してはなりません。しかし、マクロが実行されたときにこのシートがアクティブにならない可能性がある場合は、 'Range ...'ビットを 'Worksheets(" Sheet1 ")に変更してください。Range ...'(明らかに、 ) – YowE3K

答えて

2

私はあなたのコードを台無しにするつもりはないのですが、これはあなたが必要とする何をすべき、

Dim height As Double 
Dim weight As Double 
Dim gender As String 
Dim newWeight As Double 
Dim lastrow As Long 

lastrow = Cells(Rows.Count, 1).End(xlUp).row 

For i = 2 To lastrow 
    'I'd like to set the loop here 
    'for each row do this 
    height = CDbl(Range("D" & i).value) 
    weight = CDbl(Range("F" & i).value) 
    gender = Range("K" & i).value 

    'then run through my equations 
    If gender = "F" And weight < 20 Then 
    newWeight = weight + 5 
    ElseIf gender = "F" And weight > 20 Then 
    newWeight = weight - 2 
    End If 

    Range("I" & i).value = newWeight 
    'Then clear variables and run through the new row 
    newWeight = 0 
    height = 0 
    weight = 0 
    gender = 0 
Next 
+0

'2'でループを開始することをお勧めしますなぜなら、行1は見出しであり(そして、OPが占有している列の1つに基づいてlastRowを設定している) – YowE3K

+0

@ YowE3K、私はテーブルを見ていない。私はOPがそれを把握することができるだろうと推測しているが、.... – KyloRen

+0

@ YowE3K、非常に真実。 – KyloRen

3

を行うIを賭けます。また、何を把握する必要があり、コード

Sub temp() 

    Dim height As Double 
    Dim weight As Double 
    Dim gender As String 
    Dim newWeight As Double 

    Dim lastRow As Integer 
    lastRow = Range("C" & Rows.Count).End(xlUp).Row 

    For i = 2 To lastRow 
     'I'd like to set the loop here 
     'for each row do this 
     height = Range("D" & i).Value 
     weight = Range("F" & i).Value 
     gender = Range("K" & i).Value 

     'then run through my equations 
     If gender = "F" Then 
      If weight < 20 Then 
       newWeight = weight + 5 
      ElseIf weight > 20 Then 
       newWeight = weight - 2 
      End If 
     End If 

     Range("L" & i).Value = newWeight 
     'Then clear variables and run through the new row 
    Next i 

End Sub 

の下を参照してください。 weight = 20の場合に発生します。P

+0

'lastRow'を' Long'に変更することをお勧めします。重さ= 20の問題についてのコメントについては+1。 – YowE3K

+0

height = Range( "D"&i).Valueの型の不一致エラーが発生しました。また、体重が20より大きい場合や小さい場合を例に挙げましたが、良い点は、そこではあまりにも等しい演算子を使用したい場合です。 – mcadamsjustin

+1

データがない限り、型の不一致の理由が表示されません細胞内の文字列として。手動で高さの数値を入力し、デバッグモードでコードを実行してください – nightcrawler23

関連する問題