之前動態表格的更新問題我都是加了一個按鈕來觸發更新的事件,簡潔卻不美觀。老大跟我說一定要解決,感謝崔兄之前告訴了active事件。後來查閱資料我又發現了有change事件!這個似乎更好用,通過更崔兄討論確定了用會計年度,會計週期,公司代碼這三個變數作為更新查詢的條件。
在寫代碼中我又發現了兩個問題,第一個問題是query裡有7個查詢,你怎麼知道那一個query最後更新。這個問題還是很好解決的,我寫了一段代碼測試了下,如下:
If Target.Address = "$CG$1" Or Target.Address = "$CH$9" Then
MsgBox "query 7"
ElseIf Target.Address = "$A$1" Or Target.Address = "$B$9" Then
MsgBox "query 1"
ElseIf Target.Address = "$Q$1" Or Target.Address = "$R$9" Then
MsgBox "query 2"
ElseIf Target.Address = "$AK$1" Or Target.Address = "$AK$9" Then
MsgBox "query 3"
ElseIf Target.Address = "$AX$1" Or Target.Address = "$AY$9" Then
MsgBox "query 4"
ElseIf Target.Address = "$BJ$1" Or Target.Address = "$BK$9" Then
MsgBox "query 5"
ElseIf Target.Address = "$BW$1" Or Target.Address = "$BX$9" Then
MsgBox "query 6"
End If
之前我還以為最後更新的會是最後插入的查詢,不過最後通過代碼居然發現是最先插入的查詢最後更新!而且每次的測試結果都一樣。從而確定了用第一個查詢的儲存格作為檢查更新的儲存格。
第二個問題就不那麼明顯了,代碼每次會在這裡報錯:
'選中要刪除的區間C_deltePlace,用序號來判斷
While Worksheets(p_ContentSheet).Cells(p_conRows, 2).Value "" '根據空行判斷是否刪除
'選中刪除
Worksheets(p_ContentSheet).Cells(p_conRows, 2).Select
Selection.EntireRow.Delete
Wend
我還以為不能將代碼封裝在sub裡,但是我將代碼複製到change的sub裡也一樣。後來我將selcet去掉就可以完美執行了!
While Worksheets(p_ContentSheet).Cells(p_conRows, 2).Value "" '根據空行判斷是否刪除
'選中刪除
Worksheets(p_ContentSheet).Cells(p_conRows, 2).EntireRow.Delete
Wend
不加selcet就可以了,怪不得提示range的select方法無效。對一門不熟悉的語言就是這樣,會碰到這樣那樣的錯誤,解決問題必須得仔細推敲其錯誤的提示。
ps:vba太強大了,一定要把excel 2007 programmer reference看完。