excel 巨集 這是那錯了?出現執行階段錯誤1004應用程式或物件定義上錯誤
這是一個簡單的 excel
我要在 H18~H268 填滿公式:
'=IF(COUNTIF($B$18:$B18,$B18)=1,SUMIF($B$18:$B$267,B18,$G$18:$G$267),"")
'=IF(COUNTIF($B$18:$B19,$B19)=1,SUMIF($B$18:$B$267,B19,$G$18:$G$267),"")
'=IF(COUNTIF($B$18:$B20,$B20)=1,SUMIF($B$18:$B$267,B20,$G$18:$G$267),"")
我用巨集來協助
Sub Macro1()
'
' Macro1 Macro
' AMD945 在 2017/6/5 錄製的巨集
'
' 快速鍵: Ctrl+u
'
Dim row_i As Long
For row_i = 18 To 258
'=IF(COUNTIF($B$18:$B18,$B18)=1,SUMIF($B$18:$B$267,B18,$G$18:$G$267),"")
'=IF(COUNTIF($B$18:$B19,$B19)=1,SUMIF($B$18:$B$267,B19,$G$18:$G$267),"")
'=IF(COUNTIF($B$18:$B20,$B20)=1,SUMIF($B$18:$B$267,B20,$G$18:$G$267),"")
'Sheets("Sheet1").Cells(row_i, 8) = "=IF(COUNTIF($B$18:$B"&row_i&",$B"&row_i&")=1,SUMIF($B$18:$B$267,B"&row_i&",$G$18:$G$267),"""")"
Sheets("Sheet1").Cells(row_i, 8) = "=IF(COUNTIF($B$18:$B"
Next row_i
End Sub
我將公式轉成 字串,來填入 cell
Sheets("Sheet1").Cells(row_i, 8) = "=IF(COUNTIF($B$18:$B"&row_i&",$B"&row_i&")=1,SUMIF($B$18:$B$267,B"&row_i&",$G$18:$G$267),"""")"
但是程式一直出現 執行階段錯誤1004應用程式或物件定義上錯誤
我將字串一直刪,刪到
Sheets("Sheet1").Cells(row_i, 8) = "=IF(COUNTIF($B$18:$B"
還是有問題,我真的無能為力了,為什麼這麼簡單的字串還能錯?
※excel 2003
附加壓縮檔: 201706/mobile01-a46fe5e36e79b1523266295c1880f518.zip
'Sheets("Sheet1").Cells(row_i, 8) = "=IF(COUNTIF($B$18:$B"&row_i&",$B"&row_i&")=1,SUMIF($B$18:$B$267,B"&row_i&",$G$18:$G$267),"""")"
dim row_str as string
row_str="=IF(COUNTIF($B$18:$B"&row_i&",$B"&row_i&")=1,SUMIF($B$18:$B$267,B"&row_i&",$G$18:$G$267),"""")"
Sheets("Sheet1").Cells(row_i, 8) = row_str
填入完整的字串就不會有error
好奇怪呀~~~~
參考: https://stackoverflow.com/questions/18574413/weird-run-time-1004-error-with-strings-in-excel-vba
附註: string 如果不完整,代入公式就會一直出現 error ,而且很難找
可以這樣 加入 『'』號
row_str="=IF(COUNTIF($B$18:$B" &row_i& ",$B&18)=1,SUMIF($B$18:$B$267,B"&row_i&",$G$18:$G$267),"")"
row_str="'=IF(COUNTIF($B$18:$B" &row_i& ",$B&18)=1,SUMIF($B$18:$B$267,B"&row_i&",$G$18:$G$267),"")"
變成寫入字串,而不是公式,這樣才能快速除錯
Eigen wrote:
執行階段錯誤1004應用程式或物件定義上錯誤 ...(恕刪)
請參考這篇中,我回答的範例,裡面有用到2種方法
https://www.mobile01.com/topicdetail.php?f=511&t=5141759&p=1#64504439
第一種
sheets("sheet1").Cells(1, 1) = Evaluate("公式")
計算結果,直接在放儲存格(不會出現公式)
第二種(這應該是您要的)
sheets("sheet1").Cells(1, 1).FormulaR1C1="公式"
把公式填入儲存格中再算出結果(含公式),公式需中的位置需要修改成 r1c1 格式
For row_i = 18 To 258
Sheets("Sheet1").Cells(row_i, 8).FormulaR1C1 = "=IF(COUNTIF(R18C2:RC2,RC2)=1,SUMIF(R18C2:R267C2,RC[-6],R18C7:R267C7),"""")"
next row_i
如果用迴圈
r1c1格式的公式中,不需要另加變數,功能就像打了一格公式,往下拉到其它格一樣,公式會自動改
如果不會改r1c1格式
很簡單,只要開錄製巨集,在儲存格中輸入完整公式,錄到的那串文字就是了
Eigen wrote:
可以這樣 加入 『'』號
row_str="=IF(COUNTIF($B$18:$B" &row_i& ",$B&18)=1,SUMIF($B$18:$B$267,B"&row_i&",$G$18:$G$267),"")"
row_str="'=IF(COUNTIF($B$18:$B" &row_i& ",$B&18)=1,SUMIF($B$18:$B$267,B"&row_i&",$G$18:$G$267),"")"
變成寫入字串,而不是公式,這樣才能快速除錯...(恕刪)
填入字串?? 這樣不就失去了用vba自動填入公式意義了嗎??
這樣不是更好除錯,變數就 row_str 一個,也不用在公式裡面加上變數 row_i
row_str="=IF(COUNTIF(R18C2:RC2,RC2)=1,SUMIF(R18C2:R267C2,RC[-6],R18C7:R267C7),"""")"
(迴圈方式)
For row_i = 18 To 258
Sheets("Sheet1").Cells(row_i, 8).FormulaR1C1 = row_str
next row_i
(不用迴圈方式)
With Sheets("sheet1").Range("h18")
.FormulaR1C1 = row_str
.AutoFill Destination:=Range("h18:h258"), Type:=xlFillDefault
End With
主要就是這sheet 有上個千公式,很怕使用者在操作的過程無心修改到公式
所以用個巨集來重建這些公式,
結果10欄公式,建完,卻 有兩欄出包(如果通通出包我還比較能接受)
搞了我一整晚(字串都被我刪到剩個位數還是error )
<------------------------------------
加『'』改成字串,因為公式出錯時,只會顯示
執行階段錯誤1004應用程式或物件定義上錯誤
完全無助除錯,加上『'』,就能將錯誤的字串輸出到 儲存格
這樣就就將錯誤 公式,和正確的公式相比較,加快除錯的速度。
不然一直 『執行階段錯誤1004應用程式或物件定義上錯誤』
設 中斷點,字串又長到看不完,太難除錯了

Eigen wrote:
主要就是這sheet 有上個千公式,很怕使用者在操作的過程無心修改到公式
...(恕刪)
建議公式建好後,就鎖定有公式的儲存格
這只是excel的基本保護功能
Eigen wrote:
這樣就就將錯誤 公式,和正確的公式相比較,加快除錯的速度。
不然一直 『執行階段錯誤1004應用程式或物件定義上錯誤』
設 中斷點,字串又長到看不完,太難除錯了大哭
...(恕刪)
建議轉成r1c1格式來檢查,程式比較單純
=IF(COUNTIF($B$18:$B18,$B18)=1,SUMIF($B$18:$B$267,B18,$G$18:$G$267),"")
=IF(COUNTIF($B$18:$B19,$B19)=1,SUMIF($B$18:$B$267,B19,$G$18:$G$267),"")
=IF(COUNTIF($B$18:$B20,$B20)=1,SUMIF($B$18:$B$267,B20,$G$18:$G$267),"")
因為在r1c1格式中,當上面3個公式轉成字串時,是相同的
=IF(COUNTIF(R18C2:RC2,RC2)=1,SUMIF(R18C2:R267C2,RC[-6],R18C7:R267C7),"""")
比對用的公式不需要加變數處理
快速檢查(or修改)公式
Sub checkformula()
'正確公式1,欄位h
check1 = "=IF(COUNTIF(R18C2:RC2,RC2)=1,SUMIF(R18C2:R267C2,RC[-6],R18C7:R267C7),"""")"
'這樣也可以,不過要確定那格公式是正確的
'check1=cells(18,8).FormulaR1C1
'檢查欄位h
Set Data = Columns(8).SpecialCells(xlFormulas)
'開始檢查
For Each 公式 In Data
If 公式.FormulaR1C1 <> check1 Then
MsgBox "錯誤" & 公式.Address & vbNewLine & 公式.FormulaR1C1 & vbNewLine & "正確" & check1
'修正公式
' Range(公式.Address).FormulaR1C1 = check1
end if
Next
End Sub
內文搜尋

X