- ベストアンサー
【Excel】特定のセルをダブルクリックした時に日付を表示する方法
- エクセルにて特定のセルをダブルクリックすると、そのセルに日付が表示されるマクロを作成したいと思っています。
- 現在のマクロはA1セルを対象にしており、ダブルクリックした際に西暦が入力されるようになっています。
- 他のセルでも同様の方法で月や日にちを入力させたい場合、マクロをどのように書き換えればよいでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは! Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Application.Intersect(Target, Range("A1:C1")) Is Nothing Then Exit Sub With Target Select Case .Address Case "$A$1" .Value = Year(Date) Case "$B$1" .Value = Month(Date) Case Else .Value = Day(Date) End Select End With Cancel = True End Sub こんな感じではどうでしょうか?m(_ _)m
その他の回答 (5)
- cj_mover
- ベストアンサー率76% (292/381)
こんにちは。お邪魔します。 イベントプロシージャのツボは抜けることにあり、 どんな場合に処理するか、ではなくて、 不要ならプロシージャを抜ける、 という思想で書かれたのが If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub ご提示のコードですが、その点では正しい考え方と思います。 直接的な回答としては以下 ' ============================== Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Application.Intersect(Target, Range("A1:C1")) Is Nothing Then Exit Sub Cancel = True Select Case Target.Column Case 1: Target.Value = Year(Date) Case 2: Target.Value = Month(Date) Case 3: Target.Value = Day(Date) End Select End Sub ' ============================== のようになります。 一方で、イベントプロシージャは 使用頻度の高いユーザーインターフェイスですので ユーザーにとっての扱い易さに重点をおいて書かれるべき、 という考えで、 できるだけ、軽い処理を選ぶ 少なくとも無駄なことはしない といことを、私がVBAを覚えた頃には教えてくれる人がいました。 条件分岐で比較などに使う値についての優先順として 数値 > 文字列値 > オブジェクト とうのがあります。 また、オブジェクトから値を取得する方法についても 備わったプロパティ > 呼び出し後に計算で求めるプロパティ > 関数の戻り値 > メソッドの戻り値 といのがあります。 この辺の理屈は、今はどうでもいいのですが、 Worksheet_BeforeDoubleClick イベント での条件分岐の基本形、ということですと以下 ' ============================== Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Value <> "" Then Exit Sub If Target.Row > 1 Then Exit Sub If Target.Column > 3 Then Exit Sub Cancel = True Select Case Target.Column Case 1: Target.Value = Year(Date) Case 2: Target.Value = Month(Date) Case 3: Target.Value = Day(Date) End Select End Sub ' ============================== のようになります。 ダブルクリックされたセルについて 何か値が設定されていれば、抜ける 1行めでなければ(行位置が1より大きい)、抜ける 3列めより右ならば(列位置が3より大きい)、抜ける ダブルクリック本来の編集モードへの切替をキャンセル 列位置が 3、なら、年 を値設定 2、なら、月 を値設定 1、なら、日 を値設定 という内容になります。 これが私が教わった(今は教えている)基本形です。 最近は、教えるのも教わるのもラクな方がいいということで (多くは誌面の限られたスペースの都合で) .Address プロパティ や Intersect メソッド を用いる方法が多く紹介されますが、 一応、サンプルを紹介しておいた方がいいかな、と思いました。 /// 話は変わって、 実際に手を動かす時のことを想像して仕様を考えてみたのですが、 A1をダブルクリック B1をダブルクリック C1をダブルクリック って3回操作しないといけないのでしょうか? A1:C3の範囲(の内のどれか)をダブルクリック で、A1:C3に一気に年、月、日を設定、 という例を挙げておきます。 ' ============================== Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Value <> "" Then Exit Sub If Target.Row > 1 Then Exit Sub If Target.Column > 3 Then Exit Sub Cancel = True Target.EntireRow.Resize(, 3).Value = Array(Year(Date), Month(Date), Day(Date)) End Sub ' ============================== 以上です。 ///Re:.Valueプロパティを省略しているおつもりなのでしょうか
お礼
ありがとうございます。 仕事で作らなければならなくなったのですが、今までVBAなど縁遠くてなかなか上手くいきません(;´Д`A ネットと参考書片手に苦戦しております。 ユーザーインターフェイスは大切ですね。凝った作りにすると思いがけない事されてエラーでますし。 色々と参考になりました、今後使わせていただきます。
- tsubuyuki
- ベストアンサー率45% (699/1545)
何度もすいません。 よく見ると、私のはあまり良くないですね。 ダブルクリックする順番が違う(A1・B1空白でC1をダブルクリックなど)と 何だかよくわからない状態になっちゃいますね。 で、無理矢理やるなら Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target <> "" Then Exit Sub Select Case Target.Address Case Range("A1").Address Target = Year(Now()) Case Range("B1").Address Target = Month(Now()) Case Range("C1").Address Target = Day(Now()) End Select End Sub こうですね。 コレを見やすくまとめて書かれているのが#2さんのコードです。 思いつきで書いて検証もせずに出すとダメですね(汗)。 大変失礼しました。
お礼
返答ありがとうございます。 試しに使ってみたのですがエラーが出てしまいました。間違って入力したかもですが。。。 でも、tom04さんの物と組み合わせて作ってみたら上手くいきました。 なかなか自分では思いつけないので大変参考になりました。ありがとうございます。
- tsubuyuki
- ベストアンサー率45% (699/1545)
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target <> "" Then Exit Sub Select Case Target Case Range("A1") Target = Year(Now()) Case Range("B1") Target = Month(Now()) Case Range("C1") Target = Day(Now()) End Select End Sub 失礼。一応補足です。 Ifの行を増やすと、ダブルクリックしたセルが空白じゃなかったら (何かが入力されている状態なら)何もせずに終わります。 もちろん、NowじゃなくてDateでも問題ないです。 ここは好みです。
- tom04
- ベストアンサー率49% (2537/5117)
No.2です! 投稿後に気づきました。 No.1さんとほぼ同じ内容になっていました。 どうも失礼しました。m(_ _)m
- tsubuyuki
- ベストアンサー率45% (699/1545)
例えば、 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Select Case Target Case Range("A1") Target = Year(Now()) Case Range("B1") Target = Month(Now()) Case Range("C1") Target = Day(Now()) End Select End Sub こんな感じでケース分けするとちょっとスッキリでしょうか。 年だけ・月だけ・日だけを別々に持ってきたいなら、Year・Month・Dayが便利ですよ。
お礼
返答ありがとうございます。 教えていただいた物を参考にtsubuyukiさんの物と組み合わせて作ってみたら上手くいきました。 ネットと参考書を片手に作っているのですが、思った通りの例やコードの組み合わせが見つからなく困っていました。 ありがとうございました。