2008年7月28日星期一

Part11 - VBA 學習第十回 - 正確 , 不正確 ( 繁體 )

| |
~ 上傳‧分享‧網賺 ~
~ 免費上傳空間‧請即申請 Freak Share ~
~ 進入後請點選左上角 注冊 ! ~

~ 聲明事項 ~

如各位想把以下本文章轉貼 , 請記得要注明出處.

本文章之內容為本人之經驗所寫, 絕無抄襲成份, 特此聲明.

由於圖片製作需時, 所以更新會比較慢.

存放圖片的 SHARE A PIC SERVER 可能讀取速度較慢, 請耐心等待.

Picture


上一次有提過 , 如果按照以下的程式碼


( 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

Unknown 說...

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 是指那一個部份 ?? 這個不懂你的意思哦 ~

Unknown 說...

威廉先生:
你好!我在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 之前 , 如果還未太清楚 , 可以參考一下上面第一個留言 :)

另一件事就是 .... 學習的時候總會遇到問題的 , 提出來多討論才會有進步嘛 , 千萬別在意問題的深淺 :)

有空記得多點來哦 :)

swgj6jp6 說...

威廉先生:
我遇上問題了....
在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

Kam Tat 說...

你的模組名為DataEntry嗎?
可能是Module1喔
因為你在DataEntry裡call BBB這個function

Unknown 說...

請問唔知點解
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 學習第十回 - 正確 , 不正確 找不到物件的問題回應 . ( 繁 )

Quart 說...

Hi!master
感謝提供free
but,都沒看到commandbuton1 記錄的程式

最新回應

Loading...

有事啟奏‧無事閒聊 ~ 哈 ~


米高積遜全復刻 哈利波特 Michael Jackson 妙麗 金曲獎 MJ 迈克尔杰克逊其实没有死!美国CBC电台已证实 哈利波特 hongkong168 蓮花河畔景苑 盧廣仲 鄧麗欣 不想放手New! 陳珊妮 方大同 巨乳排球 痞子英雄 23 東風 蕭閎仁 米高積遜全復刻 上海 倒塌 南王姐妹花 周杰倫 變形金剛2下載 michael jackson 去世 天文台 米高積遜 花拉科茜 天圖佈局 浪卡 耳廓狐 神探俏嬌娃 韶关旭日玩具厂 譚曉風 严妍 僧老少閒 地下天文台 金泰浩 百老匯 巨乳排球 陳振聰 柯柏文 aika 麥可傑克森