我需要使用相同的操作完成30个excel文件。我的excel文件中有非固定行数。对于所有excel文件,我想应用VBA将IF函数写入从第二行到最后一行的列“H”。
这是我需要写的公式(第二行):= IF(AND(AND = C2,C2 = C1,G2 = TRUE,G1 = FALSE,G3 = TRUE),“O”,IF( AND(C2 = C3,C2<> C1,G2 = TRUE), “FromYes”,IF(AND(C2 = C1,C2 = C3,G2 = TRUE,G1 = TRUE,G3 = FALSE), “d”, IF(AND(C2 = C1,C2<> C3,G2 = TRUE), “ToTmr”, “”))))
其他行应具有相似的公式。
有没有办法让我直接在vba中为整列“H”编写公式?
我尝试过这样的代码,但运行速度非常慢
For x = 2 To lastRow
If ws.Cells(x, 3) = ws.Cells(x + 1, 3) And ws.Cells(x, 3) = ws.Cells(x - 1, 3) And ws.Cells(x, 7) = True And ws.Cells(x - 1, 7) And ws.Cells(x + 1, 7) = True Then
ws.Cells(x, 8) = "O"
Else
If Cells(x, 3) = Cells(x + 1, 3) And (Cells(x, 3) <> Cells(x - 1, 3)) And Cells(x, 7) = True Then
Cells(x, 8) = "FromYes"
Else
If Cells(x, 3) = Cells(x - 1, 3) And Cells(x, 3) = Cells(x + 1, 3) And Cells(x, 7) = True And Cells(x - 1, 7) = True And Cells(x + 1, 7) = False Then
Cells(x, 8) = "D"
Else
If Cells(x, 3) = Cells(x - 1, 3) And Cells(x, 3) <> Cells(x + 1, 3) And Cells(x, 7) = True Then
Cells(x, 8) = "ToTmr"
End If
End If
End If
End If
Next x
Next d
答案 0 :(得分:0)
您的方法有一些变化。首先,使用可以使用VBA设置单元格公式的事实。其次,使用可以在VBA中为整个范围设置单元格公式的事实。第三,如果您的公式很快,请使用它而不是代码(这不是一个严格而快速的规则,但如果您不熟悉VBA或不经常使用它,那么使用公式会更简单)。
使用这些想法,我想出了这个:
With Sheet1
.Range(.Cells(2, 8), .Cells(lastRow, 8)).FormulaR1C1 = _
"=IF(AND(RC[-5]=R[1]C[-5],RC[-5]=R[-1]C[-5],RC[-1],NOT(R[-1]C[-1]),R[1]C[-1]),""O""," & _
"IF(AND(RC[-5]=R[1]C[-5],RC[-5]<>R[-1]C[-5],RC[-1]),""FromYes""," & _
"IF(AND(RC[-5]=R[1]C[-5],RC[-5]=R[-1]C[-5],RC[-1],R[-1]C[-1],NOT(R[1]C[-1])),""D""," & _
"IF(AND(RC[-5]<>R[1]C[-5],RC[-5]=R[-1]C[-5],RC[-1]),""ToTmr"",""""))))"
End With
这是设置列H的范围的公式,第2行到lastRow,Sheet1等于您的公式。消除了循环行的需要,使其更快。
我总是发现在通过VBA输入公式时使用R1C1格式更容易。获得这种格式很容易;您只需要在Excel中选择公式选项并选择R1C1参考样式。然后,您可以将其复制到VBA中,并使用另一个引号转义引号。
使用此功能,您可以轻松编写循环文件的工具,找到相应工作表上的最后一行,并设置公式。