ここから本文です

Excel2013 .countについて シート内のあるセルが変更されたらその隣のセルに時...

fre********さん

2019/1/1712:45:12

Excel2013 .countについて

シート内のあるセルが変更されたらその隣のセルに時刻を入れたい。
調べると以下のサンプルがありました。

これはA列内のセルに変更があった場合、隣のセルに時刻を入れますが、

Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If Application.Intersect(Range("A1:A1000"), Target) Is Nothing Then Exit Sub
If .Count > 1 Then Exit Sub
If IsEmpty(.Value) Then
.Offset(, 1).ClearContents
Else
.Offset(, 1).Value = Time
End If
End With
End Sub

A列に限らず、あるセルが変更されれば、その隣のセルだけに時刻を入れたい。
A1:A1000をA1:Z1000
にすれば、時刻を隣に入れたため、そのまた右にも時間が入ります。

この構文のいくつかについて教えてください。
Q1. If .Count > 1はどういう意味でしょうか? 何故必要なのでしょうか?
Q2. Count関数には引数が必要ですが、このドットがついたものは関数ではないのでしょうか?
Q3. 入力セルの隣のセルだけに時刻を入れたい場合はどうすればいいでしょうか?

閲覧数:
29
回答数:
2
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

tra********さん

2019/1/1715:23:29

Q1. If .Count > 1はどういう意味でしょうか? 何故必要なのでしょうか?
Target(=変更されたセルの範囲)のセル数が1つでないときという意味。
.Countは、「With Target」と影響を受けていることを認識すべきです。
ここ
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q111077780...
の私の回答を参考にしてください。

作者は、1つ以上のセルが変更されたときこの処理を行いたくなかったということです。

Q2. Count関数には引数が必要ですが、このドットがついたものは関数ではないのでしょうか?
Rangeオブジェクトが持つプロパティで、範囲のセル数を返します。
Count関数の起動は、

セル数 = WorksheetFunction.Count(Range("A1:C100"))

といった書き方になります。

Q3. 入力セルの隣のセルだけに時刻を入れたい場合はどうすればいいでしょうか?
Application.EnableEventsを使用してください。

一例です (未実行)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngs As Range, rng As Range
Set rngs = Intersect(Range("A1:Z1000"), Target)
If rngs Is Nothing Then Exit Sub
Application.EnableEvents = False
For Each rng In rngs
With rng
If IsEmpty(.Value) Then
.Offset(, 1).ClearContents
Else
.Offset(, 1).Value = Time
End If
End With
Next rng
Application.EnableEvents = True
End Sub

質問した人からのコメント

2019/1/20 18:07:26

丁寧な説明、ありがとうございました。解決しました。
「With Target」と影響を受けているという表現やサンプルでDimの変数定義は不要では??との難解さがありましたが、丁寧さは伝わりました。

ina**さんも
簡潔・的確な説明、シンプルサンプルありがとうございました。

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

ina********さん

2019/1/1715:18:39

>Q1. If .Count > 1はどういう意味でしょうか? 何故必要なのでしょうか?

セルが、2個以上同時に変更された時には動作させないようにしています。
逆に言うと、1個の時だけ動作するようにしています。


>Q2. Count関数には引数が必要ですが、このドットがついたものは関数ではないのでしょうか?

Rangeオブジェクトのプロパティです。


>Q3. 入力セルの隣のセルだけに時刻を入れたい場合はどうすればいいでしょうか?

Application.EnableEventsプロパティを操作して、イベントの連鎖が起きないようにします。


Private Sub Worksheet_Change(ByVal Target As Range)
    With Target
        If Application.Intersect(Range("A1:Z1000"), Target) Is Nothing Then Exit Sub
        If .Count > 1 Then Exit Sub
        
        Application.EnableEvents = False
        
        If IsEmpty(.Value) Then
            .Offset(, 1).ClearContents
        Else
            .Offset(, 1).Value = Time
        End If
        
        Application.EnableEvents = True
    End With
End Sub

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる