我正在尝试将此公式“= RIGHT(G7,LEN(G7)-LEN(OFFSET(H7,0,-7)))”转换为VBA,无论它引用单元格H7,我希望它使用ActiveCell相反,因为此公式在循环中使用,并且每次都输入到不同的行中。希望我清楚地解释我的困境。
我转换公式的尝试以:
结束ActiveCell.Formula =“= right(offset(”& ActiveCell& “,0,-1),len(偏移(”& ActiveCell&“,0,-1)-len(偏移量(”& ActiveCell“) &安培; “0,-7))”
给出了运行时错误“1004”:应用程序定义或对象定义错误。
答案 0 :(得分:0)
这是FormulaR1C1的用途:
Sub foooo()
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Range("H1:H100").FormulaR1C1 = "=RIGHT(RC-1,LEN(RC-1)-LEN(RC-7))"
End Sub
它会立即完成整个范围。
如果你真的想循环那么:
Sub foooo()
Dim i As Long
Dim ws As Worksheet
Set ws = ActiveSheet
For i = 1 To 100
ws.Cells(i, "H").FormulaR1C1 = "=RIGHT(RC-1,LEN(RC-1)-LEN(RC-7))"
Next i
End Sub
公式的问题在于范围对象的默认特征是其值而不是其地址。这样:
ActiveCell.Formula = "=right(offset(" & ActiveCell.Address(0,0) & ",0,-1),len(offset(" & ActiveCell.Address(0,0) & ",0,-1)-len(offset(" & ActiveCell.Address(0,0) & ",0,-7))"
虽然我会避免使用完整的OFFSET函数。 OFFSET是一个易失性函数,它计算每次excel计算时,无论它引用的任何数据是否发生了变化。充满这些的列将减慢计算时间。