我想把下面的代码放到像函数一样的vba中。 VBA已经创建了大量数据,当VBA完成其工作时,应该运行以下函数,但我不知道如何添加到我的vba中,以便只要数据包含该函数就会运行。我创建的宏已经将数据表放在一起,现在不是用lenthy编码创建下面的,我只想让我的宏运行下面,就像点击包含下面函数的单元格右下角的人一样。 它应该是:Activesheet.ForulaR1C1 =" = RIGHT(AY4,LEN(AY4)-FIND("。",AY4))"一些东西。有人能帮我吗?感谢
要运行的原始功能" =正确(AY4,LEN(AY4)-FIND("。",AY4))"
这就是我现在所处的位置:
Sub Project_numbers()
Dim j As Integer
Zorro = Range("AY" & Rows.Count).End(xlUp).Row
o = 4
Worksheets("MJE").Range("AF" & o).FormulaR1C1 = "=RIGHT(AE4,LEN(AE4)-FIND(".",AE4))"
o = o + 1
End Sub
答案 0 :(得分:1)
这里有几个问题。最大的是你的公式中有引号。 VBA将这些作为字符串的结尾读取,因此它将您的公式解释为两个单独的文本字符串:=Right(AE4,LEN(AE4)-FIND(
和,AE4))
,由.
分隔。这不是VBA可以做任何事情的结构,所以它会在那时失败。
当您使用包含引号的VBA插入公式时,您需要同时使用两个引号来指示它是字符串的一部分的文字引号,而不是字符串的结尾:
"=RIGHT(AE4,LEN(AE4)-FIND(""."",AE4))"
第二个问题是你使用的是FormulaR1C1方法,它希望在R1C1(row#column#)表示法中给出单元格引用,而不是A1表示法,但是然后传递一个使用A1表示法的公式。同样,这会混淆问题并产生错误。
我猜你用宏录音机来获取语法,然后插入你自己的公式?出于某些奇怪的原因,宏录制器喜欢使用R1C1引用样式,但我们可以使用不同的方法来编写代码。
您需要的全部内容是:
Worksheets("MJE").Range("AF" & o).Formula = "=RIGHT(AE4,LEN(AE4)-FIND(""."",AE4))"
编辑添加:
根据更多信息,特别是您需要在循环时更改参考范围,您可以选择如何进行操作。
这允许您轻松地在公式中包含相对引用。您将使用R来指定公式的行,使用C来指定其列;所以提到自己的单元格只是=RC
。您可以使用数字跟随R和C来指定特定的行和列,因此单元格B2将是=R2C2
- 第2行,第2列。更有用的是,您可以使用=R[#]C[#]
来抵消公式一定数量。
在你的公式中,假设它总是要查看列AE,但无论输入公式是哪一行,你的行都是:
Worksheets("MJE").Range("AF" & o).FormulaR1C1 = "=RIGHT(RC31,LEN(RC31)-Find(""."",RC31))"
您已经有一个可以使用的变量o
,因此我们可以将其与字符串的其余部分组合以获得适当的引用。尽管如此......阅读起来比较难......
Worksheets("MJE").Range("AF" & o).Formula = "=RIGHT(AE" & o & ",LEN(AE" & o & ") - FIND(""."",AE" & o & "))"
就个人而言,我发现这种方法很麻烦,但它是一种选择。
就个人而言,我更喜欢这个选择;我发现它是最好的一个。我假设,从您的公式,您的数据从第4行开始,您希望公式进入AE4和数据结尾之间的每个单元格,这些单元格存储在Zorro
中。您可以使用此行一次性添加公式:
Worksheets("MJE").Range("AF4","AF" & Zorro).Formula = "=RIGHT(AE4,LEN(AE4)-FIND(""."",AE4))"
单元格引用将自动更新每一行。没有必要使用这种方法循环 - 当然,如果你还是循环,那可能不是很好的保存。