很多時候,我們必須要將程式寫的更完美,避免搗亂的user亂玩一通,其中一個比較常遇到的是,利用InputBox輸入資料的地方,若是正常輸入沒什麼問題,但有時user還沒輸入就按了Enter,或者突然不想輸入,按了取消,這兩種狀態,在VBA裡,帶出資料都是「空值」。要注意的是,即使在欄位處輸入資料,最後按「取消」,帶出來的資料與都沒輸入資料按下「確定」的資料都是空值。
這就麻煩了,你無法判斷user輸入是空值還是取消掉不要輸入,還好VBA有個「隱藏」函數可以用,StrPtr在官方說明文件裡沒有任何資訊,但上網搜尋可以找到,該函數應該是VB5、VB6使用的函數可回傳UNICODE 字串緩衝區的位址,因此如果按下取消,就不會有緩衝區位址,數值為0。
我們以上一篇的程式來進行修改,讓StrPtr判斷是否user按下了取消,如果是取消,就重新出現密碼輸入視窗,直到按下確定才離開Do...Loop迴圈。
Sub InputBoxDK_with_StrPtr_TEST()
'判斷InputBox函數是按了確定還是取消
'使用StrPtr函數
Dim strAdminPWord As String
Do
strAdminPWord = InputBoxDK("請輸入密碼:", "注意!")
If strAdminPWord = "password" Then
MsgBox "密碼正確! ", vbOKOnly, "恭喜!"
Exit Do
ElseIf StrPtr(strAdminPWord) <> 0 Then
MsgBox "密碼錯誤!", , "殘念~"
Exit Sub '離開程式
End If
MsgBox "抱歉!不能取消餒!"
Loop Until StrPtr(strAdminPWord) <> 0
MsgBox "繼續執行"
'密碼輸入正確後
'要執行的程式放在這裡
End Sub
以下為執行畫面:
開啟後的輸入密碼視窗
密碼輸入錯誤後,出現提醒視窗,並離開程式。
按下取消鍵或者X按鈕關閉視窗後,出現的提醒訊息,按下確定後會繼續出現輸入視窗
輸入正確密碼後,出現提醒訊息
然後再執行密碼正確後執行的程式。
要注意的是,中途判斷密碼是否輸入正確的程式,中間的判斷要增加一個「ElseIf StrPtr(strAdminPWord) <> 0」,確定user按的不是取消,如果是的話就繼續跳到迴圈中執行帶出輸入視窗,當然,如果取消後,要執行其他步驟也是可行,例如帶出另一個詢問視窗是否取消,或者帶出其他子程式等,就看實際的需求如何了。
參考資料:
http://support.microsoft.com/kb/199824/zh-tw
http://vb.mvps.org/tips/varptr.asp