2017-10-11 28 views
0

以下に示す条件を書いた場合、A列の値「現在の状態:」を探し、その行のB値を他のシートにコピーします。見つからない場合はセルに「0」が入ります、それは正常に動作します。時には "Current Status:"という値がA18とは異なるセルにあり、A16からA20の範囲で表示される場合があります。範囲内でコードを検索して対応する値をコピーするにはどうすればよいでしょうか?条件の場合

If ws.Range("A18") = "Current Status:" Then 
    .Range("V" & NewRow) = ws.Range("B18") 
    Else 
     .Range("V" & NewRow) = "0" 
     End If 

答えて

2

の代わりにそれを置く発見された場合。基本的には同じことです。 Forループの柔軟性は向上しますが、最適化されません(VLookupが高速です)。それらは両方ともμs/セルの分数のオーダで動作します。

For Each c In Range("A16:A20") 
    If c.Value2 = "Current Status:" Then 
     .Range("V" & NewRow) = c.Offset(0, 1) 
     Exit For 
    Else 
     .Range("V" & NewRow) = "0" 
    End If 
Next 

Forループを使用している場合、これは上記の何よりも少し多くのコードが、より良い構造である...

'Define a value holder variable where it's scope makes sense 
Dim NewValue As String 

'... other code here ... 

'Default: NewValue = "" 
NewValue = "" 
For Each c In Range("A16:A20") 
    If c.Value2 = "Current Status:" Then 
     NewValue = c.Offset(0, 1) 
     'Exit For is optional in this case. It matters if 
     'there are multiple matches... do you want first or last result? 
     Exit For 
    End If 
Next 
'Assign NewValue to cell 
.Range("V" & NewRow) = NewValue 
+0

ありがとう、それはまだどれくらいのことが学べるかを示しています... :) – FotoDJ

1

使用VLOOKUP:

.Range("V" & NewRow) = "0" 
On Error Resume Next 
.Range("V" & NewRow) = Application.WorksheetFunction.VLookup("Current Status:", ws.Range("A:B"), 2, False) 
On Error GoTo 0 

これは、VLOOKUP関数から返された値に置き換えることをしようと、セルに0を入れます。 "Current Status:"wsの列Aに見つからない場合は、エラーがスローされ、セルに0のままで無視されます。

値は、それが列Bの値を返すだけForループでコードを置く...またはスコッティが提案のようなVLookupを使用0

+0

とu8itコードは、魔法のように仕事をお願い致します。私はちょうど "Current Status:"値を含むセルで別の行を持つことがある場合があることを知りました。最初に見つかった行を無視し、必要な場合は2番目のオカレンスを取得するようにコードを修正する方法はありますか? 2番目の値がセルを次の列に配置するとわかりやすい場合があります。{ws.Range( "A19")} – FotoDJ

+0

多くの方法がありますが、いくつかの研究を試して、あなたが試したことを示す新しい質問に戻ってください。 –