初心者なので質問が簡単な事かもしれませんが調べるのが下手なので、教えて下さい(><)
textboxに"999999.99"(-が付く場合もある)といった形で入力されたものを、"999k999m99"の形に変換しています。
その入力の部分で、"-"と"."と数値のみ入力できるように制限したいのですが、どうやったらよいか教えて下さい!
お願いします〜
APIのSetWindowLongとGetWindowLongを使えば出来ます。
下記のサイトを参照して下さい。
http://www.vbvbvb.com/jp/gtips/0701/gSetWindowLongEsNumber.html
この状態で"-"と"."を許可するにはKeyPressイベントで入力チェックして
SelTextで渡してやれば出来ます。
ただし先頭以外に"-"が入力された時や、"."が複数入力された時、ペーストされた時
のことを考えるとChangeイベントで更にチェックする必要が出てくると思います。
TextBoxのKeyPressイベントで数値と.と-以外の文字の番号を0にすればOKです。ちなみに文字の番号を調べるには"Asc("調べたい文字一文字")"でしらべられます。実際のコードとしては
Private Sub Text1_KeyPress(KeyAscii As Integer)
'MsgBox KeyAscii '押されたキーの番号を表示(必要ないしねwww)
If KeyAscii >= 48 And KeyAscii <= 57 Then '数値
ElseIf KeyAscii = 46 Or KeyAscii = 45 Then '.や-
ElseIf KeyAscii = 13 Then 'Enter
ElseIf KeyAscii = 8 Then 'BackSpace
Else
KeyAscii = 0
End If
End Sub
これで数値と.と-以外の入力は受け付けません。または拒否するキーがわかっている場合は、そちらを拒否の形をとるほうがスマートですね(量多くなるとは思いますが)
なるほど、確かにKeyPressで処理しても良いですね。
入力に関してのみ、色々なことを考えてみたんですがこんなのどうでしょう?
貼り付け禁止、マイナス符号は頭に一つのみ、小数点以下は2桁までしか入力できません。
桁数は最大10桁まで。
Option Explicit
'SendMessage
Private Declare Function SendMessage _
Lib "user32.dll" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, lParam As Any) _
As Long
'アンドゥ
Private Const WM_UNDO As Long = &H304&
Private bNotChange As Boolean
Private Sub Form_Load()
With Text1
.IMEMode = 3
.MaxLength = 10
End With
End Sub
Private Sub Text1_Change()
Static bUndo As Boolean
If bUndo Or bNotChange Then
bNotChange = False
Exit Sub
End If
bUndo = True
'貼り付け禁止(アンドゥ)
Call SendMessage(Text1.hWnd, WM_UNDO, 0, 0)
bUndo = False
End Sub
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
'デリートも許可
If KeyCode = vbKeyDelete Then
bNotChange = True
End If
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
Dim sText$, sBuff As String
Dim lPos As Long
Const sFilter As String = "-.0123456789"
sBuff = Chr$(KeyAscii)
bNotChange = True
If InStr(sFilter, sBuff) > 0 Then
With Text1
sText = .Text
If sBuff = "-" Then
'マイナス符号
If Not (.SelStart = 0 And Left$(sText, 1) <> sBuff) Then
'頭に一つのみ許可
KeyAscii = 0
End If
ElseIf sBuff = "." Then
'小数点
lPos = .SelStart
If lPos > 0 Then
'小数点以下は2桁まで
If lPos < Len(sText) - 2 Then
KeyAscii = 0
ElseIf Len(sText) - Len(Replace$(sText, sBuff, vbNullString)) > 0 Then
KeyAscii = 0
End If
Else
'頭には小数点は付けない
KeyAscii = 0
End If
Else
'数字
sBuff = Replace$(sText, "-", vbNullString)
sBuff = Replace$(sText, ".", vbNullString)
If Len(sBuff) >= 8 Then
'数字は8桁まで(マイナス符号と小数点を含めると最大10桁)
KeyAscii = 0
Else
lPos = InStr(sText, ".")
If lPos > 0 Then
'小数点がある場合
If .SelStart >= lPos And Len(sText) > lPos + 1 Then
'小数点以下は2桁まで
KeyAscii = 0
End If
End If
End If
End If
End With
ElseIf KeyAscii = vbKeyBack Then
'バックスペースは許可
Else
'他のものは不許可
bNotChange = False
KeyAscii = 0
End If
End Sub
すみません(><)
肝心な仕様部分についてあまり詳しく書いてなかったので追加なんですが…
画面の頭にドライブやディレクトリを選択する部分があります。
そこで選択されたディレクトリからファイルの一覧を取り寄せます。
そのファイル一覧から選択されたファイルの情報が色々表示され、内容に変更を加えて再度保存し直すような感じです。
そのファイルの中身の一つが、距離ということで質問しました。
なので、このTextboxには
1.データ(ファイルの中身)の形式は(-)999999.99
2.textboxに取り込む時は(-)999k99m99の形式に変換されている
2.そのまま使う場合と、変更を加える場合がある
現在、初期表示(-)999k999m99→GotFocusの時(-)999999.99に変換→ユーザーが値を変更したり、そのまま次の項目へ移ったり→LostFocusの時に(-)999k999m99に再変換
とゆーような感じです…
なので、入力の時に制限できたらチェックが楽でいいなぁと思ったんですが…
ちょっと説明が上手くできないのでわかりにくくてすみません…
入力された値に対するフォーマットのチェックがまた色々とややこしくて苦労しています…
色々と教えていただき、ありがとうございます!
ちょっと色々試してみますね〜
TextBoxのGetFocusとLostFocusのイベント時にkやmをとったり張ったりする動作をする方法はどうでしょうか?これと先ほど説明されたnanashiさんの方法や難しければ俺の書いた方法などを同時にに使えばよろしいかと・・・
-GetFocus時-
Text1 = Replace(Text1,"k","")
Text1 = Replace(Text1,"m","")
-LostFocus時-
Dim Km As Long,M As Long,Cm As Long
999999.99からKmとmとcmとに分ける処理をする(ここは自分で考えてください。今回はkmに"999"がmに"999"がcmに"99"が入っていると仮定します)
Text1 = Km & "k" & M & "m" & cm
これで入力時には"k"と"m"を消し、観覧時には"k"と"m"がついた形になります
すみません…また2説明不足だったようです…
本当に何度も色んな方法を教えていただき、ありがとうございます(><)
ユーザーの入力方法としては、小数点を付けた値で入力されます。
現在、自動で単位の付いた形式と小数点の付いた数値形式を切り替えるようにはしています。
例えば、小数点数値型で入力したものを単位付きに変換だと、
Kiro = Fix(text / 1000)
meter = Fix(Abs(text) - Abs(Kiro) * 1000)
centi = Abs(text) * 100 - Abs(Kiro) * 100000 - meter * 100
If Kiro = 0 And text < 0# Then
Buf = " -0k"
Else
Buf = Format$(Format$(Kiro, "##0"), "@@@") & "k"
End If
Buf = Buf & Format$(Format$(meter, "000"), "@@@") & "m" & Format$(centi, "00")
といった感じで…
色々やってみて何とか先が見えてきました!
あと少し。。。
できましたぁー!!!!!
色々あれやこれやと教えてもらったものを色々組み合わせたりして…
質問の仕方が分かりづらく色々とご迷惑をおかけしましたが、
丁寧に教えてくださったお二方本当にありがとうございました!
ツイート | ![]() |