2015-09-20 73 views
3

我有这个工作表,我有一个在VBA中的IF公式,它搜索V9:Z9的相似值(DIST8和DIST6)。该公式使用10填充AO9。这个公式适用于我的目的。我想重复这个公式直到最后一行。重复一个'如果'公式到最后一行

Dim DIST8 As String 
Dim DIST6 As String 
DIST8 = "DIST8" 
     ' Select cell A9, *first line of data*. 
     Range("A9").Select 
     ' Set Do loop to stop when an empty cell is reached. 
     Do Until IsEmpty(ActiveCell) 
     ' Insert your code here 
       If Worksheets("Sheet1").Range("v9") Like "*" & "DIST8" & "*" Or Worksheets("Sheet1").Range("w9") Like "*" & "DIST8" & "*" Or Worksheets("Sheet1").Range("x9") Like "*" & "DIST8" & "*" Or Worksheets("Sheet1").Range("y9") Like "*" & "DIST8" & "*" Or Worksheets("Sheet1").Range("z9") Like "*" & "DIST8" & "*" Or Worksheets("Sheet1").Range("v9") Like "*" & "DIST6" & "*" Or Worksheets("Sheet1").Range("w9") Like "*" & "DIST6" & "*" Or Worksheets("Sheet1").Range("x9") Like "*" & "DIST6" & "*" Or Worksheets("Sheet1").Range("y9") Like "*" & "DIST6" & "*" Or Worksheets("Sheet1").Range("z9") Like "*" & "DIST6" & "*" Then 
        Worksheets("Sheet1").Range("Ao9").Value = 1 
       Else 
        Worksheets("Sheet1").Range("Ao9").Value = 0 
       End If 
     ' Step down 1 row from present location. 
     ActiveCell.Offset(1, 0).Select 
     Loop 

不幸的是,循环无法正常工作,该表将向下滚动到最后一排,但没有填充IF超越了第一排。我想运行相同的IF公式,但改变行号例如; v9到v10,w9到w10等。

实现此目的的最佳方法是什么?

回答

2

要使用你的循环,你需要不断提高Range("v9")Range("Ao9")等行号,否则你只是比较和写入新的值到同一个单元格中。

Dim DIST8 As String, DIST6 As String, r As Long, lr As Long 

    DIST6 = "DIST6" '<~~ don't forget DIST6 or the wildcards will make everything a 1. 
    DIST8 = "DIST8" 

    With Worksheets("Sheet1") 
     lr = .Cells(Rows.Count, "A").End(xlUp).Row 
     For r = 9 To lr 
      If .Range("v" & r) Like "*" & DIST8 & "*" Or .Range("w" & r) Like "*" & DIST8 & "*" Or _ 
       .Range("x" & r) Like "*" & DIST8 & "*" Or .Range("y" & r) Like "*" & DIST8 & "*" Or _ 
       .Range("z" & r) Like "*" & DIST8 & "*" Or .Range("v" & r) Like "*" & DIST6 & "*" Or _ 
       .Range("w" & r) Like "*" & DIST6 & "*" Or .Range("x" & r) Like "*" & DIST6 & "*" Or _ 
       .Range("y" & r) Like "*" & DIST6 & "*" Or .Range("z" & r) Like "*" & DIST6 & "*" Then 
       .Range("Ao" & r).Value = 1 
      Else 
       .Range("Ao" & r).Value = 0 
      End If 
     Next r 

    End With 

循环如使用的是很适合25-500记录,但它们可以通过本体加载式,然后恢复到的值来加快。如果你正在处理大于5K的记录,速度的提高将是可观的。

Dim DIST8 As String, DIST6 As String, lr As Long 

    DIST6 = "DIST6" '<~~ don't forget DIST6 or the wildcards will make everything a 1. 
    DIST8 = "DIST8" 

    With Worksheets("Sheet1") 
     lr = .Cells(Rows.Count, "A").End(xlUp).Row 
     With .Range(.Cells(9, "AO"), .Cells(lr, "AO")) 
      .Formula = "=SIGN(SUM(COUNTIF(V9:Z9, {""*" & DIST6 & "*"", ""*" & DIST8 & "*""})))" 
      .Value = .Value 
     End With 
    End With 

请注意,当你原来的模式匹配的情况下,默认敏感后者常规的COUNTIF function不区分大小写。如果您希望对模式匹配进行非区分大小写的比较,请将Option Compare Text放在声明部分的模块表顶部。

+0

非常好,第二个选项做到了。谢谢 – BigSteveo

相关问题