VBA运行时错误1004:范围(“”).Formula

时间:2017-12-18 01:26:03

标签: excel vba excel-vba

基本上,我想根据另一个细胞的有效数字的数量来改变细胞的有效数字。

我得到了一个适用于工作表单元格的公式,这是神奇公式的来源: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 个答案:

答案 0 :(得分:3)

  1. 复制您尝试复制的the answer中的整个公式。这是完全复制
  2. =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。在新工作表上:
      • 在单元格 12.345
      • 中输入数字A1
      • 在单元格 6 中输入数字B1(并点击 Enter
    2. 创建一个命名单元格 sigfigs

      • 右键点击单元格B1,点击Define Name...
      • 键入 sigfigs ,然后按 Enter
    3. 接下来,创建一个新的VBA模块 Alt + F11 Alt + 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. 在粘贴的代码行的 end 处,再输入一组引号 " < sub> (或者只是点击不同的行,它会自动添加,因为它从最后遗漏。)

    10. 你的模块现在看起来像这样:

      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
      2.   

        复制其他人发布的(工作)代码段非常常见   在所有经验水平的编码员中,但重要的是   首先尝试复制代码完全以复制它。

             

        只有 之后才能验证您的副本是否按预期工作   (正确的结果;没有错误)你应该开始添加自己的   根据需要修改。一次一次小改动,   执行代码以在每次更改后测试以确保它   仍在工作...... (特别是在VBA学习曲线的开头。)

        此外,Excel单元格用字母(列)和数字(行)引用,因此没有像您尝试的那样具有负数的位置(并且您没有显示任何代码声明 NRC作为对象,设置也不是范围,因此您没有使用Offset正确。

        Here is a link显示 Range 对象的语法和示例,此处有一个关于 Offset 方法的示例。我还建议您查看: