標題:
[發問]
如何設定
[打印本頁]
作者:
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,讓使用者只能從上述數值選
Private Sub UserForm_Initialize()
'加上以下兩行
ComboBox1.List = 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)
ComboBox1.Style = fmStyleDropDownList
End Sub
複製代碼
作者:
acdx
時間:
2013-8-30 17:11
回復
5#
stillfish00
因為覺得使用ComboBox對使用者來說較不方便(輸入速度慢)所以才想嘗試用TextBox直接輸入
作者:
GBKEE
時間:
2013-9-1 15:47
回復
5#
acdx
Option Explicit
Dim Ob(), Msg As Boolean
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) '表單關閉時會執行此程式
If Text_Checking(TextBox1) = False Then Cancel = True '表單駐點留在TextBox1上
End Sub
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Text_Checking(TextBox2) = False Then Cancel = True
End Sub
Private Function Text_Checking(T As MSForms.TextBox) As Boolean
Dim I As Variant
Text_Checking = True '預設為 True
If Msg Then Exit Function '表單已關閉
I = Application.Match(Val(T), Ob, 0) '找不到
If IsError(I) Then Text_Checking = False
If Text_Checking = False Then MsgBox T & " 不是正確的數字" & vbLf & Join(Ob, vbTab) & vbLf & "以上為正確的數字"
End Function
Private Sub UserForm_Initialize()
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)
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Msg = True '表單關閉時變數設為 True
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 函數,都能這樣用呢 ?
Sub TEST()
'If IsError(Application.Match(999, Array(1, 2, 3), 0)) Then MsgBox "Not found"
'If IsError(Application.WorksheetFunction.Match(999, Array(1, 2, 3), 0)) Then MsgBox "Not found"
End Sub
複製代碼
作者:
ML089
時間:
2013-9-4 10:30
回復
9#
stillfish00
網路上找的範例提供參考,
看來 application.XXX 與 WorksheetFunction.XXX或application.WorksheetFunction.XXX用法確有不同
Sub test2()
Dim v As Variant
For Each i In Array(2, 7)
Debug.Print i
' v is assigned Error 2042
v = Application.Match(i, Array(1, 2, 3), 0)
Debug.Print "Application"; Tab(25); v
Debug.Print "Err.Number"; Tab(25); Err.Number
Debug.Print
' trappable error generated, no assignment to v
v = Empty
On Error Resume Next
v = WorksheetFunction.Match(i, Array(1, 2, 3), 0)
Debug.Print "WorksheetFunction"; Tab(25); v
Debug.Print "Err.Number"; Tab(25); Err.Number
Debug.Print
On Error GoTo 0
' run-time error, no assignment to v
v = WorksheetFunction.Match(i, Array(1, 2, 3), 0)
Next
End Sub
複製代碼
作者:
GBKEE
時間:
2013-9-4 11:00
回復
9#
stillfish00
Match 不是特例, 使用Application.WorksheetFunction其他函數傳回錯誤值,VBA 會有產生錯誤值.
Option Explicit
Sub TEST()
Dim A As Variant
A = Application.Match(999, Array(1, 2, 3), 0)
If IsError(A) Then MsgBox "Not found"
'可用 [ 計算活頁簿的名稱或函數 ]
A = [MATCH(999,{1, 2, 3},0)] '[ 這不可用變數(計算活頁簿的名稱或函數) ]
If IsError(A) Then MsgBox "Not found"
' **** 變通方式******************
Names.Add "AAA", Array(1, 5, 100, 3)
Names.Add "B", 100
If IsError([MATCH(B,AAA,0)]) Then
MsgBox "Not found"
Else
MsgBox [MATCH(B,AAA,0)]
End If
End Sub
複製代碼
作者:
Hsieh
時間:
2013-9-4 11:38
回復
2#
acdx
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
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)
Set dic = CreateObject("Scripting.Dictionary")
For Each ky In ob
dic.Add ky, ky
Next
If dic.exists(Val(TextBox1)) = False Then MsgBox "輸入值錯誤"
End Sub
複製代碼
作者:
GBKEE
時間:
2013-9-4 12:25
本帖最後由 GBKEE 於 2013-9-4 12:26 編輯
回復
6#
acdx
Private Sub UserForm_Initialize() 'ExportResult(表單模組)
Dim Ob() '<-這Dim Ob 變數 只可以在 UserForm_Initialize程序中使用
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)
End Sub
複製代碼
Option Explicit 'ExportResult(表單模組)
Dim Ob(), Msg As Boolean ' 這兩行程式碼 請放在 ExportResult(表單模組)的最上端
(如此這Dim Ob 變數,ExportResult(表單模組)所有程式可乎叫的)
Private Sub CommandButton2_Click()
Unload Me
ALtoolbox.Show
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/)