excel 巨集 這是那錯了?出現執行階段錯誤1004應用程式或物件定義上錯誤

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
2017-06-05 22:21 發佈
自己解:

'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

snare wrote:
建議公式建好後,就鎖定有公式的儲存格
這只是excel的基本保護功能


不能保護,因為這是設計來讓使用者操作

光是『雙擊功能』,sheet protect 後,整個雙擊就失效~~ (這問題我也搞了一晚~~

內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?