[[20090110213938]] 『キーボードからも入力できる電卓』(kota) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『キーボードからも入力できる電卓』(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.