Excel VBA質問箱 IV

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

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


10531 / 13644 ツリー ←次へ | 前へ→

【21236】入力ミスの防止について nori 05/1/17(月) 12:00 質問[未読]
【21237】Re:入力ミスの防止について Jaka 05/1/17(月) 12:29 回答[未読]
【21239】Re:入力ミスの防止について Jaka 05/1/17(月) 12:46 発言[未読]
【21241】Re:入力ミスの防止について Jaka 05/1/17(月) 13:15 回答[未読]
【21245】Re:入力ミスの防止について nori 05/1/17(月) 14:05 質問[未読]
【21248】Re:入力ミスの防止について Jaka 05/1/17(月) 16:49 回答[未読]
【21250】Re:入力ミスの防止について Jaka 05/1/17(月) 17:18 回答[未読]
【21253】Re:入力ミスの防止について nori 05/1/17(月) 17:53 質問[未読]
【21269】Re:入力ミスの防止について Jaka 05/1/18(火) 10:12 回答[未読]
【21277】Re:入力ミスの防止について nori 05/1/18(火) 11:57 お礼[未読]

【21236】入力ミスの防止について
質問  nori E-MAIL  - 05/1/17(月) 12:00 -

引用なし
パスワード
   いつもお世話になります。教えてください。

セルA1〜A5までに

数値1〜4のいずれかを入力させます。

入力作業のときに5以上もしくは0以下を入力した場合

入力ミスの警告とコメントを出したいのですが。

(但し:A1はセルA1〜C1までのセル結合をしています。)

どなたかご教授願います。

【21237】Re:入力ミスの防止について
回答  Jaka  - 05/1/17(月) 12:29 -

引用なし
パスワード
   こんにちは。

標準機能の データ → 入力規制で出来ます。

設定

入力時のデータを
ユーザー設定

数式を
=AND(A2>=1,A2<=4)
  ↑A2セルの場合ですが、入力規制設定後フィルすれば良いです。
   結合セルは、一旦解除しフィル後、元に戻すかA1セルだけ別に作るとか....

入力時メッセージorエラーメッセージのタイトルとメッセージ内容は自分で書いてね。
それと、エラーメッセージタブのスタイルを、停止にしておけば入力できなくなります。

【21239】Re:入力ミスの防止について
発言  Jaka  - 05/1/17(月) 12:46 -

引用なし
パスワード
   よく考えたら、入力規制だとセルのコピペ等に対応できませんね。
また、前回質問した丸文字との関連性はあるのでしょうか?

【21241】Re:入力ミスの防止について
回答  Jaka  - 05/1/17(月) 13:15 -

引用なし
パスワード
   たびたびすみません。
前回の丸文字との関連性が無いものとして、

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
  If Target.Cells(1).Column = 1 And Target.Row <= 5 Then
    If Target.Cells(1).Value >= "1" And Target.Cells(1).Value <= "4" _
     Or Target.Cells(1) = "" Then
     MsgBox "OK"
    Else
     MsgBox "NG"
     Application.EnableEvents = False
     Application.Undo
     Application.EnableEvents = True
    End If
  End If
End Sub

【21245】Re:入力ミスの防止について
質問  nori E-MAIL  - 05/1/17(月) 14:05 -

引用なし
パスワード
   ▼Jaka さん:
>たびたびすみません。
>前回の丸文字との関連性が無いものとして、
>
>Private Sub Worksheet_Change(ByVal Target As Excel.Range)
>  If Target.Cells(1).Column = 1 And Target.Row <= 5 Then
>    If Target.Cells(1).Value >= "1" And Target.Cells(1).Value <= "4" _
>     Or Target.Cells(1) = "" Then
>     MsgBox "OK"
>    Else
>     MsgBox "NG"
>     Application.EnableEvents = False
>     Application.Undo
>     Application.EnableEvents = True
>    End If
>  End If
>End Sub

早速ありがとうございます。
良好に動作します。
もう3つ教えてください。

 1.入力後OKの場合  MsgBox "OK"を出さずに次の入力にいく方法。

 2.入力セルの変更設定の方法ですが
    ご指導の
       If Target.Cells(1).Column = 1 And Target.Row <= 5 Then
    の意味は1列の1〜5行と思いますが
       入力セルが飛び飛びの場合
       A1〜5
       D3〜8
       F5〜6
    などの場合どのように考えたら良いでしょうか。

 3.Private Sub の意味は 
    このシートだけこのマクロが有効と考えてよいのでしょうか?

基礎的なことですいません。再度ご指導お願いいたします。

【21248】Re:入力ミスの防止について
回答  Jaka  - 05/1/17(月) 16:49 -

引用なし
パスワード
   > 1.入力後OKの場合  MsgBox "OK"を出さずに次の入力にいく方法。
   MsgBox "OK" を消すか、頭に'をつけてコメントにすれば良いです。

> 2.入力セルの変更設定の方法ですが
>   ご指導の
>      If Target.Cells(1).Column = 1 And Target.Row <= 5 Then
>   の意味は1列の1〜5行と思いますが
>      入力セルが飛び飛びの場合
>      A1〜5
>      D3〜8
>      F5〜6
>   などの場合どのように考えたら良いでしょうか。
    下記参照。(不具合があるかも)
    出来るなら結合セルはやめた方が良いです。
    マクロとの愛称が悪いので、面倒なコードが必要になってきます。


> 3.Private Sub の意味は
>   このシートだけこのマクロが有効と考えてよいのでしょうか?
    ??厳密には意味は違います。
    書き込んだシートモジュールのイベントですから、書き込んだシートにしか使えません。

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Target.Cells.Count <> 1 Then
  If Target.MergeCells = False Then
   Exit Sub
  End If
End If
If Target.Cells(1).Column = 1 And Target.Row <= 5 Or _
  Target.Cells(1).Column = 4 And Target.Row >= 3 And Target.Row <= 8 Or _
  Target.Cells(1).Column = 6 And Target.Row >= 5 And Target.Row <= 6 Then
  If Target.Cells(1).Value >= "1" And Target.Cells(1).Value <= "4" _
   Or Target.Cells(1) = "" Then
   'MsgBox "OK"
  Else
   MsgBox "NG"
   Application.EnableEvents = False
   Application.Undo
   Application.EnableEvents = True
  End If
End If
End Sub

【21250】Re:入力ミスの防止について
回答  Jaka  - 05/1/17(月) 17:18 -

引用なし
パスワード
   すみません。
修正してください。

>If Target.Cells(1).Column = 1 And Target.Row <= 5 Or _
>  Target.Cells(1).Column = 4 And Target.Row >= 3 And Target.Row <= 8 Or _
>  Target.Cells(1).Column = 6 And Target.Row >= 5 And Target.Row <= 6 Then
>  If Target.Cells(1).Value >= "1" And Target.Cells(1).Value <= "4" _
>   Or Target.Cells(1) = "" Then
>   'MsgBox "OK"
>  Else
>   MsgBox "NG"
>   Application.EnableEvents = False
>   Application.Undo
>   Application.EnableEvents = True
>  End If
>End If
  ↓
If (Target.Cells(1).Column = 1 And Target.Row <= 5) Or _
  (Target.Cells(1).Column = 4 And Target.Row >= 3 And Target.Row <= 8) Or _
  (Target.Cells(1).Column = 6 And Target.Row >= 5 And Target.Row <= 6) Then
  If Val(Target.Cells(1).Value) >= 1 And Val(Target.Cells(1).Value) <= 4 Or _
   Target.Cells(1).Value = "" Then
   'MsgBox "OK"
  Else
   MsgBox "NG"
   Application.EnableEvents = False
   Application.Undo
   Application.EnableEvents = True
  End If
End If

【21253】Re:入力ミスの防止について
質問  nori E-MAIL  - 05/1/17(月) 17:53 -

引用なし
パスワード
   ▼Jaka さん:
>> 1.入力後OKの場合  MsgBox "OK"を出さずに次の入力にいく方法。
>   MsgBox "OK" を消すか、頭に'をつけてコメントにすれば良いです。
>
>> 2.入力セルの変更設定の方法ですが
>>   ご指導の
>>      If Target.Cells(1).Column = 1 And Target.Row <= 5 Then
>>   の意味は1列の1〜5行と思いますが
>>      入力セルが飛び飛びの場合
>>      A1〜5
>>      D3〜8
>>      F5〜6
>>   などの場合どのように考えたら良いでしょうか。
>    下記参照。(不具合があるかも)
>    出来るなら結合セルはやめた方が良いです。
>    マクロとの愛称が悪いので、面倒なコードが必要になってきます。
>
>
>> 3.Private Sub の意味は
>>   このシートだけこのマクロが有効と考えてよいのでしょうか?
>    ??厳密には意味は違います。
>    書き込んだシートモジュールのイベントですから、書き込んだシートにしか使えません。
>
>Private Sub Worksheet_Change(ByVal Target As Excel.Range)
>If Target.Cells.Count <> 1 Then
>  If Target.MergeCells = False Then
>   Exit Sub
>  End If
>End If
>If Target.Cells(1).Column = 1 And Target.Row <= 5 Or _
>  Target.Cells(1).Column = 4 And Target.Row >= 3 And Target.Row <= 8 Or _
>  Target.Cells(1).Column = 6 And Target.Row >= 5 And Target.Row <= 6 Then
>  If Target.Cells(1).Value >= "1" And Target.Cells(1).Value <= "4" _
>   Or Target.Cells(1) = "" Then
>   'MsgBox "OK"
>  Else
>   MsgBox "NG"
>   Application.EnableEvents = False
>   Application.Undo
>   Application.EnableEvents = True
>  End If
>End If
>End Sub

ありがとうございました。
全てうまくいきました。
1日かけてご指導ありがとうございました。

もうひとつ聞かせてください。

If Target.Cells.Count <> 1 Then
  If Target.MergeCells = False Then
   Exit Sub
  End If
End If
の意味がよくわかりません。
なぜ必要なのでしょうか?

【21269】Re:入力ミスの防止について
回答  Jaka  - 05/1/18(火) 10:12 -

引用なし
パスワード
   >If Target.Cells.Count <> 1 Then
>  If Target.MergeCells = False Then
>   Exit Sub
>  End If
>End If
>の意味がよくわかりません。
>なぜ必要なのでしょうか?
必要なのでしょうか?ってA1:A3までセル結合してあるって事ですから...。
新規シートに下記コードを書いて、

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
  MsgBox Target.Value
End Sub

結合セルに何か入力してください。
エラーになります。

また、セルを複数選択して同時入力させて見てください。
エラーになります。

※同時入力
例えば、複数のセルを選択後に「1」入力後、Ctrl + Ent で同時入力できます。

それで、結合セルは、複数セル選択と同じ扱いになるみたいでしたので、複数セルの同時入力は全て拒否するけど結合セルは、判定させるようにしました。

厳密に言うと、もっと単純でよかったのかもしれませんが、後で操作性の悪さに気づいて、これこれこうしたいですと、細かく追加されるのも嫌なので、独断でこれぐらいはあった方が良いかも程度に追加しました。

操作方法の詳細が解りませんけど、更に細かい使い方に対応させようとすると、もっとコードが更に複雑になります。

因みに複数同時入力が出来ないように作ってはありますが、複数のセルを選択したとき入力セルが左、もしくは上にないと反応しません。
結合セルが入力セルであるためにこうなってしまったんですが....。

チビッと修正?版

Private Sub Worksheet_Change(ByVal Target As Range)
  'MsgBox Target.Areas.Count
  If Target.Column = 1 And Target.Row <= 5 Or _
    Target.Column = 4 And Target.Row >= 3 And Target.Row <= 8 Or _
    Target.Column = 6 And Target.Row >= 5 And Target.Row <= 6 Then
    If Not (Target.Count > 1 And Target.MergeCells = False Or Target.Areas.Count > 1) Then
     If Val(Target.Cells(1).Value) >= 1 And Val(Target.Cells(1).Value) <= 4 Or _
      Target.Cells(1).Value = "" Then
      Exit Sub
     End If
    End If
    MsgBox "NG"
    Application.EnableEvents = False
    Application.Undo
    Application.EnableEvents = True
  End If
End Sub

【21277】Re:入力ミスの防止について
お礼  nori E-MAIL  - 05/1/18(火) 11:57 -

引用なし
パスワード
   ▼Jaka さん:
>>If Target.Cells.Count <> 1 Then
>>  If Target.MergeCells = False Then
>>   Exit Sub
>>  End If
>>End If
>>の意味がよくわかりません。
>>なぜ必要なのでしょうか?
>必要なのでしょうか?ってA1:A3までセル結合してあるって事ですから...。
>新規シートに下記コードを書いて、
>
>Private Sub Worksheet_Change(ByVal Target As Excel.Range)
>  MsgBox Target.Value
>End Sub
>
>結合セルに何か入力してください。
>エラーになります。
>
>また、セルを複数選択して同時入力させて見てください。
>エラーになります。
>
>※同時入力
>例えば、複数のセルを選択後に「1」入力後、Ctrl + Ent で同時入力できます。
>
>それで、結合セルは、複数セル選択と同じ扱いになるみたいでしたので、複数セルの同時入力は全て拒否するけど結合セルは、判定させるようにしました。
>
>厳密に言うと、もっと単純でよかったのかもしれませんが、後で操作性の悪さに気づいて、これこれこうしたいですと、細かく追加されるのも嫌なので、独断でこれぐらいはあった方が良いかも程度に追加しました。
>
>操作方法の詳細が解りませんけど、更に細かい使い方に対応させようとすると、もっとコードが更に複雑になります。
>
>因みに複数同時入力が出来ないように作ってはありますが、複数のセルを選択したとき入力セルが左、もしくは上にないと反応しません。
>結合セルが入力セルであるためにこうなってしまったんですが....。
>
>チビッと修正?版
>
>Private Sub Worksheet_Change(ByVal Target As Range)
>  'MsgBox Target.Areas.Count
>  If Target.Column = 1 And Target.Row <= 5 Or _
>    Target.Column = 4 And Target.Row >= 3 And Target.Row <= 8 Or _
>    Target.Column = 6 And Target.Row >= 5 And Target.Row <= 6 Then
>    If Not (Target.Count > 1 And Target.MergeCells = False Or Target.Areas.Count > 1) Then
>     If Val(Target.Cells(1).Value) >= 1 And Val(Target.Cells(1).Value) <= 4 Or _
>      Target.Cells(1).Value = "" Then
>      Exit Sub
>     End If
>    End If
>    MsgBox "NG"
>    Application.EnableEvents = False
>    Application.Undo
>    Application.EnableEvents = True
>  End If
>End Sub

なるほどです。!!
ご親切に指導していただきありがとうございました。

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