Excel VBA質問箱 IV

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

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


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

【46559】[46222]の追加質問 セルの入力方法 さや 07/2/6(火) 20:27 質問[未読]
【46560】Re:[46222]の追加質問 セルの入力方法 かみちゃん 07/2/6(火) 20:40 発言[未読]
【46562】Re:[46222]の追加質問 セルの入力方法 さや 07/2/6(火) 21:02 質問[未読]
【46563】Re:[46222]の追加質問 セルの入力方法 かみちゃん 07/2/6(火) 21:09 発言[未読]
【46568】Re:[46222]の追加質問 セルの入力方法 さや 07/2/6(火) 21:28 質問[未読]
【46569】Re:[46222]の追加質問 セルの入力方法 かみちゃん 07/2/6(火) 21:58 発言[未読]
【46570】Re:[46222]の追加質問 セルの入力方法 さや 07/2/6(火) 22:25 質問[未読]
【46571】Re:[46222]の追加質問 セルの入力方法 かみちゃん 07/2/6(火) 22:45 発言[未読]
【46573】Re:[46222]の追加質問 セルの入力方法 さや 07/2/6(火) 23:13 発言[未読]
【46572】Re:[46222]の追加質問 セルの入力方法 ichinose 07/2/6(火) 23:09 発言[未読]
【46575】Re:[46222]の追加質問 セルの入力方法 さや 07/2/6(火) 23:55 お礼[未読]

【46559】[46222]の追加質問 セルの入力方法
質問  さや  - 07/2/6(火) 20:27 -

引用なし
パスワード
   [46222]での質問では、下記の回答を ichinoseさんより頂きました。大変、お世話になりました。
今回は、下記のような追加コードを希望しています。

[46222]の内容
次のようなプログラムを希望しています。

1. A列に数値が入力されています。数値は昇順で、連番です。 (ダブりはありません)
2. A列に対応して、C列に日付が入力されます。これも昇順ですが、ダブりがあります。
 例えば、2007/1/1がC1からC10に同じく入力、2007/1/27がC50からC54に入力され  ています。
3. A列を、下記の条件でsheet2のV列のセルV6を先頭とするセルにコピーしたい。

 条件・・C列に入力される最新の日付(1番新しい日付)に対応している、A列       のセルだけをコピーする。
  2. の例だとA50からA54だけをコピーする。
 
Sub main()
 Dim rw2 As Long
 Dim rw1 As Long
 Dim newdate As Date
  With Worksheets("sheet1")
    rw2 = .Cells(.Rows.Count, "c").End(xlUp).Row
    newdate = .Range("c" & rw2).Value
    For rw1 = rw2 - 1 To 1 Step -1
     If .Range("c" & rw1).Value <> newdate Then Exit For
     Next rw1
    .Range(.Cells(rw1 + 1, 1), .Cells(rw2, 1)).Copy
   Worksheets("sheet2").Range("v6").PasteSpecial xlValue
    Application.CutCopyMode = False
    End With
End Sub

[追加質問]
毎日、C列の日付とともにD列に3桁の数値を入力します。
その数値とは165 〜975の数値で、すべて存在する訳ではなく、抜けている数値もあります。(たとえば、167、193などは抜けています)
D列の入力方法はC列のように昇順ではなく、ランダム的な入力方法です。

しかし、下記のような入力方法のルールがあります。
*「同じ日付(C列)に対応する同じ数値(D列)は、続けて入力しなければいけ  ない」
 下記の例だと、D10の177が入力ミスです。

[追加コード]
下記のD10の177のように、このルールに反してD列に入力した場合、「入力ミス」と表示したいのです。
      A    B     C      D列
 1    1        2007/1/31    176
 2    2        2007/1/31    187
 3    3         2007/1/31    177
 4    4         2007/2/1     176
 5    5         2007/2/2     188
 6    6         2007/2/3     177
 7    7        2007/2/3     177
 8    8        2007/2/3     975
 9    9         2007/2/3     170
10    10        2007/2/3     177 ← 入力ミス

If then End If と MsgBox “入力ミス”と ループ処理を使う事はわかるのですが、・・・
ご教授よろしくお願いします。

【46560】Re:[46222]の追加質問 セルの入力方法
発言  かみちゃん  - 07/2/6(火) 20:40 -

引用なし
パスワード
   こんにちは。かみちゃん です。

何度読み返してもわからないので教えてください。

>しかし、下記のような入力方法のルールがあります。
>*「同じ日付(C列)に対応する同じ数値(D列)は、続けて入力しなければいけ  ない」
> 下記の例だと、D10の177が入力ミスです。
>
>[追加コード]
>下記のD10の177のように、このルールに反してD列に入力した場合、「入力ミス」と表示したいのです。
>      A    B     C      D列
> 1    1        2007/1/31    176
> 2    2        2007/1/31    187
> 3    3         2007/1/31    177
> 4    4         2007/2/1     176
> 5    5         2007/2/2     188
> 6    6         2007/2/3     177
> 7    7        2007/2/3     177
> 8    8        2007/2/3     975
> 9    9         2007/2/3     170
>10    10        2007/2/3     177 ← 入力ミス

上記の表でなぜ、D10セルの177が入力ミスなのですか?
「同じ日付(C列)に対応する同じ数値(D列)」とは何ですか?
「続けて入力」とはどういう入力方法ですか?
D7とD8は同じ日付けなのに数値は「続いている」のですか?
もしかして、入力順のことを言っていますか?

【46562】Re:[46222]の追加質問 セルの入力方法
質問  さや  - 07/2/6(火) 21:02 -

引用なし
パスワード
   かみちゃん さん
こんばんは。

説明が不十分ですみませんでした。
>>      A    B     C      D列
>> 1    1        2007/1/31    176
>> 2    2        2007/1/31    187
>> 3    3         2007/1/31    177
>> 4    4         2007/2/1     176
>> 5    5         2007/2/2     188
>> 6    6         2007/2/3     177
>> 7    7        2007/2/3     177
>> 8    8        2007/2/3     975
>> 9    9         2007/2/3     170
>>10    10        2007/2/3     177 ← 入力ミス
>
>上記の表でなぜ、D10セルの177が入力ミスなのですか?
>「同じ日付(C列)に対応する同じ数値(D列)」とは何ですか?
>「続けて入力」とはどういう入力方法ですか?
>D7とD8は同じ日付けなのに数値は「続いている」のですか?

上記の例ですと、177が3つ続けて入力されていればいいのです。
それは、「D6、D7、D8」でも「D7、D8、D9」でも「D8、D9、
D10」でも構いません。
同じ日付の範囲で(C列)、上記のD10のように同じ番号が離れてはいけないのです。

>もしかして、入力順のことを言っていますか?
はい、そうです。

よろしくお願いします。

【46563】Re:[46222]の追加質問 セルの入力方法
発言  かみちゃん  - 07/2/6(火) 21:09 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>>      A    B     C      D列
>>> 1    1        2007/1/31    176
>>> 2    2        2007/1/31    187
>>> 3    3         2007/1/31    177
>>> 4    4         2007/2/1     176
>>> 5    5         2007/2/2     188
>>> 6    6         2007/2/3     177
>>> 7    7        2007/2/3     177
>>> 8    8        2007/2/3     975
>>> 9    9         2007/2/3     170
>>>10    10        2007/2/3     177 ← 入力ミス
>>
>>上記の表でなぜ、D10セルの177が入力ミスなのですか?
>>「同じ日付(C列)に対応する同じ数値(D列)」とは何ですか?
>>「続けて入力」とはどういう入力方法ですか?
>>D7とD8は同じ日付けなのに数値は「続いている」のですか?
>
>上記の例ですと、177が3つ続けて入力されていればいいのです。
>それは、「D6、D7、D8」でも「D7、D8、D9」でも「D8、D9、
>D10」でも構いません。
>同じ日付の範囲で(C列)、上記のD10のように同じ番号が離れてはいけないのです。

D10のセルのひとつ上のD9セルは、177でない場合に、その日付けで177があれば
「入力ミス」ということですか?
3つ続けて入力されていなかったらどうするのですか?
D8のセルは、3つ続けて入力されていないから、入力ミスなのでは?

>>もしかして、入力順のことを言っていますか?
>はい、そうです。

D列のセルは、1行目から2行目、3行目と順番に入力されるということでいいですか?
ランダムに入力するのですか?

【46568】Re:[46222]の追加質問 セルの入力方法
質問  さや  - 07/2/6(火) 21:28 -

引用なし
パスワード
   かみちゃん さん
こんばんは
>
>>>>      A    B     C      D列
>>>> 1    1        2007/1/31    176
>>>> 2    2        2007/1/31    187
>>>> 3    3         2007/1/31    177
>>>> 4    4         2007/2/1     176
>>>> 5    5         2007/2/2     188
>>>> 6    6         2007/2/3     177
>>>> 7    7        2007/2/3     177
>>>> 8    8        2007/2/3     975
>>>> 9    9         2007/2/3     170
>>>>10    10        2007/2/3     177 ← 入力ミス


>D10のセルのひとつ上のD9セルは、177でない場合に、その日付けで177があれば
>「入力ミス」ということですか?

すみません、質問の意図がよくわかりません。

>3つ続けて入力されていなかったらどうするのですか?
>D8のセルは、3つ続けて入力されていないから、入力ミスなのでは?
D8のように1つしかない数値の場合は、どこのセルでも構いません。
同じ数値が2つ以上ある場合は、離れてはダメという事です。

>D列のセルは、1行目から2行目、3行目と順番に入力されるということでいいですか?
はい、その通りです。

わかりづらい例ですみませんが、よろしくお願いします。

【46569】Re:[46222]の追加質問 セルの入力方法
発言  かみちゃん  - 07/2/6(火) 21:58 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>>>>      A    B     C      D列
>>>>> 1    1        2007/1/31    176
>>>>> 2    2        2007/1/31    187
>>>>> 3    3         2007/1/31    177
>>>>> 4    4         2007/2/1     176
>>>>> 5    5         2007/2/2     188
>>>>> 6    6         2007/2/3     177
>>>>> 7    7        2007/2/3     177
>>>>> 8    8        2007/2/3     975
>>>>> 9    9         2007/2/3     170
>>>>>10    10        2007/2/3     177 ← 入力ミス
>
>
>>D10のセルのひとつ上のD9セルは、177でない場合に、その日付けで177があれば
>>「入力ミス」ということですか?
>
>すみません、質問の意図がよくわかりません。

・C10セルとC9セルが同じ日付
・D10セルとD9セルの値が異なる
この2条件で「続けて入力されていない」と判断されますよね?
では、C10セルと同じ日付つまり、C6〜C10に対応するD列、D6〜D10にD10と同じ
値がないか、同じ値がなければ「初めて入力する値」となるわけですよね?
一方、D6、D7のように同じ値があれば、「続けて入力されていない」から「入力ミス」
という判断をするのではないでしょうか?

【46570】Re:[46222]の追加質問 セルの入力方法
質問  さや  - 07/2/6(火) 22:25 -

引用なし
パスワード
   かみちゃん さん
こんばんは。
>
>>>>>>      A    B     C      D列
>>>>>> 1    1        2007/1/31    176
>>>>>> 2    2        2007/1/31    187
>>>>>> 3    3         2007/1/31    177
>>>>>> 4    4         2007/2/1     176
>>>>>> 5    5         2007/2/2     188
>>>>>> 6    6         2007/2/3     177
>>>>>> 7    7        2007/2/3     177
>>>>>> 8    8        2007/2/3     975
>>>>>> 9    9         2007/2/3     170
>>>>>>10    10        2007/2/3     177 ← 入力ミス
>
>・C10セルとC9セルが同じ日付
>・D10セルとD9セルの値が異なる
>この2条件で「続けて入力されていない」と判断されますよね?
>では、C10セルと同じ日付つまり、C6〜C10に対応するD列、D6〜D10にD10と同じ
>値がないか、同じ値がなければ「初めて入力する値」となるわけですよね?
>一方、D6、D7のように同じ値があれば、「続けて入力されていない」から「入力ミス」
>という判断をするのではないでしょうか?

はい。その通りです。
頭が混乱してきました。
上記の事は、2つの連続するセルの値が「同じ」でも「異なる」でもダメ、という事を意味しているのでしょうか?

【46571】Re:[46222]の追加質問 セルの入力方法
発言  かみちゃん  - 07/2/6(火) 22:45 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>>>>>>      A    B     C      D列
>>>>>>> 1    1        2007/1/31    176
>>>>>>> 2    2        2007/1/31    187
>>>>>>> 3    3         2007/1/31    177
>>>>>>> 4    4         2007/2/1     176
>>>>>>> 5    5         2007/2/2     188
>>>>>>> 6    6         2007/2/3     177
>>>>>>> 7    7        2007/2/3     177
>>>>>>> 8    8        2007/2/3     975
>>>>>>> 9    9         2007/2/3     170
>>>>>>>10    10        2007/2/3     177 ← 入力ミス
>>
>>・C10セルとC9セルが同じ日付
>>・D10セルとD9セルの値が異なる
>>この2条件で「続けて入力されていない」と判断されますよね?
>>では、C10セルと同じ日付つまり、C6〜C10に対応するD列、D6〜D10にD10と同じ
>>値がないか、同じ値がなければ「初めて入力する値」となるわけですよね?
>>一方、D6、D7のように同じ値があれば、「続けて入力されていない」から「入力ミス」
>>という判断をするのではないでしょうか?
>
>はい。その通りです。
>頭が混乱してきました。
>上記の事は、2つの連続するセルの値が「同じ」でも「異なる」でもダメ

頭を混乱させてしまい申し訳ありません。
こちらは、さやさん以上に理解できていません。だから、わからない点を聞いています。
「入力ミス」の判断条件をきちんと説明していただけないとコードの提案はできません。

現時点で、頭が混乱されているようですし、私もここで検討を一旦やめたいと思います。
他に理解をされる方がいらっしゃれば、その方のコメントをお待ちいただくほうがいいかも
しれません。
私だけがいつものように勘違いしているだけかもしれませんので・・・

【46572】Re:[46222]の追加質問 セルの入力方法
発言  ichinose  - 07/2/6(火) 23:09 -

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

これは、ちょっと難しいですねえ!!


>毎日、C列の日付とともにD列に3桁の数値を入力します。
>その数値とは165 〜975の数値で、すべて存在する訳ではなく、抜けている数値もあります。(たとえば、167、193などは抜けています)
>D列の入力方法はC列のように昇順ではなく、ランダム的な入力方法です。
>
>しかし、下記のような入力方法のルールがあります。
>*「同じ日付(C列)に対応する同じ数値(D列)は、続けて入力しなければいけ  ない」
> 下記の例だと、D10の177が入力ミスです。
>
>[追加コード]
>下記のD10の177のように、このルールに反してD列に入力した場合、「入力ミス」と表示したいのです。
>      A    B     C      D列
> 1    1        2007/1/31    176
> 2    2        2007/1/31    187
> 3    3         2007/1/31    177
> 4    4         2007/2/1     176
> 5    5         2007/2/2     188
> 6    6         2007/2/3     177
> 7    7        2007/2/3     177
> 8    8        2007/2/3     975
> 9    9         2007/2/3     170
>10    10        2007/2/3     177 ← 入力ミス

数式使うと簡単そうですが 今回も敢えて使いません!!


まず、上記のシートがあるシートモジュールに
(標準モジュールではないですよ!!)
'================================================================
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rng As Range
  Dim crng As Range
  Dim drng As Range
  Dim rw As Long
  Dim dd As Date
  Dim retcode As Boolean
  Set rng = Application.Intersect(Target, Range("d1:d65536"))
  If Not rng Is Nothing Then
    For Each crng In rng
     If IsDate(crng.Offset(0, -1).Value) Then
       retcode = True
       dd = crng.Offset(0, -1).Value
       rw = 1
       Call init_ctn
       Do Until Cells(rw, 3).Value = ""
        If Cells(rw, 3).Value = dd Then
          retcode = chk_ctn(Cells(rw, 4).Value, rw)
          If retcode = False Then
           Cells(rw, 4).Select
           MsgBox "入力ミス"
           Exit Do
           End If
          End If
        rw = rw + 1
        Loop
       Call term_ctn
       If retcode = False Then Exit For
       End If
     Next
    End If
End Sub


標準モジュールに
数字の連続性のチェックを行うプロシジャー群

'=========================================================
Option Explicit
Dim ctnvalue() As Variant
Dim ctnrow() As Long
Dim ctnidx As Long
'==========================================================
Sub init_ctn()
'連続性をチェックする内部データの初期化
  Erase ctnvalue
  Erase ctnrow
  ctnidx = 1
End Sub
'==========================================================
Function chk_ctn(ByVal chkvalue As Variant, _
         ByVal chkrow As Long) As Boolean
'指定されたデータが連続しているか否かのチェック
'chkvalue 値 chkrow 値の位置
'chk_ctn True 連続している False 連続していない
  Dim g0 As Variant
  On Error Resume Next
  chk_ctn = False
  g0 = Application.Match(chkvalue, ctnvalue(), 0)
  If IsError(g0) Or Err.Number <> 0 Then
    ReDim Preserve ctnvalue(1 To ctnidx)
    ReDim Preserve ctnrow(1 To ctnidx)
    ctnvalue(ctnidx) = chkvalue
    ctnrow(ctnidx) = chkrow
    ctnidx = ctnidx + 1
    chk_ctn = True
  Else
    If chkrow = ctnrow(g0) + 1 Then
     ctnrow(g0) = chkrow
     chk_ctn = True
     End If
    End If
End Function
'==========================================================
Sub term_ctn()
'連続性チェックの終了処理
  On Error Resume Next
  Erase ctnvalue()
  Erase ctnrow()
  ctnidx = 0
End Sub


これでD列の数値入力してみてください
数字が連続していなければ、エラーメッセージが表示されます。

細かいコメントや説明をしませんから、じっくり解読してみてください。

結構大変ですよ!!

【46573】Re:[46222]の追加質問 セルの入力方法
発言  さや  - 07/2/6(火) 23:13 -

引用なし
パスワード
   かみちゃん さん
こんばんは。

>現時点で、頭が混乱されているようですし、私もここで検討を一旦やめたいと思います。
>他に理解をされる方がいらっしゃれば、その方のコメントをお待ちいただくほうがいいかも
>しれません。

わかりました。私も頭の中を整理してみます。

【46575】Re:[46222]の追加質問 セルの入力方法
お礼  さや  - 07/2/6(火) 23:55 -

引用なし
パスワード
   ichinose さん
こんばんは。

>細かいコメントや説明をしませんから、じっくり解読してみてください。
>
>結構大変ですよ!!

わかりました。

貴重なお時間をとらせてしまい、すみませんでした。

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

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