![](/img/trans.png)
[英]Run-time error '1004' when applying formula to Range.FormulaR1C1 in VBA
[英]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)是包含有效数字的单元格
任何帮助表示赞赏!
=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)))))
用示例数据创建一个新的工作簿 :
File
→ New
→ Blank Workbook
。 在新的工作表上: A1
输入数字12.345
B1
输入数字6
(然后按Enter ) 创建一个命名单元格sigfigs :
B1
,单击“ Define Name...
sigfigs
并按Enter 接下来,创建一个新的VBA模块 : Alt + F11 Alt + I Alt + M
在新模块中,从第一行开始: Option Explicit
(应始终在所使用的每个模块的顶部使用,尤其是在学习代码或对代码进行故障排除时。)
跳过(空白)行,然后开始一个新的子程序,例如:
Sub PrecisionTest()
...,然后按Enter键 ,VBE将在下面添加End Sub
行。
在 Sub...
和End Sub
:将公式粘贴到VBA编辑器中: Ctrl + V
更换每组两套报价的报价:
"
""
Replace All
。 (应该说进行了62次更换。) OK
,然后单击X以关闭“ Replace
窗口。 在粘贴的代码行的开头 ,输入: Range("C1").Formula="
在粘贴的代码行的末尾 ,再输入一组引号 : "
(或单击另一行,由于末尾会丢失,因此它将自动添加。)
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
C1
,其结果将是字符串 : 12.3450
。 在所有经验水平的编码人员中,复制他人发布的(工作中的)代码片段都很普遍,但是重要的是,首先尝试完全复制该代码以进行复制。
仅在验证副本可以正常工作(正确结果;无错误)之后,才应根据需要开始添加自己的修改。 一次进行一个小更改, 在每次更改后执行代码以对其进行测试,以确保它仍然有效... (尤其是在VBA学习曲线的开头)。
另外,Excel单元格用字母 (列)和数字 (行)引用,因此没有像您尝试的那样带有负数的头寸(并且您没有显示任何代码将NRC 声明为对象,也没有显示Set作为Range ,因此您没有正确使用Offset
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.