Board logo

標題: [發問] 如何設定 [打印本頁]

作者: acdx    時間: 2013-8-29 17:50     標題: 如何設定

我要限制TextBox1及TextBox2所輸入的數值必須為"100, 125, 160, 200, 250, 315, 400, 500,630, 800, 1000, 1250, 1600, 2000, 2500, 3150,4000, 5000, 6300, 8000, 10000, 12500, 16000, 20000",若不是則跳出警告視窗 這該怎麼寫?
可否使用矩陣
OB = Array(100, 125, 160, 200, 250, 315, 400, 500, _
                630, 800, 1000, 1250, 1600, 2000, 2500, 3150, _
                4000, 5000, 6300, 8000, 10000, 12500, 16000, 20000)
然後該怎麼寫比較好?
作者: acdx    時間: 2013-8-30 16:34     標題: RE: 如何限制文字方塊內容?

回復 1# acdx
目前想法是讓
T1=TextBox1.Value且T1必須為矩陣OB中的數字,否則即顯示"請輸入正確數值"
該如何讓程式檢查T1是否為矩陣中的數呢?
作者: stillfish00    時間: 2013-8-30 16:57

回復 4# acdx
可以改用Combobox,讓使用者只能從上述數值選
  1. Private Sub UserForm_Initialize()
  2.   '加上以下兩行
  3.   ComboBox1.List = Array(100, 125, 160, 200, 250, 315, 400, 500, _
  4.                 630, 800, 1000, 1250, 1600, 2000, 2500, 3150, _
  5.                 4000, 5000, 6300, 8000, 10000, 12500, 16000, 20000)
  6.   ComboBox1.Style = fmStyleDropDownList
  7. End Sub
複製代碼

作者: acdx    時間: 2013-8-30 17:11

回復 5# stillfish00
因為覺得使用ComboBox對使用者來說較不方便(輸入速度慢)所以才想嘗試用TextBox直接輸入
作者: GBKEE    時間: 2013-9-1 15:47

回復 5# acdx
  1. Option Explicit
  2. Dim Ob(), Msg As Boolean
  3. Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) '表單關閉時會執行此程式
  4.     If Text_Checking(TextBox1) = False Then Cancel = True        '表單駐點留在TextBox1上
  5. End Sub
  6. Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  7.     If Text_Checking(TextBox2) = False Then Cancel = True
  8. End Sub
  9. Private Function Text_Checking(T As MSForms.TextBox) As Boolean
  10.     Dim I As Variant
  11.     Text_Checking = True                   '預設為 True
  12.     If Msg Then Exit Function              '表單已關閉
  13.     I = Application.Match(Val(T), Ob, 0)   '找不到
  14.     If IsError(I) Then Text_Checking = False
  15.     If Text_Checking = False Then MsgBox T & " 不是正確的數字" & vbLf & Join(Ob, vbTab) & vbLf & "以上為正確的數字"
  16. End Function
  17. Private Sub UserForm_Initialize()
  18.     Ob = Array(100, 125, 160, 200, 250, 315, 400, 500, _
  19.                 630, 800, 1000, 1250, 1600, 2000, 2500, 3150, _
  20.                 4000, 5000, 6300, 8000, 10000, 12500, 16000, 20000)
  21. End Sub
  22. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  23.     Msg = True                '表單關閉時變數設為  True
  24. End Sub
複製代碼

作者: acdx    時間: 2013-9-3 18:04

回復 6# GBKEE
依照您的方式改好後
TextBox1輸入後要選TextBox2繼續輸入時就出現錯誤
[attach]15927[/attach]
附上檔案:需安裝增益集ToolBox
開啟test.xlsx->執行增益集->點選Export Test Result->選擇Sound Pressure, 輸入頻率範圍->"Export >"
[attach]15928[/attach]
作者: acdx    時間: 2013-9-3 18:23

回復 7# acdx
密碼:2945
作者: stillfish00    時間: 2013-9-3 20:03

本帖最後由 stillfish00 於 2013-9-3 20:05 編輯

回復 6# GBKEE
版主,請教一下
之前自己試寫,使用 Application.WorksheetFunction.Match 去尋找陣列元素,找不到時總會出現錯誤 1004,導致強制偵錯..使用上很不方便,改用 Application.Match 反而就不會了,十分方便,難道這兩個是不同 function ?

那麼 Match 是特例嗎 ? 是否其他會傳回 #N/A 錯誤值的 WorksheetFunction  函數,都能這樣用呢 ?
  1. Sub TEST()
  2.   'If IsError(Application.Match(999, Array(1, 2, 3), 0)) Then MsgBox "Not found"
  3.   'If IsError(Application.WorksheetFunction.Match(999, Array(1, 2, 3), 0)) Then MsgBox "Not found"
  4. End Sub
複製代碼

作者: ML089    時間: 2013-9-4 10:30

回復 9# stillfish00

網路上找的範例提供參考,
看來 application.XXX 與 WorksheetFunction.XXX或application.WorksheetFunction.XXX用法確有不同
  1. Sub test2()
  2.     Dim v As Variant
  3.     For Each i In Array(2, 7)
  4.     Debug.Print i
  5.    
  6.     ' v is assigned Error 2042
  7.     v = Application.Match(i, Array(1, 2, 3), 0)
  8.     Debug.Print "Application"; Tab(25); v
  9.     Debug.Print "Err.Number"; Tab(25); Err.Number
  10.     Debug.Print
  11.    
  12.     ' trappable error generated, no assignment to v
  13.     v = Empty
  14.     On Error Resume Next
  15.     v = WorksheetFunction.Match(i, Array(1, 2, 3), 0)
  16.     Debug.Print "WorksheetFunction"; Tab(25); v
  17.     Debug.Print "Err.Number"; Tab(25); Err.Number
  18.     Debug.Print
  19.     On Error GoTo 0
  20.    
  21.     ' run-time error, no assignment to v
  22.     v = WorksheetFunction.Match(i, Array(1, 2, 3), 0)
  23.    
  24.     Next
  25. End Sub
複製代碼

作者: GBKEE    時間: 2013-9-4 11:00

回復 9# stillfish00
Match 不是特例, 使用Application.WorksheetFunction其他函數傳回錯誤值,VBA 會有產生錯誤值.
  1. Option Explicit
  2. Sub TEST()
  3.     Dim A As Variant
  4.     A = Application.Match(999, Array(1, 2, 3), 0)
  5.     If IsError(A) Then MsgBox "Not found"
  6.     '可用 [ 計算活頁簿的名稱或函數 ]
  7.     A = [MATCH(999,{1, 2, 3},0)]  '[ 這不可用變數(計算活頁簿的名稱或函數) ]
  8.     If IsError(A) Then MsgBox "Not found"
  9.     ' **** 變通方式******************
  10.     Names.Add "AAA", Array(1, 5, 100, 3)
  11.     Names.Add "B", 100
  12.     If IsError([MATCH(B,AAA,0)]) Then
  13.         MsgBox "Not found"
  14.     Else
  15.         MsgBox [MATCH(B,AAA,0)]
  16.     End If
  17. End Sub
複製代碼

作者: Hsieh    時間: 2013-9-4 11:38

回復 2# acdx
  1. Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  2. ob = Array(100, 125, 160, 200, 250, 315, 400, 500, 630, 800, 1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000, 6300, 8000, 10000, 12500, 16000, 20000)
  3. Set dic = CreateObject("Scripting.Dictionary")
  4. For Each ky In ob
  5.    dic.Add ky, ky
  6. Next
  7. If dic.exists(Val(TextBox1)) = False Then MsgBox "輸入值錯誤"
  8. End Sub
複製代碼

作者: GBKEE    時間: 2013-9-4 12:25

本帖最後由 GBKEE 於 2013-9-4 12:26 編輯

回復 6# acdx
  1. Private Sub UserForm_Initialize()   'ExportResult(表單模組)
  2. Dim Ob()   '<-這Dim Ob 變數 只可以在 UserForm_Initialize程序中使用
  3. Ob = Array(100, 125, 160, 200, 250, 315, 400, 500, _
  4.             630, 800, 1000, 1250, 1600, 2000, 2500, 3150, _
  5.             4000, 5000, 6300, 8000, 10000, 12500, 16000, 20000)
  6. End Sub
複製代碼
  1. Option Explicit         'ExportResult(表單模組)
  2. Dim Ob(), Msg As Boolean  ' 這兩行程式碼 請放在 ExportResult(表單模組)的最上端
  3. (如此這Dim Ob 變數,ExportResult(表單模組)所有程式可乎叫的)
  4. Private Sub CommandButton2_Click()
  5. Unload Me
  6. ALtoolbox.Show
  7. End Sub
複製代碼

作者: stillfish00    時間: 2013-9-4 13:28

回復 9# ML089
回復 10# GBKEE
明白了,又拿 Lookup 和 Index 比較一下,也是類似情形
    v1 = Application.Lookup(0, Array(1, 2, 3))
    v2 = Application.Index(Array(1, 2, 3), 4)
省略 WorkSheetFunction => 只會使函數傳回錯誤值
有加 WorkSheetFunction => 造成執行階段錯誤
也謝謝提供變通方法參考。




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