2017-06-20 64 views
0

我试图检查使用VBA填充我的行和列不同的条件下的测试条件。擅长:如果用

这是我到目前为止已经试过:

For i = 1 To Lastrow 
    For j = 1 To 11 
     If (IsEmpty(ws1.Range("C12"))) And (IsEmpty(ws1.Range("D12"))) = True Then 
      ws2.Cells(i, j) = ws1.Cells(i, j).Value 
     ElseIf (IsEmpty(ws1.Range("C12")) And (ws1.Cells(i, 8) <= ws1.Cells(12, 4))) = True Then 
      ws2.Cells(i, j) = ws1.Cells(i, j).Value 
     ElseIf (IsEmpty(ws1.Range("D12")) And (ws1.Cells(i, 8) <= ws1.Cells(12, 4))) = True Then 
      ws2.Cells(i, j) = ws1.Cells(i, j).Value 
     ElseIf (ws1.Cells(12, 3) >= ws1.Cells(i, 7) And ws1.Cells(12, 3) <= ws1.Cells(i, 8)) Or (ws1.Cells(12, 4) >= ws1.Cells(i, 7) And ws1.Cells(12, 4) <= ws1.Cells(i, 8)) Or ((ws1.Cells(12, 3) >= ws1.Cells(i, 7)) And (ws1.Cells(12, 4) <= ws1.Cells(i, 8))) Then 
      ws2.Cells(i, j) = ws1.Cells(i, j).Value 
     End If 
    Next j 
Next i 

正如你所看到的,我试了很多条件。

问题是与地方细胞C12 OR D12是空的语句。 如果D12为空,代码应该给我所有从C12开始的日期。

例如,我想,从15/05/2017开始的一切:

enter image description here

这就是我得到的结果是:

enter image description here

正如你所看到的,它不正确。 我对所有东西都进行了单独测试,并且它可以正常工作,但是当我把所有东西都放到一起时,就会出现一些错误。

此外,我真的很怀疑,如果我的If/ElseIf语句测试所有条件才能或者如果我在一个适当的方式写。 是否有另一种方法可以按照我想要的顺序运行它?

+0

你并不需要在'If'块'= TRUE'条件。你可以简单地写'If '。你的日期栏是否以日期格式?如果不是,那么你的比较就会失败。 – Taosique

+0

@Taosique但是对于'IsEmpty'仍然是必要的,不是吗?是的,他们是......一切都是日期格式,我查了一下。 – paulinhax

+0

是的,如果你的业务逻辑需要它的话。 – Taosique

回答

2

没有验证您的IF但选择声明将是更清洁:

For i = 1 To lastrow 
    For j = 1 To 11 
     Select Case True 
      Case IsEmpty(ws1.Range("C12")) And IsEmpty(ws1.Range("D12")): 
       ws2.Cells(i, j) = ws1.Cells(i, j).Value 

      Case IsEmpty(ws1.Range("C12")) And ws1.Cells(i, 8) <= ws1.Cells(12, 4): 
       ws2.Cells(i, j) = ws1.Cells(i, j).Value 

      Case IsEmpty(ws1.Range("D12")) And ws1.Cells(i, 8) <= ws1.Cells(12, 4): 
       ws2.Cells(i, j) = ws1.Cells(i, j).Value 

      Case (ws1.Cells(12, 3) >= ws1.Cells(i, 7) And ws1.Cells(12, 3) <= ws1.Cells(i, 8)) Or _ 
       (ws1.Cells(12, 4) >= ws1.Cells(i, 7) And ws1.Cells(12, 4) <= ws1.Cells(i, 8)) Or _ 
       (ws1.Cells(12, 3) >= ws1.Cells(i, 7) And (ws1.Cells(12, 4) <= ws1.Cells(i, 8))): 
       ws2.Cells(i, j) = ws1.Cells(i, j).Value 

      Case Else: 
       ws2.Cells(i, j) = "No match" 
     End Select 
    Next j 
Next i 
+0

我做了一些修改,但它帮了我很多。我不知道如何使用'选择Case'非常好,但现在它的工作。我只是改变这个'案例的IsEmpty(ws1.Range( “C12”)),并且ws1.Cells(I,8)<= ws1.Cells(12,4): ws2.Cells(I,J)= ws1.Cells (I,J)为.Value''案例的IsEmpty(ws1.Range( “C12”)): 如果ws1.Cells(I,8)<= ws1.Cells(12,4)接着 ws2.Cells(ⅰ ,j)= ws1.Cells(i,j)。值 End If' – paulinhax

+0

Select语句比IF快得多。只记得使用默认的'Case Else',否则如果没有匹配,你会得到一个错误。 –

+0

谢谢!下次我会注意的:) – paulinhax