【问题标题】:Excel VBA: can't paste my function into a cellExcel VBA:无法将我的函数粘贴到单元格中
【发布时间】:2013-01-30 21:11:12
【问题描述】:

我正在尝试粘贴

=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” 应用程序定义或对象定义的错误

我已经尝试过双引号并看到 & Chr(34) & 解决方法并尝试过。没有任何效果。 此外,像

这样简单的东西
 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

【问题讨论】:

  • .FormulaR1C1 需要 R1C1 中的公式。您在 A1 中提供了一个公式。请改用.Formula
  • 首先,按照提示here,避免在代码中使用.select
  • 什么是 r1c1 和 a1 我在这里有点菜鸟,我只是通过“录制宏”功能制作并正在编辑它
  • 仅供参考,99% 的时间“运行时错误 '1004' 应用程序定义或对象定义错误”表示“您的 VBA 代码引发了异常,但您的 VBA 代码中没有异常处理程序。”如果您添加一些异常处理,您应该能够看到实际的 VBA 错误是什么。

标签: excel excel-formula vba


【解决方案1】:

快速回答:

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

更长的解释:

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

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

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

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

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

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

在您的情况下,R1C1 公式是有意义的,如果您打算将它也用于 I3 以外的其他单元格。

A1

Range("I3").Formula = "=IF(AND(C4-C3

R1C1

strFormula = "=IF(AND(R[1]C[-6]-RC[-6]

HTH!

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

【讨论】:

    【解决方案2】:

    您的问题是使用 .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) & ")"
    

    【讨论】:

      猜你喜欢
      • 2015-02-07
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多