由于语法错误(录制时)和&amp ;;无法运行VBA对象定义的Eerror(运行时)

时间:2016-06-24 16:56:14

标签: excel vba excel-vba macros syntax-error

我得到了与Dennis here相同的错误,但他提供的答案只是说要删除一些模块或重命名它们。但是,我只有一个模块,重命名它对我没有任何作用。我甚至尝试制作一个全新的工作簿并将宏复制到一个新的开始,但它也没有做任何事情。 当我在录制宏之后运行宏时,它还会给我一个应用程序定义的或对象定义的"错误。 该公式在宏之外完全可以正常工作,但我确实需要它作为宏的一部分。

以下是excel记录的内容,这是我的宏中的一行给出了错误:

ActiveCell.FormulaR1C1 = _
    "=IF(COUNTA(RC[-15]:RC[-2])=2,RC[-14],IF(COUNTA(RC[-15]:RC[-2])=4,CONCATENATE(RC[-14],"":"",RC[-12]),IF(COUNTA(RC[-15]:RC[-2])=6,CONCATENATE(RC[-14],"":"",RC[-12],"" - "",RC[-10]),IF(COUNTA(RC[-15]:RC[-2])=8,CONCATENATE(RC[-14],"":"",RC[-12],"":"",RC[-10],"" - "",RC[-8]),IF(COUNTA(RC[-15]:RC[-2])=10,CONCATENATE(RC[-14],"":"",RC[-12],"":"",RC[-10],"":"",RC[-8],"" - """ & _
    ","""")))))"

之前有一个Range("Q3").Select,它会激活该单元格。此外,如果您查看它记录的内容与原始公式的比较,您可以看到它不在K3)RC[-6]),。我试图添加它,但它没有帮助。

原始公式:

=IF(COUNTA(B3:O3)=2,C3,IF(COUNTA(B3:O3)=4,CONCATENATE(C3,":",E3),IF(COUNTA(B3:O3)=6,CONCATENATE(C3,":",E3," - ",G3),IF(COUNTA(B3:O3)=8,CONCATENATE(C3,":",E3,":",G3," - ",I3),IF(COUNTA(B3:O3)=10,CONCATENATE(C3,":",E3,":",G3,":",I3," - ",K3),"")))))

我也尝试了没有concatenate的公式,但它也没有帮助。它在下面:

ActiveCell.FormulaR1C1 = _
        "=IF(COUNTA(RC[-15]:RC[-2])=2,RC[-14],IF(COUNTA(RC[-15]:RC[-2])=4,RC[-14]&"":""&RC[-12],IF(COUNTA(RC[-15]:RC[-2])=6,RC[-14]&"":""&RC[-12]&"" - ""&RC[-10],IF(COUNTA(RC[-15]:RC[-2])=8,RC[-14]&"":""&RC[-12]&"":""&RC[-10]&"" - ""&RC[-8]),IF(COUNTA(RC[-15]:RC[-2])=10,RC[-14]&"":""&RC[-12]&"":""&RC[-10]&"":""&RC[-8]&"" - ""&RC[-6],"""")))))"

编辑:这是上面的代码,P3公式正常工作:

 Range("P3").Select
    ActiveCell.FormulaR1C1 = _
        "=INDEX(RC[-14]:RC[-1],1,IF(COUNT(RC[-14]:RC[-1])=1,COUNT(RC[-14]:RC[-1]),COUNT(RC[-14]:RC[-1])*2-1))"
    Range("P3").Select
    Range("P3").AutoFill Destination:=Range("P3:P" & LastRow)


    Range("Q3").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(COUNTA(RC[-15]:RC[-2])=2,RC[-14],IF(COUNTA(RC[-15]:RC[-2])=4,RC[-14]&"":""&RC[-12],IF(COUNTA(RC[-15]:RC[-2])=6,RC[-14]&"":""&RC[-12]&"" - ""&RC[-10],IF(COUNTA(RC[-15]:RC[-2])=8,RC[-14]&"":""&RC[-12]&"":""&RC[-10]&"" - ""&RC[-8]),IF(COUNTA(RC[-15]:RC[-2])=10,RC[-14]&"":""&RC[-12]&"":""&RC[-10]&"":""&RC[-8]&"" - ""&RC[-6],"""")))))"
    Range("Q3").Select
    Range("Q3").AutoFill Destination:=Range("Q3:Q" & LastRow)

我正在使用Microsoft Office 2013,并且有一个ASAP Utilites附加组件,如果有帮助的话,以前从未给我带来任何问题。

1 个答案:

答案 0 :(得分:1)

公式本身包含错误:

ActiveCell.FormulaR1C1 = "=IF(COUNTA(RC[-15]:RC[-2])=2,RC[-14],IF(COUNTA(RC[-15]:RC[-2])=4,RC[-14]&"":""&RC[-12],IF(COUNTA(RC[-15]:RC[-2])=6,RC[-14]&"":""&RC[-12]&"" - ""&RC[-10],IF(COUNTA(RC[-15]:RC[-2])=8,RC[-14]&"":""&RC[-12]&"":""&RC[-10]&"" - ""&RC[-8]),IF(COUNTA(RC[-15]:RC[-2])=10,RC[-14]&"":""&RC[-12]&"":""&RC[-10]&"":""&RC[-8]&"" - ""&RC[-6],"""")))))"

应该是

ActiveCell.FormulaR1C1 = "=IF(COUNTA(RC[-15]:RC[-2])=2,RC[-14],IF(COUNTA(RC[-15]:RC[-2])=4,RC[-14]&"":""&RC[-12],IF(COUNTA(RC[-15]:RC[-2])=6,RC[-14]&"":""&RC[-12]&"" - ""&RC[-10],IF(COUNTA(RC[-15]:RC[-2])=8,RC[-14]&"":""&RC[-12]&"":""&RC[-10]&"" - ""&RC[-8],IF(COUNTA(RC[-15]:RC[-2])=10,RC[-14]&"":""&RC[-12]&"":""&RC[-10]&"":""&RC[-8]&"" - ""&RC[-6],"""")))))"

...RC[-8]),IF...,不应该有)

如果删除它,宏必须运行 仍然:我建议改变你的公式

=IF(COUNTA(B3:O3)=2,C3,IF(COUNTA(B3:O3)=4,CONCATENATE(C3,":",E3),IF(COUNTA(B3:O3)=6,CONCATENATE(C3,":",E3," - ",G3),IF(COUNTA(B3:O3)=8,CONCATENATE(C3,":",E3,":",G3," - ",I3),IF(COUNTA(B3:O3)=10,CONCATENATE(C3,":",E3,":",G3,":",I3," - ",K3),"")))))

=IFERROR(CHOOSE(COUNTA(B3:O3)/2,C3,C3&":"&E3,C3&":"&E3&" - "&G3,C3&":"&E3&":"&G3&" - "&I3,C3&":"&E3&":"&G3&":"&I3&" - "&K3),"")

更短;)

对于“虚假”录制的部分:如果excel将您的公式“翻译”为R1C1,并且字符串被切割成多行,则有时会丢失部分。对于这种情况(如果您注意到公式被切割为多行),只需选择单元格并在即时窗口中运行:?ActiveCell.FormulaR1C1以获取R1C1中的公式。但是不要忘记将所有"加倍。