繁体   English   中英

VBA运行时错误1004:范围(“”)。公式

[英]VBA Run-Time Error 1004: Range(“ ”).Formula

基本上,我想根据另一个单元的有效数字来更改一个单元的有效数字。

我有一个在工作表单元格中有效的公式,魔术公式的来源: https : //stackoverflow.com/a/41891803/9111492

现在,我想将该公式移动到vbe,以便在按下按钮时将该公式插入到单元格中。 但是我面临一个错误。

这是我编辑并获得

错误1004

Dim NRC As Range
Range(NRC.Offset(-1, 35), NRC.Offset(-1, 38)).Formula = _
        "=TEXT(IF(" & NRC.Offset(-1, 39).Address & "<0,""-"","""")&LEFT(TEXT(ABS(" & NRC.Offset(-1, 39).Address & "),""0.""&REPT(""0""," & NRC.Offset(-1, 41).Address & "-1)&""E+00"")," & NRC.Offset(-1, 41).Address & "+1)*10^FLOOR(LOG10(TEXT(ABS(" & NRC.Offset(-1, 39).Address & "),""0.""&REPT(""0""," & NRC.Offset(-1, 41).Address & "-1)&""E+00"")),1),(""""&(IF(OR(AND(FLOOR(LOG10(TEXT(ABS(" & NRC.Offset(-1, 39).Address & "),""0.""&REPT(""0""," & NRC.Offset(-1, 41).Address & "-1)&""E+00"")),1)+1=" & NRC.Offset(-1, 41).Address & ",RIGHT(LEFT(TEXT(ABS(" & NRC.Offset(-1, 39).Address & "),""0.""&REPT(""0""," & NRC.Offset(-1, 41).Address & "-1)&""E+00"")," & NRC.Offset(-1, 41).Address & "+1)*10^FLOOR(LOG10(TEXT(ABS(" & NRC.Offset(-1, 39).Address & "),""" & _
        "T(""0""," & NRC.Offset(-1, 41).Address & "-1)&""E+00"")),1),1)=""0""),LOG10(TEXT(ABS(" & NRC.Offset(-1, 39).Address & "),""0.""&REPT(""0""," & NRC.Offset(-1, 41).Address & "-1)&""E+00""))<=" & NRC.Offset(-1, 41).Address & "-1),""0."",""#"")&REPT(""0"",IF(" & NRC.Offset(-1, 41).Address & "-1-(FLOOR(LOG10(TEXT(ABS(" & NRC.Offset(-1, 39).Address & "),""0.""&REPT(""0""," & NRC.Offset(-1, 41).Address & "-1)&""E+00"")),1))>0," & NRC.Offset(-1, 41).Address & "-1-(FLOOR(LOG10(TEXT(ABS(" & NRC.Offset(-1, 39).Address & "),""0.""&REPT(""0""," & NRC.Offset(-1, 41).Address & "-1)&""E+00"")),1)),0)))))"

NRC是范围的名称

NRC.Offset(-1,39)是包含我要更改有效数字的数字的单元格

NRC.Offset(-1,41)是包含有效数字的单元格

任何帮助表示赞赏!

  1. 从您要复制的答案复制整个公式。 这是它的精确副本

=TEXT(IF(A1<0,"-","")&LEFT(TEXT(ABS(A1),"0."&REPT("0",sigfigs-1)&"E+00"),sigfigs+1)*10^FLOOR(LOG10(TEXT(ABS(A1),"0."&REPT("0",sigfigs-1)&"E+00")),1),(""&(IF(OR(AND(FLOOR(LOG10(TEXT(ABS(A1),"0."&REPT("0",sigfigs-1)&"E+00")),1)+1=sigfigs,RIGHT(LEFT(TEXT(ABS(A1),"0."&REPT("0",sigfigs-1)&"E+00"),sigfigs+1)*10^FLOOR(LOG10(TEXT(ABS(A1),"0."&REPT("0",sigfigs-1)&"E+00")),1),1)="0"),LOG10(TEXT(ABS(A1),"0."&REPT("0",sigfigs-1)&"E+00"))<=sigfigs-1),"0.","#")&REPT("0",IF(sigfigs-1-(FLOOR(LOG10(TEXT(ABS(A1),"0."&REPT("0",sigfigs-1)&"E+00")),1))>0,sigfigs-1-(FLOOR(LOG10(TEXT(ABS(A1),"0."&REPT("0",sigfigs-1)&"E+00")),1)),0)))))

  1. 用示例数据创建一个新的工作簿

    • FileNewBlank Workbook 在新的工作表上:
    • 在单元格A1输入数字12.345
    • 在单元格B1输入数字6 (然后按Enter
  2. 创建一个命名单元格sigfigs

    • 右键单击单元格B1 ,单击“ Define Name...
    • 输入 sigfigs并按Enter
  3. 接下来,创建一个新的VBA模块Alt + F11 Alt + I Alt + M

  4. 在新模块中,从第一行开始: Option Explicit (应始终在所使用的每个模块的顶部使用,尤其是在学习代码或对代码进行故障排除时。)

  5. 跳过(空白)行,然后开始一个新的子程序,例如:

    Sub PrecisionTest()

    ...,然后按Enter键 ,VBE将在下面添加End Sub行。

  6. Sub...End Sub :将公式粘贴到VBA编辑器中: Ctrl + V

  7. 更换每组两套报价的报价:

    • Ctrl + H
    • 查找内容: "
    • 替换为: ""
    • 单击Replace All (应该说进行了62次更换。)
    • 单击OK ,然后单击X以关闭“ Replace窗口。
  8. 在粘贴的代码行的开头 ,输入: Range("C1").Formula="

  9. 在粘贴的代码行的末尾 ,再输入一组引号" (或单击另一行,由于末尾会丢失,因此它将自动添加。)

您的模块现在应如下所示:

Option Explicit

Sub PrecisionTest()

    Range("C1").Formula = "=TEXT(IF(A1<0,""-"","""")&LEFT(TEXT(ABS(A1),""0.""&REPT(""0"",sigfigs-1)&""E+00""),sigfigs+1)*10^FLOOR(LOG10(TEXT(ABS(A1),""0.""&REPT(""0"",sigfigs-1)&""E+00"")),1),(""""&(IF(OR(AND(FLOOR(LOG10(TEXT(ABS(A1),""0.""&REPT(""0"",sigfigs-1)&""E+00"")),1)+1=sigfigs,RIGHT(LEFT(TEXT(ABS(A1),""0.""&REPT(""0"",sigfigs-1)&""E+00""),sigfigs+1)*10^FLOOR(LOG10(TEXT(ABS(A1),""0.""&REPT(""0"",sigfigs-1)&""E+00"")),1),1)=""0""),LOG10(TEXT(ABS(A1),""0.""&REPT(""0"",sigfigs-1)&""E+00""))<=sigfigs-1),""0."",""#"")&REPT(""0"",IF(sigfigs-1-(FLOOR(LOG10(TEXT(ABS(A1),""0.""&REPT(""0"",sigfigs-1)&""E+00"")),1))>0,sigfigs-1-(FLOOR(LOG10(TEXT(ABS(A1),""0.""&REPT(""0"",sigfigs-1)&""E+00"")),1)),0)))))"

End Sub
  1. 单击子内部的某个位置,然后按F5执行它。 将使用公式填充工作表单元格C1 ,其结果将是字符串12.3450

所有经验水平的编码人员中,复制他人发布的(工作中的)代码片段都很普遍,但是重要的是,首先尝试完全复制该代码以进行复制。

验证副本可以正常工作(正确结果;无错误)之后,才应根据需要开始添加自己的修改。 一次进行一个小更改, 在每次更改后执行代码以对其进行测试,以确保它仍然有效... (尤其是在VBA学习曲线的开头)。

另外,Excel单元格用字母 (列)和数字 (行)引用,因此没有像您尝试的那样带有负数的头寸(并且您没有显示任何代码将NRC 声明为对象,也没有显示Set作为Range ,因此您没有正确使用Offset

这是一个显示Range对象的语法和示例的链接 ,这是有关Offset方法的链接。 我还建议您退房:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM