![](/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.