Board logo

標題: [發問] call 模組後符合條件時,如何停止程式碼執行? [打印本頁]

作者: reangame    時間: 2014-5-22 00:03     標題: call 模組後符合條件時,如何停止程式碼執行?

本帖最後由 reangame 於 2014-5-22 00:05 編輯

執行一個日期選擇表單,點選確定後執行Call tutu模組,
  1. Sub tutu()
  2.    
  3.     Set sh = Sheets("開休市日期表")
  4.     Set r = sh.Columns("B").Find(md)
  5.     If Not r Is Nothing Then
  6.         md = ""
  7.     End If
  8.     If week = "星期六" Or week = "星期日" Or md = "" Then
  9.         MsgBox "所選日期為未開盤日,請重新選擇!", 0, "系統訊息"
  10.         End
  11.     End If

  12. End Sub
複製代碼
符合條件後停止程式碼繼續執行,但出現一個問題,停止後連表單都關閉了,
請問該如何修改可達成不關閉表單而停止程式碼執行?
作者: reangame    時間: 2014-5-22 00:07

補充一下,問題應該是出在代碼第10行,把End更改為Exit  sub時,只會停止模組的程式碼,還是會繼續執行表單的程式碼,如何全都停止又不關閉表單?
作者: c_c_lai    時間: 2014-5-22 07:31

補充一下,問題應該是出在代碼第10行,把End更改為Exit  sub時,只會停止模組的程式碼,還是會繼續執行表單 ...
reangame 發表於 2014-5-22 00:07

把第十行移除就行了。
If ...... End If 執行完畢程式碼便會往下執行,直到 End Sub 即行跳離該程式模組 (Sub tutu()  ~  End Sub)。
作者: stillfish00    時間: 2014-5-22 14:06

回復 1# reangame
你的tutu可以改用function並回傳tutu的執行狀況給呼叫它的地方,再判斷該怎麼跳出。

如:
  1. Function tutu() as boolean
  2.     Set sh = Sheets("開休市日期表")
  3.     Set r = sh.Columns("B").Find(md)
  4.     If Not r Is Nothing Then
  5.         md = ""
  6.     End If
  7.     If week = "星期六" Or week = "星期日" Or md = "" Then
  8.         MsgBox "所選日期為未開盤日,請重新選擇!", 0, "系統訊息"
  9.         tutu = false
  10.     else
  11.         tutu = true
  12.     End If
  13. End Function
複製代碼
呼叫tutu的表單按鈕:
  1. Private Sub CommandButton1_Click()
  2.     if not tutu then exit sub
  3. End Sub
複製代碼

作者: reangame    時間: 2014-5-24 17:34

回復 3# c_c_lai

c_c_lai大大,您好:
您的方法已經測試過了,把End移除掉後,表單內的程式碼依舊會執行,我的需求是先Call模組程式碼執行,符合條件後,連同表單中的程式碼一起停止執行,不好意思喔!
作者: reangame    時間: 2014-5-24 17:48

本帖最後由 reangame 於 2014-5-24 17:49 編輯

回復 4# stillfish00

stillfish00大大,您好:
您的程式碼確實可以停止【選擇收盤日期】表單中的程式碼繼續運行,但產生一個延續性的問題,請看附圖:
[attach]18358[/attach]
表單中的Label=【星期六】為ComboBox_Change自動產生,【week】程式碼如下,
  1. Function week()
  2.     week = Format(DateSerial(ComboBox3.Text, ComboBox2.Text, ComboBox1.Text), "[$-404]aaaa;@")
  3. End Function
複製代碼
選擇完日期後點選確定,Call tutu模組後,不管選擇哪一天都是出現【所選日期為未開盤日,請重新選擇!】,也就是均不符合所設定的條件,
經詳細研究發現:tutu模組無法判斷表單中【week】的值,
請問該如何將表單中【Week】的值傳到tutu模組?
還請繼續指導,感謝大大!!!
作者: c_c_lai    時間: 2014-5-25 07:09

回復  c_c_lai

c_c_lai大大,您好:
您的方法已經測試過了,把End移除掉後,表單內的程式碼依舊會執行 ...
reangame 發表於 2014-5-24 17:34

如果你需要呼叫模駔再做判斷,則請自行修正成 stillfish00 的涵式,
Function tutu() as boolean 如是符合條件後,連同表單中的程式碼一起停止執行。
作者: reangame    時間: 2014-5-25 16:36

本帖最後由 reangame 於 2014-5-25 16:37 編輯

回復 7# c_c_lai

c_c_lai大大,您好
我已經修改了,可是有個小問題,6樓的回覆http://forum.twbts.com/redirect. ... 5&fromuid=10492
表單的值,模組判斷不到=.=
可以指導一下嗎?
作者: reangame    時間: 2014-5-25 20:51

回復 4# stillfish00
回復 7# c_c_lai

兩位大大,您好:
我解決問題了,解決方式如下:
  1. Function tutu() As Boolean
  2.     Set sh = Sheets("開休市日期表")
  3.     md = 選擇收盤日期.ComboBox2.Value & "月" & 選擇收盤日期.ComboBox1.Value & "日"
  4.     Set r = sh.Columns("B").Find(md)
  5.      If Not r Is Nothing Then
  6.         md = ""
  7.     End If
  8.      If 選擇收盤日期.Label1 = "星期六" Or 選擇收盤日期.Label1 = "星期日" Or md = "" Then
  9.         MsgBox "所選日期為未開盤日,請重新選擇!", 0, "系統訊息"
  10.         tutu = False
  11.     Else
  12.         tutu = True
  13.     End If
  14. End Function
複製代碼
得到一個結論:
就是在模組程式碼中,要取用表單的值時,必須指定表單的物件名稱(如:選擇收盤日期.ComboBox2、選擇收盤日期.Label1 ),
之前都沒有指定表單名稱,都直接使用  ComboBox2.Value,因此模組都抓不到表單的值。
但是.....表單中的程序,如下:
  1. Function week()
  2.     week = Format(DateSerial(ComboBox3.Text, ComboBox2.Text, ComboBox1.Text), "[$-404]aaaa;@")
  3. End Function
複製代碼
仍然不知道該如何讓模組抓取到這個程序的值,
因此,我將week的值改用選擇收盤日期.Label1來代替,
不過還是很想知道表單中,程序所產生的值有什麼辦法可以讓模組直接取用???
作者: c_c_lai    時間: 2014-5-25 21:07

回復 9# reangame
  1. Function week(Text3 As String, Text2 As String, Text1 As String) As String
  2.     week = Format(DateSerial(Text3, Text2, Text1), "[$-404]aaaa;@")
  3. End Function

  4. Sub Test()
  5.    Dim txt As String
  6.    
  7.    txt = week("2014", "5", "24")
  8.    MsgBox txt
  9. End Sub
複製代碼

作者: reangame    時間: 2014-5-25 22:46

本帖最後由 reangame 於 2014-5-25 22:48 編輯

回復 10# c_c_lai

c_c_lai大大,您好:
經測試您提供的程式碼後出現錯誤,如下圖:
[attach]18364[/attach]
錯誤出現在以下程式碼:
  1. Private Sub ComboBox2_Change()
  2.     ComboBox1.Clear
  3.     rday = Day((DateSerial(ComboBox3.Text, ComboBox2.Text + 1, 1) - 1))
  4.     For i = 1 To rday
  5.         ComboBox1.AddItem i
  6.     Next i
  7.     ComboBox1.Text = Day(Date)
  8.     Me.Label1.Caption = week
  9. End Sub
複製代碼
程式碼錯誤出現在第8行的week,
請您再指導一下!
作者: c_c_lai    時間: 2014-5-26 07:27

本帖最後由 c_c_lai 於 2014-5-26 07:28 編輯

回復 11# reangame
你的 week() 函數並沒有帶入引數之故。
  1. Function week(Text3 As String, Text2 As String, Text1 As String) As String
  2.     week = Format(DateSerial(Text3, Text2, Text1), "[$-404]aaaa;@")
  3. End Function
複製代碼
舉例:
  1.     Me.Label1.Caption = week(ComboBox3.Text,ComboBox2.Text,ComboBox1.Text)
  2.     '   ComboBox3.Text 等為引入值,亦即可為任何之字串引數,或許它為不同表單之 "選擇收盤日期B.ComboBoxA.Text"
複製代碼

作者: stillfish00    時間: 2014-5-26 16:52

回復 9# reangame

表單中的程序,如下:
Function week() ......
還是很想知道表單中,程序所產生的值有什麼辦法可以讓模組直接取用???


釐清一下
tutu為模組中function,week為表單(選擇收盤日期)中function
要在tutu中呼叫week,需要前面掛上哪一個表單
如:
If 選擇收盤日期.week = "星期六" Or 選擇收盤日期.week = "星期日" Or md = "" Then
作者: reangame    時間: 2014-5-27 22:06

回復 12# c_c_lai
回復 13# stillfish00

c_c_lai大大、stillfish00大大:
不好意思昨天出差去了,沒辦法上網,
依照stillfish00大大所說的:在week前面加上表單名稱就抓取的到week的值了,
原來就這麼簡單,真是汗顏  =.=....
不過,也更加深了我的印象,還是很感謝兩位大大的指導,感謝唷!




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)