Excel VBA:无法将我的函数粘贴到单元格中

时间:2013-01-30 21:11:13

标签: excel-vba excel-formula vba excel

我正在尝试粘贴

=IF(AND(C4-C3<($I$1/1000),A4=A3),"OOOO","-----")

进入一个单元格,我通过

进行
 Range("I3").Select
 ActiveCell.FormulaR1C1 = "=IF(AND(C4-C3<($I$1/1000),A4=A3)," & Chr(34) & "OOOO" & Chr(34) & "," & Chr(34) & "-----" & Chr(34) & ")"
 Range("I3").Select

返回运行时错误'1004' 应用程序定义或对象定义的错误

我已经尝试过双引号并看到&amp; Chr(34)&amp;解决方法并尝试过。什么都行不通。 此外,还有一些简单的事情

 ActiveCell.FormulaR1C1 = "=IF("

不起作用,但

 ActiveCell.FormulaR1C1 = "=IF" 

确实

奇怪的是,这适用于代码

Range("C3").Select
ActiveCell.FormulaR1C1 = "=MID(B3,1,2)*3600+MID(B3,4,2)*60+MID(B3,7,9)"
Range("C3").Select
我之前做过的。 如果我粘贴“= MID(B3,1,2)* 3600 + MID(B3,4,2)* 60 + MID(B3,7,9)”(而不是我试图使用的字符串),调试时问题代码并点击继续,它将粘贴该行,因此它不会在两个语句之间发生任何事情。只有一些选择和复制/粘贴之间会发生什么,但如果你想看的话我会把它包含在这里

    Range("C3").Select
  ActiveCell.FormulaR1C1 = "=MID(B3,1,2)*3600+MID(B3,4,2)*60+MID(B3,7,9)"
Range("C3").Select
Selection.Copy
Range("D3").Select
Selection.End(xlDown).Select
ActiveSheet.Paste
Range("K3:Z4").Select
Application.CutCopyMode = False
Selection.Copy
Range("K1").Select
ActiveSheet.Paste
Columns("H:H").Select
Application.CutCopyMode = False
Selection.Cut
Columns("M:M").Select
ActiveSheet.Paste
Columns("I:I").Select
Selection.Cut
Columns("H:H").Select
ActiveSheet.Paste
Range("I3").Select
ActiveCell.FormulaR1C1 = "=IF(AND(C4-C3<($I$1/1000),A4=A3)," & Chr(34) & "OOOO" & Chr(34) & "," & Chr(34) & "-----" & Chr(34) & ")"
Range("I3").Select

2 个答案:

答案 0 :(得分:3)

快速回答:

您需要将公式更改为R1C1样式 - 甚至更简单,将公式分配给.Formula而不是.FormulaR1C1属性。

更长的解释:

Excel有两种引用单元格的方法:

  1. 默认的 A1 表示法,您可以通过提供列字母和行号来引用单元格,并通过为$添加前缀将其固定到行或列。
  2. R1C1 表示法,您可以通过使用R指定行以及行编号和C列以及列号来引用单元格。如果在[]括号中提供了数字,则引用是相对的,没有括号,它是绝对的。要使用此表示法,您需要在Excel选项(在公式下)
  3. 中进行设置

    R1C1 表示法的优点是,当应用于多个单元格时,相对引用不会更改!例如,在C1中输入的A1公式=A1+B1将为=RC[-2]+RC[-1]。如果现在将公式复制到C列,则行号将在 A1 样式的每一行中更改(例如=A2+B2=A3+B3等)。在 R1C1 表示法中,它是完全相同的公式,没有任何变化。

    在普通的Excel用户界面中,这并不重要,只是偏好问题,因为只要您使用$正确修复绝对引用,Excel就会自动调整公式。 *

    然而,它在宏中变得更有用,如果你想搜索和替换引用!想象一下,在上面的示例中,您希望将公式从=A1+B1更改为=A1+A2 - 在使用此公式的任何位置。在 A1 中,您不能简单地搜索和替换B1与A2,因为B1将变为B2,B3等。但是,在 R1C1 中,您只需使用RC[-1]重新R[1]C即可。

    因此,Excel宏记录器还会在 R1C1 中记录公式 - 无论您将其应用于何处,它都是相同的公式!但是,每个Range都有一个.Formula和一个FormulaR1C1属性,您可以设置 - 另一个属性将相应更新。因此,请根据需要使用任何适合的风格。

    在您的情况下, R1C1 公式是有意义的,如果您打算将其与I3以外的其他单元一起使用。

    A1

    Range("I3").Formula = "=IF(AND(C4-C3<($I$1/1000),A4=A3),""OOOO"",""-----"")"
    Range("J4").Formula = "=IF(AND(D5-D4<($I$1/1000),B5=B4),""OOOO"",""-----"")"

    R1C1

    strFormula = "=IF(AND(R[1]C[-6]-RC[-6]<(R1C9/1000),R[1]C[-8]=RC[-8]),""OOOO"",""-----"")"
    Range("I3").FormulaR1C1 = strFormula
    Range("J4").FormulaR1C1 = strFormula

    HTH!

    (*有趣的侧节点:在Excel的第一个版本中,Microsoft使用 R1C1 作为默认表示法,因为它在多种方面优于 A1 。 ,由于Lotus 1-2-3是当时的标准, A1 已经被接受为常态,它在以后的版本中恢复了这种表示法。)

答案 1 :(得分:0)

您的问题是使用.FormulaR1C1而未使用 R1C1 公式。

如果查看电子表格,您会看到C3包含

=MID('B3',1,2)*3600+MID('B3',4,2)*60+MID('B3',7,9)

因为它翻译了你对字符串的引用,而reeor指的是它试图引用一个它不理解的公式的单元格。

要使用B3(和C3,以及其他),您需要使用.Formula代替:

ActiveCell.Formula = "=MID(B3,1,2)*3600+MID(B3,4,2)*60+MID(B3,7,9)"
ActiveCell.Formula = "=IF(AND(C4-C3<($I$1/1000),A4=A3)," & Chr(34) & "OOOO" & Chr(34) & "," & Chr(34) & "-----" & Chr(34) & ")"