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

问题描述 投票:-1回答:1

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

我得到了一个在工作表单元格中运行的公式,这是神奇公式的来源:https://stackoverflow.com/a/41891803/9111492

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

这是我编辑过的代码

错误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)是包含有效数字的单元格

任何帮助表示赞赏!

excel vba excel-vba
1个回答
3
投票
  1. 复制您尝试复制的the answer中的整个公式。这是它的精确副本:

=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 + 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

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

© www.soinside.com 2019 - 2024. All rights reserved.