[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『キーボードからも入力できる電卓』(kota)
Visual Studio 2005を使用しています。
VBAを使い始めて数ヶ月の初心者です。
よろしくお願いします。
普通のフォームから入力する電卓までは出来たのですが
キーボードから入力する部分で悩んでいます。
参考になりそうな物をあちこち見たのですが
なかなか分かりません。
下に貼った物が一番私の作りたい物に近いのですがVB6は
まったく分からなくて困っています。
お分かりになる方VBAではどの部分が変わるのか
そうでなければVBAの似たようなコードがあるサイトなどを
教えていただければと思っています。
勝手なお願いですがどうかよろしくお願いします。
Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii >= Asc("0") And KeyAscii <= Asc("9") Then cmdNum_Click KeyAscii - Asc("0") ElseIf KeyAscii = Asc(".") Then cmdNum_Click 10 ElseIf KeyAscii = Asc("c") Or KeyAscii = Asc("C") Then cmdClear_Click ElseIf KeyAscii = Asc("+") Then cmdEnzan_Click 0 ElseIf KeyAscii = Asc("-") Then cmdEnzan_Click 1 ElseIf KeyAscii = Asc("*") Then cmdEnzan_Click 2 ElseIf KeyAscii = Asc("/") Then cmdEnzan_Click 3 ElseIf KeyAscii = Asc("=") Then cmdEnzan_Click 4 End If End Sub
紹介だけですが、下記のようなサイトは参考になりますか。 http://home.att.ne.jp/zeta/gen/excel/c04p07.htm (Mook)
回答者への参考として。
キーボードからも入力できる電卓 http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=59836;id=excel (マルチネス)
VBAでは、コントロール配列が使えない事が問題なのですか? だとしたら、クラスモジュールを用いてそれらしいことを実現するコードを作成しないとなりません。
例として、1,2,3のボタンと表示用のラベルがある作りかけの電卓(?)を考えます。
新規ブックにユーザーフォーム(UserForm1)だけを配置してください。
コマンドボタンやラベルは、コードで配置しますから、何も配置しないで下さい。
まず、コントロール配列を実現するための準備です。
クラスモジュールを二つ用意してください(名前は、Calss1 Class2)
Class1のクラスモジュールに
'===================================================================== Option Explicit Event cclick(id As Long) Private c_controls As Collection '===================================================================== Private Sub Class_Initialize() Set c_controls = New Collection End Sub '===================================================================== Private Sub Class_Terminate() Set c_controls = Nothing End Sub '===================================================================== Sub btn_click(id As Long) RaiseEvent cclick(id) End Sub '===================================================================== Sub add(typ As Long, id As Long, obj1 As Object) ' typ 1:textbox 2:combobox 3:commandbutton 4:Label '今のところ、3のcommandbuttonだけ Dim btn As Class2 Select Case typ Case 3 Set btn = New Class2 btn.set_controls id, obj1, Me c_controls.add btn End Select End Sub
Class2のクラスモジュールに
'===================================================== Option Explicit Private WithEvents btn As MSForms.CommandButton Private id As Long Private pa_obj As Object Private Sub btn_click() pa_obj.btn_click id End Sub '===================================================== Sub set_controls(idx As Long, obj1 As MSForms.CommandButton, obj2 As Object) Set btn = obj1 id = idx Set pa_obj = obj2 End Sub
Userform1のモジュールに
'================================================================== Option Explicit Private WithEvents contev As Class1 Private lbl As MSForms.Label '================================================================== Private Sub contev_cclick(id As Long) lbl.Caption = lbl.Caption & CStr(id) End Sub '================================================================== Private Sub UserForm_Initialize() Dim btn As MSForms.CommandButton Dim g0 As Long Dim lef_array As Variant lef_array = Array(24, 60, 96)
With Me .Width = 230 .Height = 228 Set lbl = .Controls.add("Forms.Label.1", , True) With lbl .Left = 24 .Top = 24 .Width = 180 .Height = 24 .BackColor = &H80000009 .SpecialEffect = 2 .Font.Size = 12 .TextAlign = 3 End With Set contev = New Class1 For g0 = 0 To 2 Set btn = .Controls.add("Forms.Commandbutton.1", , True) btn.Left = lef_array(g0) btn.Top = 60 btn.Width = 36 btn.Height = 30 btn.TabStop = False btn.TakeFocusOnClick = False btn.Caption = StrConv(CStr(g0 + 1), 4) contev.add 3, g0 + 1, btn Next End With End Sub '================================================================== Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If KeyAscii >= Asc("0") And KeyAscii <= Asc("9") Then contev_cclick KeyAscii - Asc("0") End If End Sub
最後に標準モジュールに
'=============================================================== Sub smaple_proc() UserForm1.Show End Sub
として、sample_proc を実行してみてください。
キーボード入力が可能になります。
問題点 仕様の問題ですが、キーボードからの1、2、3と入力した瞬間に当該ボタンが押されたことがわかる 動作がほしいねえ 実際の電卓はそうなるもんねえ
UserForm1のモジュールのKeyPressイベントを
Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If KeyAscii >= Asc("0") And KeyAscii <= Asc("9") Then With Controls("commandbutton" & KeyAscii - Asc("0")) .SetFocus SendKeys Chr(13) DoEvents .Visible = False .Visible = True End With End If End Sub
なんてすると、ちょっとそれらしくなりますねえ!!
試してみて下さい
ichinose
いろいろ為になるお話をありがとうございます。
無事解決しました。
特にichinoseさま
なるほど!と目からウロコです。
分かりやすい例えが嬉しかったです。
kota
VBA質問箱ではマルチポストは構わないが他で解決したらどのように解決したか報告してください、とあるのできちんと解決報告をしておいてください。 (独覚)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.