プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっております。

エクセルの画面に画像のようなユーザーフォームを作ってテンキーのように、セルに値を入力することは出来るのでしょうか?

もし出来るようでしたら、ボタンの割り当て方や、作成方法を教えて頂きたいです。

1)ユーザーフォームを使う理由は使わない時には非表示にしたいからです。
他の方法でも表示、非表示の切り替えが聞くのならユーザーフォームでなくても問題ありません

2)工事現場でつかいます。作業者が手袋をしたままタブレット端末で入力するので、大きいボタンで必要なキーだけを表示して、使わないときは非表示にできればと思っております。

すいませんが詳しい方、説明の上手な方、画像のようなことが可能でしたら作成方法を教えて下さい。よろしくお願いします。

※まだVBA初心者で簡単なユーザーフォームを作れる程度です。教えて頂いてもわからないかもしれませんが、今後のヒントにでもなればそれでいいです。親切な方、説明の上手な方、よろしくお願いします。

「エクセルの画面にユーザーフォームでテンキ」の質問画像

質問者からの補足コメント

  • うれしい

    No.1さん、No.2さん、アドバイスありがとうございます。
    http://bit.ly/297RCeDを参考にして、
    C16セルに入力するところま出来ました。
    あとはカーソルのあるセルに入力できるようにするだけですが、
    今の私ではどうすればいいのかわかりません
    もしご存じでしたら教えて下さい。

    Private Sub CommandButton1_Click()
    Sheets("sheet1").Range("c16") = TextBox1
    End Sub
    Private Sub CommandButton2_Click()
    TextBox1.Value = TextBox1.Value & "1"
    End Sub
    Private Sub CommandButton3_Click()
    TextBox1.Value = TextBox1.Value & "2"
    End Sub

    「エクセルの画面にユーザーフォームでテンキ」の補足画像1
      補足日時:2016/06/29 00:15
  • HAPPY

    いろいろなアドバイスありがとうございました。みなさんのおかげで、画像のようにできました。

    コードを貼り付けようとしましたが、文字数が大きくオーバーしたので、今回はお礼のコメントのみとさせて頂きました。

    この度は様々なアドバイスを頂き、本当にありがとうございました。私はこちらをよく利用しますので、機会がありましたら、またもよろしくお願いします。

    「エクセルの画面にユーザーフォームでテンキ」の補足画像2
      補足日時:2016/06/29 22:40

A 回答 (4件)

今はどうかわかりませんが、以前に同様にタッチパネル操作で機能するシステム作ったときは


適当なのが見つからず根気よく作りました
タッチしたボタンの内容をTextBox1に表示するとして

Private Sub CommandButton1_Click()
TextBox1.Value = TextBox1.Value & "1"
End Sub

Private Sub CommandButton1_Click()
TextBox1.Value = TextBox1.Value & "2"
End Sub

Private Sub CommandButton2_Click()
TextBox1.Value = TextBox1.Value & "3"
End Sub

Private Sub CommandButton3_Click()
TextBox1.Value = TextBox1.Value & "3"
End Sub

Private Sub CommandButton4_Click()
TextBox1.Value = TextBox1.Value & "4"
End Sub
以下省略
具合にします。
ボタンには、間違った場合を考慮して
クリアボタン を配置します。
Private Sub CommandButton15_Click()
TextBox1.Value = ""
End Sub
とか言った具合です。
    • good
    • 4
この回答へのお礼

ご解答ありがとうございます。明日、やってみます。それとすいませんが、もしご存じでしたら、あと2つ教えて下さい。
1つは「Ent」キーです。もう1つは「BackSpace」です。この2つは0~9のように割り当てられませんので。

お礼日時:2016/06/28 00:24

UserForm_Activateイベントプロシジャで、TextBox1のControlSourceプロパティに、選択されているセルのアドレスを設定してみて下さい。


こんな感じです。

Private Sub UserForm_Activate()
TextBox1.ControlSource = Selection.Address
End Sub
    • good
    • 3
この回答へのお礼

ご解答ありがとうございます。こういう方法もあるんですね。参考になりました。機会がありましたら、またお願いします。

お礼日時:2016/06/29 22:31

こんにちは。



このご質問を古くあるものですが、なかなか面倒な種類ですし、単に、コマンドボタンだけではつまらないので、テンキーとの兼ね合わせをしました。
直接の回答とは言えないかもしれません。

単に、こんなふうにしても可能だという見本です。

表示部分 -> Label1
0~9 ->CommandButton0 ~CommnadButton9
Minus ->CommandButton10
Enter ->CommandButton11
Clear ->CommandButton12

テンキーとマウスと共用させています。
しかし、こんな程度でも、もう私は、すぐにできなくなっていること自体が、悲しいというか、自分の中に不安が沸き起こってきます。

昔、ここの住人のKさんが作られた方法をどうしても思い出せず、検索しても出てこないので、私独自の方法に切り替えました。まだ、バグらしきものは残っています。本来は、Win32APIでフックすべきだと思いましたが、それすら、曖昧になってきています。以前の教えて!gooは、こんなコードでは、お茶を濁すようなものでしかなかったのでした。それに、今は、私の力も衰えてしまいました。

古臭い書き方は、私の過去に書いていたものを応用したからですが、これは、私のオリジナルです。

>あとはカーソルのあるセルに入力できるようにするだけですが、
参考にするべきところがありましたら、ご利用ください。

>Sheets("sheet1").Range("c16") = TextBox1
変数を経由するのが基本だと思います。

'-------------
'UserForm Module
Dim myLbl As Variant
'本来なら入れるべきOption Base 1は入れていません。

Private Sub UserForm_Initialize()
  Dim myCmdBtns As New Collection  
  Dim i As Integer
  For i = 0 To 11
  With myCmdBtns
     .Add Item:=Me.Controls("CommandButton" & i)
  End With
  Next i
  For i = 1 To 12
   Set myClass1(i) = New Class1
   With myClass1(i)
    .Cmd = myCmdBtns(i)
    .Index = i - 1
   End With
  Next i
  Set myClass1(13) = New Class1
  myClass1(13).Lbl = Me.Label1
End Sub
'標準モジュール
Public myClass1(13) As Class1
Public num2 As Variant
Sub ボタン1_Click()
UserForm1.Show False
End Sub

'Class1 Module
Option Explicit
Private WithEvents myCmd As MSForms.CommandButton
Private WithEvents myLbl As MSForms.Label
Private m_intIndex As Integer
'Private Declare Function GetKeyboardState Lib "user32.dll" (lpKeyState As Any) As Long
'Private bytKeyState(255) As Byte
Private Sub Class_Initialize()
 num2 = 0
End Sub

Public Property Get Cmd() As MSForms.CommandButton
  Set Cmd = myCmd
End Property
Public Property Get Lbl() As MSForms.Label
  Set Lbl = myLbl
End Property
Public Property Let Cmd(ByVal cmdNewValue As MSForms.CommandButton)
  Set myCmd = cmdNewValue
End Property
Public Property Let Lbl(ByVal lblNewValue As MSForms.Label)
  Set myLbl = lblNewValue
End Property

Public Property Get Index() As Integer
  Index = m_intIndex
End Property
Public Property Let Index(ByVal intNewValue As Integer)
  m_intIndex = intNewValue
End Property
'-----
Private Sub myCmd_Click()
Dim num As Variant
If myLbl Is Nothing Then
 Set myLbl = UserForm1.Label1
End If
If myLbl.Caption = "" Then myLbl.Caption = "0"
 num = CDbl(myLbl.Caption)
If m_intIndex = 0 And myLbl.Caption = "0" Then
 myLbl.Caption = "0"
ElseIf m_intIndex < 10 Then
 'Tenkeys 0-9
 myLbl.Caption = Format$(CDbl(myLbl.Caption) & m_intIndex, "#,##0")
ElseIf m_intIndex = 10 Then
 myLbl.Caption = Format$(CDbl(myLbl.Caption) * -1, "#,##0")
  ElseIf m_intIndex = 11 Then
 'EnterKey
  ActiveCell.Value = CDbl(myLbl.Caption)
  myLbl.Caption = "0"
  ElseIf m_intIndex = 12 Then
 'ClearKey
  myLbl.Caption = "0"
 End If
End Sub

Private Sub myCmd_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 Dim num As Variant
 If myLbl Is Nothing Then Set myLbl = UserForm1.Label1
  Select Case KeyCode.Value
  Case 95 To 105
   num = KeyCode.Value - 96
   If num2 = "" Then num2 = 0
   myLbl.Caption = Format$(CDbl(num2) & num, "#,##0")
    ' If GetKeyboardState(bytKeyState(0)) > 0 Then
    If myLbl.Caption = "" Then
     num2 = ""
   Else
    num2 = myLbl.Caption
   End If
     ' End If
 Case 8
  If Len(myLbl.Caption) = 1 Then myLbl.Caption = "0": Exit Sub
   myLbl.Caption = Format(CDbl(Mid(num2, 1, Len(num2) - 1)), "#,##0")
   num2 = CDbl(myLbl.Caption)
 Case 13
  'EnterKey
   ActiveCell.Value = CDbl(num2)
    myLbl.Caption = "0"
 Case 38
  'BackSpace
   num2 = myLbl.Caption
   On Error Resume Next
   ActiveCell.Offset(-1, 0).Select
   On Error GoTo 0
    myLbl.Caption = num2
   Case 40
    num2 = myLbl.Caption
   On Error Resume Next
    ActiveCell.Offset(1, 0).Select
   On Error GoTo 0
    myLbl.Caption = num2
   Case 67, 99
    'clear button
   myLbl.Caption = "0"
    num2 = 0
   Case 109
 'BackSpace
   myLbl.Caption = Format$(CDbl(myLbl.Caption) * -1, "#,##0")
  End Select
End Sub
「エクセルの画面にユーザーフォームでテンキ」の回答画像3
    • good
    • 0
この回答へのお礼

詳しい説明ありがとうございます。バックスペースの使い方、参考になりました。今回はありがとうございます。

お礼日時:2016/06/29 22:30

こちらはAccessでの例ですがExcelでも同じようにできると思います。


http://hatenachips.blog34.fc2.com/blog-entry-7.h …
    • good
    • 1
この回答へのお礼

ご解答頂きありがとうございます。いろいろ参考になりました。

電卓の場合、「Ent」キーはテキストボックスの中の数値を計算することですが、
今回の場合、「Ent」キーは特定のセルにテキストボックスの文字列を流し込むということなのですね。
自分のやりたい事がなにかわかりました。

ご解答、ありがとうございました。。

質問はもう少しの間あけておきますので、何かありましたら、またお願いします。

お礼日時:2016/06/28 23:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A