~ 上傳‧分享‧網賺 ~
~ 免費上傳空間‧請即申請 Freak Share ~
~ 進入後請點選左上角 注冊 ! ~
~ 聲明事項 ~
如各位想把以下本文章轉貼 , 請記得要注明出處.
本文章之內容為本人之經驗所寫, 絕無抄襲成份, 特此聲明.
由於圖片製作需時, 所以更新會比較慢.
存放圖片的 SHARE A PIC SERVER 可能讀取速度較慢, 請耐心等待.
上一次有提過 , 如果按照以下的程式碼
( Pic11_1 )
當 Sheet1 中的儲存格 B2 有資料時 , 會有一個訊息視窗跳出來顯示 "正確" 再顯示 "錯誤" , 這是因為電腦在閱讀程式碼時 , 是一句一句往下看的 , 所以現在我們就要告訴電腦 , 怎樣避開這個問題 .
記得我們第一次編寫模組時 , 我教過你的東西嗎 ? 增加模組之後 , 我們就可以在編寫程式碼的位置增加一個 SUB XXX . 當然 , 我們不用每一次都先開一個模組 , 再增加一段程式碼 , 如果是這樣的話 , 當你要進行管理或者除蟲 ( DEBUG ) 時 , 就會變得十分不便 , 試想像 , 一個程式有數百個模組 ... ... 暈了 ... ... 當然 , 如果你的程式利害得可以控制什麼飛機大炮 , 就有可能會出現上百個模組 , 但是我們在開發 VBA 程式的時候 , 我們只是要開發一些適合的工具給自己 , 如果你要的功能太利害 , 我也不建議你用 EXCEL - VBA 來開發 ~
現在我們先在 End Sub 下面 , 再增加一段新的程式碼 , 這是獨立的 , 放心 , 電腦不會隨便執行的 .
( Pic11_2 )
我所增加的名字是 BBB ( 只是方便吧 ~ 懶得去想個好名字而已 XD ) , Sub BBB 內的程式碼就是之前的 MsgBox ("正確") , 再看一看上面 Sub AAA 程式碼的改變 , 當 Sheet1 中的儲存格 B2 有資料 , NUMBER 這個變數就會等於 1 , 當 NUMBER 這個變數等於 1 , 就跳到 FIRST: 的部份執行 , 改變的地方就在這裡了 ( 對你來說也是一個新的東西吧 XD ) , 這裡多了一句 DataEntry.BBB , 這一句的意思 , 就是要電腦找到 模組 DataEntry 內的 Sub BBB , 也就是說 , 當 NUMBER 這個變數的值等於 1 的時候 , 電腦就要執行 FIRST: 的部份 , 在 FIRST: 部份內的指令就只有一個 , 就是跳到 DataEntry 模組內 , 找出 程式碼 BBB 然後執行 .
現在 , 我們先想像一下程式在執行後的效果吧 . 首先 , 我們把 Sheet1 中的儲存格 B2 中的資料刪除 , 理論上來說 , NUMBER 這個變數的值就等於 2 , 會執行 SECOND: 的部份 , 之後就會有一個訊息跳出來顯示 "錯誤"
( Pic11_3 )
看到嗎 ?? 看不到 ?? 怎麼會呢 ~ 等我想一想 ... ... ... 哦 ~ 對了 , 忘了告訴你 , 先在 Sub AAA() 這一行程式碼 , 用你親愛的滑鼠指著它點一下左鍵 , 再按播放吧 ~ 呵呵呵 ~ 可以看到了嗎 ? 哈哈 ~ 不要忘記哦 ~ 電腦很笨的 XD , 你一定要先點一下第一行 , 好等電腦知道那裡是程式的第一行哦 ~
好 ~ 讓電腦發現錯誤和告訴我們的程式碼沒有問題了 , 那麼 , 現在就要測試一下 , 要它執行 FIRST: 的部份 , 首先在 Sheet1 中的儲存格 B2 加一點資料 , 什麼文字也好 , 只要有東西就可以了 ~
先想像一下 , 現在 B2 的儲存格是有資料的 , 那麼 NUMBER 這個變數就會等於 1 , 也就是會執行 FIRST: 的部份 , 而 FIRST: 這個部份中 , 就只有一個指令 , 就是要電腦找到模組 DataEntry 內的 程式碼 BBB , 理論上來說 , 如果程式碼沒有出錯 , 那麼 , 我們就會看到 "正確" 的訊息了 .
( Pic11_4 )
按一下確定吧 ~
( Pic11_5 )
等等 ~ 怎麼搞的 ~ "正確" 之後又看到 "錯誤" 了耶 ~~~~~~
你是這樣想吧 ~ 哈哈哈哈哈 ~ 不要騙我了 ~ 我完全知道了你在想什麼 ~ 哈哈哈哈哈 ~
好吧 ~ 等我來再說明一次吧 ~ 電腦在閱讀程式碼的時候 , 是一句一句往下看的 , 不信的話 , 你在 Sub AAA() 點一下左鍵 , 之後慢慢地按 "F8" , 準備執行的程式碼會變了顏色的 ( 我之前有告訴過你吧 ~ ) , 看到嗎 ? 每按一次 "F8" 它就會執行一句程式碼 , 現在我們直到它執行到 Sub BBB() 的部份 , 看看執行完了之後 , 程式碼跳到那裡 ~
( Pic11_6 )
看到了吧 , 問題就在這裡了 , 按照正常情況來說 , 一個報表的第一個記錄 , 只會在第一次使用時沒有資料 , 不會每天都沒有資料的 , 如果是每天都沒有資料 , 那這個報表就沒有存在的意義了 ~ 再想一想 , 電腦閱讀程式碼是一行一行往下看的 , 當完成 FIRST: 的部份 , 很自然地就會執行 SECOND: 的部份了 , 完成 SECOND: 的部份之後 , 就來到了程式碼的最後一句 End Sub .
所以 , 我們又要再一次動動腦筋 , 修改一下程式碼的執行順序 , 可以怎樣做呢 ? 想到嗎 ? 就把 FIRST: 和 SECOND: 這兩個部份的程式碼次序反過來放吧 ~
( Pic11_7 )
剛才說過了 , 電腦閱讀程式碼是一句一句看的 , 報表也是在第一次使用時是沒有資料的 , 所以在第一次使用時 , 是必定會出現錯誤的 , 而剛才說過的問題 ( 先 "正確" 後 "錯誤" ) 還是會出現 , 只是次序不同了 ( 變成 先 "錯誤" 後 "正確" ) , 所以 , 我們又要再錯加多一點 , 使程式碼在顯示 "錯誤" 之後 , 直接跳到 End Sub 就好了 , 有想到方法嗎 ? 嘿嘿嘿 ~ 就是使用 GOTO 嘛 ~
( Pic11_8 )
現在的程式碼又改變了 , 當顯示 "錯誤" 這個訊息之後就直接跳到 FINISH: 的部份 , 當電腦跳到 FINISH: 的時候 ~ 嘿嘿嘿 ~ 直接完結了 ~ 如果顯示 "正確" , 那麼完成 Sub BBB 之後就是完結 , 哈哈 ~ 問題避開了耶 ~ 是不是很高興 ~ 哈哈哈 ~
可能你現在又多了一個問題 , 既然 GOTO 這個方法可以避開上述的問題 , 那麼 , 我們有必要把程式碼反轉來放嗎 ? 答案是沒有的 ~ 哈哈哈 ~ 只要在增加 FINISH: 這個部份之後 , 分別在 FIRST: 和 SECOND: 下面增加一句 GoTo Finish 就可以了 ~ 不過 , 我的原意是要你明白 , 不管你的程式碼怎樣放 , 電腦都是一句一句來閱讀的 ~
注意 !
當要利用程式碼呼叫模組內的子程式 , 必需要緊記程式碼的模組名稱必需跟你設定的模組名稱一致 , 比如說 , 你設定的模組名稱是 Module1 內有一個子程式 ABC , 那麼你的程式碼就是 Module1.ABC , 但是 , 如果你所設定的模組名稱改過來了 , 比如 DataEntry , 那麼你的程式碼就要改為 DataEntry.ABC , 這個必須要注意哦 !!
11 留言:
對於已經有兩位朋友來到第十回的時侯, 都出現程式碼找不到模組 DATAENTRY 內的 SUB BBB 這個問題 , 現在, 我就把我的程式碼貼出來給大家吧 , 不過要注意 , 由於這段程式碼是從已經完成的程式中複製出來 , 所以有可能跟教學文章中所提到的有點差別 ... 嗯 ... 希望沒有把你搞到更加混亂吧 ~
Sub Entry()
'確定第一行記錄有沒有資料
Worksheets("Sheet1").Select
Worksheets("Sheet1").Range("B2").Select
'如果 Sheet1 中的儲存格 B2 等於空白 , 變數 Number = 2 , 否則 Number = 1
If Worksheets("Sheet1").Range("B2").Value = "" Then Number = 2 Else Number = 1
'如果 Number = 1 執行 First 部份 , Number = 2 執行 Second 部份
If Number = 1 Then GoTo First
If Number = 2 Then GoTo Second
First:
DataEntry.bbb
'AddRecord.AddNewRecord
GoTo Finish
Second:
NewReport.FirstRecord
Finish:
End Sub
Sub bbb()
MsgBox "abcdefg"
End Sub
============================
再加多一點說明 , 其實當你在修改 FIRST: 這個部份的時候 , 你要注意一件事 , 在增加 DataEntry.bbb 這句程式碼之前 , 你應該先要把
Sub bbb()
MsgBox "abcdefg"
End Sub
這部份增加到程式碼內 , 因為當你在 FIRST: 這個部份中作出修改時, 當你一個一個字地輸入 ( DataEntry ) 這個字的時候 , 當你按到中間的 "." , 電腦就會顯示一個小窗, 你就可以在裡面看到 BBB 這個字了 , 這就證明了電腦找到了對應的物件 ... 嗯 ...
我想... 這個應該是解決問題的方法吧 . 先試試看吧~ 再有問題的話可以再問哦 ~ =)
若跑出執行期間錯誤 424,可至下面link找到解決辦法
http://www.articlesbase.com/data-recovery-articles/runtime-error-424-object-required-vba-fix-now-1014362.html
haha
威廉大, 你今天和我一樣宅在家裡嗎XD
為了剛剛在留言板內的問題
我停頓了兩天= =
之後我回去再把你的紅字看了幾次
我明白我的問題原因在於
我在FIRST撰寫的時候
DATAENTRY.bbb
DATAENTRY.Module1.bbb
DATAENTRY.......
是的,
我把"DATAENREY" 視為一個指令(例如:if, goto之類的) = ="
Orz
感謝你的回覆.真不好意思, 新手嘛~~你知道的, 常常會自以為知道, 但其實是搞錯了. XD
不過我想問, 這段是不是因為你想要讓我們知道如何Link到子資料夾?
我當初在解決Erro424的時候
把程式碼First & Second皆改成MsgBox
不過我在這兩個下面加上Goto Finish
好像也可以執行相同的效果耶@@"
Hi 團長 :)
其實新手遇到的問題真的是千奇百怪呢 ~ 我初學的時候都有試過你的情況 , 把物件的名稱當成是指令 ~ 哈哈 ~ 更怪的都試過 ~ 哈哈 ~ 小聲點 ~ 小聲點 ~
另外你所指的把程式碼First & Second皆改成MsgBox 是指那一個部份 ?? 這個不懂你的意思哦 ~
威廉先生:
你好!我在VBA學習第十回也遇上了問題耶!就是我輸入 goto finish,按執行後,它出現"標籤未定義",所以我也不知道是那兒出問題了耶?拍謝!想麻煩您幫忙解答一下,我也是對這個vba完完全全不懂,聽說它功能強大,又發現了您無私的分享,所以正跟著您教學的步驟在學習中,附上我的程式碼~
Sub AAA()
Worksheets("sheet1").Select
Worksheets("Sheet1").Range("B1").Select
Worksheets("Sheet1").Range("B2").Select
If Worksheets("Sheet1").Range("B2").Value = "" Then Number = 2 Else Number = 1
If Number = 1 Then GoTo First
If Number = 2 Then GoTo Second
Second:
MsgBox ("錯誤")
GoTo finish
First:
DataEntry.BBB
'ActiveCell.end(XlDown).select
End Sub
Sub BBB()
MsgBox ("正確")
End Sub
請問一下 "標籤未定義"的標籤在那兒呢?問這麼淺的問題,實在是很拍謝啦!
Hi ~ 蓉羚 ~
你的程式碼當中欠了 Finish: 這個東西 , 所以電腦就跟你說 "標籤未定義" 了 ~ :)
而按照你的程式碼 , 你需要把 Finish: 這個東西記得是放在 SUB AAA 內的 END SUB 之前 , 如果還未太清楚 , 可以參考一下上面第一個留言 :)
另一件事就是 .... 學習的時候總會遇到問題的 , 提出來多討論才會有進步嘛 , 千萬別在意問題的深淺 :)
有空記得多點來哦 :)
威廉先生:
我遇上問題了....
在B1未輸入數值時跑出「cd」,但是輸入數值之後,一樣是在
first:
DataEntry.BBB
會發生「執行階段錯誤'424'」,我試了上面的方法都無法排除...,請幫一下初學者的我...
附上我的程式碼:
Sub AAA()
Worksheets("Sheet1").Range("B2").Select
If Worksheets("Sheet1").Range("B2").Value = "" Then Number = 2 Else Number = 1
If Number = 1 Then GoTo First
If Number = 2 Then GoTo Second
First:
DataEntry.BBB
Second:
MsgBox ("cd")
'ActiveCell.End(xlDown).Select
End Sub
Sub BBB()
MsgBox ("ab")
End Sub
你的模組名為DataEntry嗎?
可能是Module1喔
因為你在DataEntry裡call BBB這個function
請問唔知點解
Sub AAA()
Worksheets("Sheet1").Select
Worksheets("Sheet1").Range("B2").Select
If Worksheets("Sheet1").Range("B2").Value = "" Then Number = 2 Else Number = 1
If Number = 1 Then GoTo First:
If Number = 2 Then GoTo Second:
First:
DataEntry.bbb
'AddRecord.AddNewRecord
GoTo Finish
Second:
NewReport.FirstRecord
Finish:
End Sub
Sub bbb()
MsgBox "abcdefg"
End Sub
我一按PLAY佢就話我DataEntry.bbb依一句錯誤'424'.此需要物件
但我獨立行bbb都行到
Hi Eric ~
ERROR 424 發生是因為程式找不到 DataEntry.bbb , 可以參考一下這編 對於 VBA 學習第十回 - 正確 , 不正確 找不到物件的問題回應 . ( 繁 )
Hi!master
感謝提供free
but,都沒看到commandbuton1 記錄的程式
發佈留言