2017-10-11 46 views
0

如果條件如下所示,我寫道,它在A行中查找值「Current Status:」,並將B值從該行復制到另一個表中(如果未找到)將「0」放入單元格中,它工作正常。有時候,「當前狀態:」的值可能與A18不同,它可能出現在A16到A20的範圍內,我如何修改該代碼以在範圍內找到它並複製相應的值?VBA如果條件

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

回答

2

只要把你的代碼在For環......或使用VLookup像斯科蒂建議。這基本上是一樣的。 A For循環更靈活,但優化程度較低(VLookup更快)。它們都以μs/ cell的分數級數運行。

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 

這將在單元格中放入0,然後嘗試從VLOOKUP返回的值來代替它。如果"Current Status:"ws的列A中找不到,那麼它會拋出一個錯誤並被忽略,並將0留在單元格中。

如果找到該值將返回列B中值,並把在地方的0

+0

和u8it代碼工作就像一個魅力,謝謝。我剛剛發現,在某些情況下,我可能會有另一行包含「Current Status:」值的單元格...有沒有辦法修改該代碼以強制它忽略第一個找到的行並在需要時檢索第二個事件?或者如果發現第二個值將其放入下一列,它可能更容易{ws.Range(「A19」)} – FotoDJ

+0

有許多方法,嘗試一些研究並返回一個顯示您嘗試過的新問題。 –