Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3781 / 13645 ツリー ←次へ | 前へ→

【60174】数字キーだけで,セルに数値を入力 いちご 09/2/1(日) 20:57 質問[未読]
【60175】Re:数字キーだけで,セルに数値を入力 kanabun 09/2/2(月) 0:13 発言[未読]
【60185】Re:数字キーだけで,セルに数値を入力 いちご 09/2/2(月) 20:30 お礼[未読]
【60186】Re:数字キーだけで,セルに数値を入力 kanabun 09/2/2(月) 20:42 発言[未読]
【60187】Re:数字キーだけで,セルに数値を入力 いちご 09/2/3(火) 4:18 お礼[未読]
【60188】Re:数字キーだけで,セルに数値を入力 kanabun 09/2/3(火) 10:02 発言[未読]
【60197】Re:数字キーだけで,セルに数値を入力 いちご 09/2/3(火) 20:44 質問[未読]
【60199】Re:数字キーだけで,セルに数値を入力 kanabun 09/2/4(水) 0:40 発言[未読]
【60217】Re:数字キーだけで,セルに数値を入力 いちご 09/2/4(水) 21:20 お礼[未読]
【60218】Re:数字キーだけで,セルに数値を入力 kanabun 09/2/4(水) 21:46 発言[未読]
【60246】Re:数字キーだけで,セルに数値を入力 いちご 09/2/5(木) 20:04 お礼[未読]

【60174】数字キーだけで,セルに数値を入力
質問  いちご  - 09/2/1(日) 20:57 -

引用なし
パスワード
   十分に過去のログを見ないで,質問して申し訳ありません。
今,アンケートの集計作業をしたいと思っています。
入力は1〜5までの5つの数字です。
オプションボタンを使って入力する方法もあるでしょうが,
数字キーで使って,セルに数値を入力したいと思っています。
このとき,数字キー後にEnterキーするのが普通なのですが,
Enterキーを押さずに,入力できればと思っています。
入力後,セルを下に移動して,次の値を入れられるようになると,
入力にかかる時間が短縮できるのでなないかと思っています。
また,文字入力をしなければならない項目もあるので,
入力モードが切り替えられるといいと思っています。
こしたことは,無理なのでしょうか?
ご存じの方,よろしくお願いします。

【60175】Re:数字キーだけで,セルに数値を入力
発言  kanabun  - 09/2/2(月) 0:13 -

引用なし
パスワード
   ▼いちご さん:
こんばんは。

> 数字キーで使って,セルに数値を入力したいと思っています。
> このとき,数字キー後にEnterキーするのが普通なのですが,
> Enterキーを押さずに,入力できればと思っています。
> 入力後,セルを下に移動して,次の値を入れられるようになると,
> 入力にかかる時間が短縮できるのでなないかと思っています。
> また,文字入力をしなければならない項目もあるので,
> 入力モードが切り替えられるといいと思っています。
> こしたことは,無理なのでしょうか?

いい案が出るまでのつなぎですが、よろしければこんな方法
試してみてください。

対象シートに コントロールツールボックス から
TextBoxをひとつシートに貼り付け、高さをだいたいセルと同じ高さに、
また 横幅を高さと同じくらいにします。
(TextBoxのBackColor は 黄色とか 目立つ色の方がいいかもしれません)

そのTextBoxを右クリックするとメニューが出てきます。
メニューの「コードの表示」を選ぶと、
Private Sub TextBox1_Change()

End Sub
というプロシージャが作られますから、このなかに以下のコードを
コピーして、
--------------
Option Explicit '変数の宣言を強制する (この宣言は自動で入らなければ
VBEメニューの[ツール]-[オプション]-[編集]で、入るようにチェックを
いれておいてください。)

Private Sub TextBox1_Change()
 Dim i As Long
 
 With TextBox1
   If Len(.Text) = 0 Then Exit Sub
   i = Val(.Text)
   Select Case i
    Case 1 To 5
      With ActiveCell
        .Value = i
        .Offset(1).Select
      End With
   End Select
   .Text = ""
   .Activate
 End With
End Sub

また、コードウィンドウの左上のドロップダウンから
Worksheet
を選ぶと、↓のプロシージャが出来ますから、
そこに下のコードをコピペしてみてください。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 With TextBox1
   .Left = Target.Left
   .Top = Target.Top
 End With
End Sub

-----------
以上2つのシートプロシージャが書き終わったら、
VBEメニューの「デバッグ」-「VBAプロジェクトのコンパイル」で
構文チェックをしてください。エラーがでたら、修正します。

無事コンパイルが終わったら、シートに戻って(デザインモードを
終了し)最初の入力セルを選択してください。
このとき、TextBoxがそのセルの左側に移動するはずです。
最初だけは、TextBoxをマウスでActiveにしてから、
数字の 1〜5 を入力してください。
数字1文字を入れるとその数字がセルに転記され、ActiveCellが
1つ下に移動すれば成功です。

> また,文字入力をしなければならない項目もあるので
そのときは、セルのほうへ直接入力してください。

ま、一案ということで。
では(^^

【60185】Re:数字キーだけで,セルに数値を入力
お礼  いちご  - 09/2/2(月) 20:30 -

引用なし
パスワード
   kanabun さん
 早速 質問に答えていただきましてありがとうございます。

 ワークシート上でクリックすると,選択されたセルがアクティブになり,
そこにテキストボックスが現れました。さらに,そのテキストボックスを
クリックすると,数字だけで入力ができるようになりました。
 とてもすてきな方法だと思いました。感謝です。

 ここで,もう一つお聞きしたのですが,マクロで,入力するセルを選択
することはできるですが,そこの場所で,テキストボックスをアクティブ
にして,入力待ちの状態にするには,どうしたらよいのでしょうか?
質問ばかりで申し訳ありませんが,よろしくお願いします。

【60186】Re:数字キーだけで,セルに数値を入力
発言  kanabun  - 09/2/2(月) 20:42 -

引用なし
パスワード
   ▼いちご さん:
> とてもすてきな方法だと思いました。感謝です。

「すてき」と言われると、ちょっとくすぐったいです(^^

> ここで,もう一つお聞きしたのですが,マクロで,入力するセルを選択
> することはできるですが,そこの場所で,テキストボックスをアクティブ
> にして,入力待ちの状態にするには,どうしたらよいのでしょうか?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 With TextBox1
   .Left = Target.Left
   .Top = Target.Top
   .Activate     ' 追加
 End With
End Sub

で、どうでしょう?

【60187】Re:数字キーだけで,セルに数値を入力
お礼  いちご  - 09/2/3(火) 4:18 -

引用なし
パスワード
   ▼kanabun さん すごいです。
.Activate を追加しただけで,テキストボックスをアクティブに
して,入力待ちの状態にすることができました。
ありがとうございます。

 ここで,また,新しい課題ができてしまいました。
ファイルを開いたと時に,セルを指定してすぐに入力待ちにして,
1〜5の数字を順に入力していくことはできたのですが,2番目の
質問項目に移すのにどうしてよいかわかりません。
 もちろん,マウスで,新しく入力するセルをクリックすればよい
のですが,マクロでしたいと思っています。
 また,テキストボックスをアクティブにして,入力待ちの状態を
解除する方法は,ないものでしょうか。Escキーを押すことで,セル
がアクティブになり,文字列を入力することはできるのですが,入
力後,すぐに,テキストボックスが,アクティブになるので,文字
列を入力しようとするたびに,Escキーを押さなければなりません。
 セルがアクティブになっているモードとテキストボックスがアク
ティブになっているモードが,切り替えられると,ありがたいと思
っています。よろしくお願いします。

【60188】Re:数字キーだけで,セルに数値を入力
発言  kanabun  - 09/2/3(火) 10:02 -

引用なし
パスワード
   ▼いちご さん:
おはようございます。朝が早いんですね(^^

> ここで,また,新しい課題ができてしまいました。
>ファイルを開いたと時に,セルを指定してすぐに入力待ちにして,
>1〜5の数字を順に入力していくことはできたのですが,2番目の
>質問項目に移すのにどうしてよいかわかりません。
> もちろん,マウスで,新しく入力するセルをクリックすればよい
>のですが,マクロでしたいと思っています。

> また,テキストボックスをアクティブにして,入力待ちの状態を
>解除する方法は,ないものでしょうか。Escキーを押すことで,セル
>がアクティブになり,文字列を入力することはできるのですが,入
>力後,すぐに,テキストボックスが,アクティブになるので,文字
>列を入力しようとするたびに,Escキーを押さなければなりません。
> セルがアクティブになっているモードとテキストボックスがアク
>ティブになっているモードが,切り替えられると,ありがたいと思
>っています。よろしくお願いします。

とりあえず、後半のご質問の件ですが、
従来のコードを以下のようにしてみてください。
モジュール内でどのプロシージャからも参照できる変数 BoxMode を
追加し、これを「TextBox入力モード」のとき ON、セル入力モードのとき
OFF とするようにします。
どこで切り替えるかというと、TextBoxにFocusが当たったときとFocusを
失ったとき(TextBoxで[ESC]を押したときとか、セルをマウスで選択したとき
このイベントが発生します)とします。
また、選択セルが移動したとき、これまでは無条件に TextBoxをActivate
していましたが、これも、「Box入力モードがONのとき」だけと条件をつけます。

'------------------------------------ シートモジュール
Option Explicit

Private BoxMode As Boolean     '★追加

Private Sub TextBox1_Change()
 Dim i As Long
 
 With TextBox1
   If Len(.Text) = 0 Then Exit Sub
   i = Val(.Text)
   Select Case i
    Case 1 To 5
      With ActiveCell
        .Value = i
        .Offset(1).Select
      End With
    Case Else
      Beep           '★任意追加
   End Select
   .Text = ""
   .Activate
 End With
End Sub

Private Sub TextBox1_GotFocus()    '★追加
  TextBox1.BackColor = vbYellow
  BoxMode = True
End Sub

Private Sub TextBox1_LostFocus()   '★追加
  TextBox1.BackColor = vbWhite
  BoxMode = False
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 With TextBox1
   .Left = Target.Left
   .Top = Target.Top
   If BoxMode Then .Activate      '★変更
 End With
End Sub

------------------
さて、前半の
セルの移動をマクロから制御したいとか、
セルが移動したとき、セル入力モードの範囲だったら、テキストボックス
からセルにフォーカスを移動するなどの処理は、
やってできないことではないかと思うのですが、
こちらではシートのレイアウトが分からないので無理な相談です。
いちど 数字1文字入力範囲と そうでない入力範囲がどのようになっている
のか(おそらく共通の特徴があると思いますから)整理してみてください。
たぶん、n行目まで1文字(数字)を入力した後は、文字列を入力し、その後
次の列の m行目に移動して、 同じことを繰り返す。。。
などという法則があるのではないかと思います。

【60197】Re:数字キーだけで,セルに数値を入力
質問  いちご  - 09/2/3(火) 20:44 -

引用なし
パスワード
   kanabun さん
 何度も丁寧に質問に答えてくださってありがとうございます。

 セルをマウスで選択したときは,数字入力待ちの状態になり,
Escキーを押すと,文字列を続けて入力できるようになりました。
しかも,テキストボックスが,色分けされたので,わかりやすいです。
このままでも,十分に活用していくことができるようになりました。

 ここまで,できると,さらに欲が出てきました。
マウスでセルをクリックし,さらに,テクストボックス内でクリック
すると,数字入力待ちのなります。ですが,繰り返し,いろいろなセル
をクリックしていくと,テキストボックスの色が交互に白と黄色なります。
もちろん,このとき,テキストボックスの色にかかわらず,数字入力待ち
の状態のなっていまるのですが,できれば,数字入力待ちの時は黄色に
なっていた方がいいのです。

 アンケートの項目は,32項目あり,サンプル数は,240人分ぐらい
なのですが,一人目の最後の項目の回答を入力し終わったら,続けて,
二人目の最初の項目を入力したいのですが,次のような表を例にして,
教えてください。
  
  A     B      C     D      E
1      ○○さん  △△さん  □□さん  ☆☆さん
2 質問1     2      5     2
3 質問2     1      2     2
4 質問3     4      2     3
5 質問4  みかん   りんご   いちご  
6 質問5  ねこ    いぬ    ねこ

よろしくお願いします。

【60199】Re:数字キーだけで,セルに数値を入力
発言  kanabun  - 09/2/4(水) 0:40 -

引用なし
パスワード
   ▼いちご さん:
こんばんは。

>  ここまで,できると,さらに欲が出てきました。
> マウスでセルをクリックし,さらに,テクストボックス内でクリック
> すると,数字入力待ちのなります。ですが,繰り返し,いろいろなセル
> をクリックしていくと,テキストボックスの色が交互に白と黄色なります。
> もちろん,このとき,テキストボックスの色にかかわらず,数字入力待ち
> の状態のなっていまるのですが,できれば,数字入力待ちの時は黄色に
> なっていた方がいいのです。

う〜ん。ちょっと考えるのが億劫になってきました。

それに、今使ってるテキストボックス(ActiveXコントロール)って
ちょっと動作がかったるい(遅い)と思いませんか?
なんだかこのままActiveX方式でやるのは実用的ではないような気が
してきました。
提案しておいて何なんですけど
スミマセン。。

>  アンケートの項目は,32項目あり,サンプル数は,240人分ぐらい
> なのですが,一人目の最後の項目の回答を入力し終わったら,続けて,
> 二人目の最初の項目を入力したいのですが,次のような表を例にして,
> 教えてください。
>   
>   A     B      C     D      E
> 1      ○○さん  △△さん  □□さん  ☆☆さん
> 2 質問1     2      5     2
> 3 質問2     1      2     2
> 4 質問3     4      2     3
> 5 質問4  みかん   りんご   いちご  
> 6 質問5  ねこ    いぬ    ねこ
>
> よろしくお願いします。

ふう。。
ActiveXを使わない方法を一緒に考えてみませんか?
たとえば以下のような方法はどうでしょう。

新規シートを挿入して、そこに元シートのデータだけをコピーして
ください。(シートモジュールのイベントコードはコピーしないため)

  A     B      C     D      E
1      ○○さん  △△さん  □□さん  ☆☆さん
2 質問1 
3 質問2 
4 質問3 
5 質問4 
6 質問5 

32 質問31 
33 質問32 

このシートのイベントコードは以下のようなものとします。
------------------------------------------------------------
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim ss As String
  Dim i As Long, L As Long
  Dim r As Range
  
  If Target.Count > 1 Then Exit Sub
  ss = CStr(Target.Value)
  If IsNumeric(ss) Then
    L = Len(ss)
    ReDim v(1 To L, 0)
    For i = 1 To L
      v(i, 0) = Mid$(ss, i, 1)
    Next
    Application.EnableEvents = False
    Target.Resize(L).Value = v
    Set r = Target.Offset(L)
    If r.Row > Me.UsedRange.Rows.Count Then
      Me.Cells(2, r.Column + 1).Select
    Else
      r.Select
    End If
    Set r = Nothing
    Application.EnableEvents = True
    If Me.ScrollArea = "" Then
      Set r = Me.UsedRange
      Me.ScrollArea = Application. _
        Intersect(r, r.Offset(1, 1)).Address
    End If
  End If
End Sub

Private Sub Worksheet_BeforeDoubleClick( _
     ByVal Target As Range, Cancel As Boolean)
  'Cancel = True
  Me.ScrollArea = ""
End Sub
------------------------------------------------------------
コピーしたら、シートに戻って、
[B2]セル(質問1の行)を選択して、このセルに
  「214」
とタイプしてください。Enter を押すと、
  A     B      C     D      E
1      ○○さん  △△さん  □□さん  ☆☆さん
2 質問1     2 
3 質問2     1 
4 質問3     4 
5 質問4  
6 質問5  

となるはずです。(数字1文字が1つのセルに分割転記されます)
アクティブセルが その列の 質問4 の行に移動しますから、
「みかん」Enter 「ねこ」Enter と入力してください。

  A     B      C     D      E
1      ○○さん  △△さん  □□さん  ☆☆さん
2 質問1     2
3 質問2     1
4 質問3     4
5 質問4  みかん
6 質問5  ねこ 

最後の質問32 を入力し終わると、プログラムは自動的に
右隣の列の 2行目に 移動します。
ただし、入力間違いで、質問28から「52242」と打ち込むところを
間違って「522426」とタイプしたときも警告なしに 34行目に
「6」が入力されてしまいます。
ところが ScrollArea で 34行目には移動できないようになってい
るので、このままでは修正することができません。
そういうときは ScrollAreaをいったん解除します。
↑のサンプルコードでは、いずれかのセルをダブルクリックする
ことにより、すべてのセルが選択可能になるようになっています。

提示のサンプルデータですと、
数字1文字を入力する範囲が質問1〜質問3までの3セルしかない
ので、この方法は却って効率悪いかもしれないけれど、
実際は1文字の数字を連続入力する範囲がもっと多いということを
想定して組んでみたものです。
まるで発想を変えちゃいましたけど、どうもTextBox案は先行き
ゆき詰まりそうな気がしたものですから、あしからず。m(__)m

【60217】Re:数字キーだけで,セルに数値を入力
お礼  いちご  - 09/2/4(水) 21:20 -

引用なし
パスワード
   kanabun さん  面倒なことばかり申し上げて申し上げありません。


>う〜ん。ちょっと考えるのが億劫になってきました。
>
>それに、今使ってるテキストボックス(ActiveXコントロール)って
>ちょっと動作がかったるい(遅い)と思いませんか?
>なんだかこのままActiveX方式でやるのは実用的ではないような気が
>してきました。

とてのすごい方法だと思っていました。入力がなれてくると,遅い感じ
も持つかもしれませんが,サンプル数が限られているので,十分かなと
思っていました。それに,テキストボックスの動きが,なんとなく可愛
いですよね。この方法,これだけでも,ありがたい方法です。

その上,今回は,また新しい方法を提案してくださって,なんだか申し
訳なく,恐縮してしまいます。
 数字の列が,Enterキーの後,一度にスーと入っていくのは,気持ちが
いいです。また,数字列と文字列を自動に判断してくれるのもいいとこ
ろです。自動で,次の列に移動したり,矢印キーが使えるので,使い勝
手もいい感じがします。

>最後の質問32 を入力し終わると、プログラムは自動的に
>右隣の列の 2行目に 移動します。
>ただし、入力間違いで、質問28から「52242」と打ち込むところを
>間違って「522426」とタイプしたときも警告なしに 34行目に
>「6」が入力されてしまいます。
>ところが ScrollArea で 34行目には移動できないようになってい
>るので、このままでは修正することができません。
>そういうときは ScrollAreaをいったん解除します。

なぜか,質問32より下の方まで,進めていかないと,右隣の列の 2行目
にいないことがあるのですが,34行目,35行目…と入力されていくと,
Me.UsedRange.Rows.Count の値が大きくなっていくという理解でいいので
しょうか。
ScrollAreaについて,よくわからないにですが,データの入力が進んでい
って,列が右に進みはじめに表示されている画面より,右に進むと入力し
ているセルが表示されない(スクロールされない)のですが,なんとかな
らないでしょうか。

>提示のサンプルデータですと、
>数字1文字を入力する範囲が質問1〜質問3までの3セルしかない
>ので、この方法は却って効率悪いかもしれないけれど、
>実際は1文字の数字を連続入力する範囲がもっと多いということを
>想定して組んでみたものです。

実際は,ほとんどが数字です,最後の数項目だけが文字列の入力です。
なので,連続入力する部分が多いので,今回の方法でも,Enterキーを
回数は,ずっと減少し,効率化がはかれます。ありがとうございます。

【60218】Re:数字キーだけで,セルに数値を入力
発言  kanabun  - 09/2/4(水) 21:46 -

引用なし
パスワード
   ▼いちご さん:
こんばんは。

まずは、数字1文字の入力セルが、
> 実際は,ほとんどが数字です,最後の数項目だけが文字列の入力です。
> なので,連続入力する部分が多いので,今回の方法でも,Enterキーを
> 回数は,ずっと減少し,効率化がはかれます。
ということで、よかったです♪

> なぜか,質問32より下の方まで,進めていかないと,右隣の列の 2行目
> にいないことがあるのですが,34行目,35行目…と入力されていくと,
> Me.UsedRange.Rows.Count の値が大きくなっていくという理解でいいので
> しょうか。
あ、そうですね、
> 34行目,35行目…と入力
すると、UsedRange使用範囲 は更新されて行き、本来の入力範囲で
無くなってしまいますね。これはUsedRangeを使わずに、なんとか
しなければいけないですね。
最大は A列の最終行と 1行目の最終列から 固定としますか?

でも、
> ScrollAreaについて,よくわからないにですが,データの入力が進んでい
> って,列が右に進みはじめに表示されている画面より,右に進むと入力し
> ているセルが表示されない(スクロールされない)のですが,なんとかな
> らないでしょうか。
ということは、1行目の「なまえ」も都度入力されているのでしょうか?
もしそうなら、今のScrollAreaの設定の仕方では ダメ です。
コードを読んでもらうと分かりますが、
今のScrollAreaの設定の仕方は 数値入力があったとき、かつ、
まだ ScrollArea が設定されていないときだけ、UsedRangeのうち
A列と1行目を除く部分を「ScrollArea」= スクロール可能=入力可能範囲
としているからです。つまり、1行目の名前が都度入力されるたびに
ScrollAreaの列方向のスクロール可能範囲が リフレッシュされるわけでは
ありませんので。。
。。。 列方向のScrollArea は 予想される最大の列を指定する
ってことにすればよいのかな〜〜?

【60246】Re:数字キーだけで,セルに数値を入力
お礼  いちご  - 09/2/5(木) 20:04 -

引用なし
パスワード
   ▼kanabun さん:
こんばんは

>1行目の「なまえ」も都度入力されているのでしょうか?
>もしそうなら、今のScrollAreaの設定の仕方では ダメ です。

ご指摘の通りでした。なまえを入れていなかったからでした。
きちんと動きました。
工夫して活用してきたいと思います。
ありがとうございました。

3781 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free