プロが教える店舗&オフィスのセキュリティ対策術

エクセルにて特定のセルをダブルクリックをした時に日付を表示させたくて以下のマクロを組みました。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range,Cancel As Boolean)
If intersect(Target, Range("A1")) Is Nothing Then Exit Sub
If ActiveCell = "" Then
ActiveCell = Format(date, "yyyy")
Cancel = True
End If
End Sub

この場合A1セルをダブルクリックした時のみ西暦が入力されるようになっていますが、他のセルで、例えばB1セルでは月、C1セルでは日にちをダブルクリックで入力させるにはどうしたら良いでしょうか?
If intersect(Target, Range("A1")) Is Nothing Then Exit Sub
のTarget, Rangeを書き換えて複数このマクロを書き込んだのですがうまく動作しなくて。
知恵を貸していただけると助かります。

A 回答 (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
    • good
    • 0
この回答へのお礼

返答ありがとうございます。
教えていただいた物を参考にtsubuyukiさんの物と組み合わせて作ってみたら上手くいきました。
ネットと参考書を片手に作っているのですが、思った通りの例やコードの組み合わせが見つからなく困っていました。
ありがとうございました。

お礼日時:2013/06/24 10:24

こんにちは。

お邪魔します。

イベントプロシージャのツボは抜けることにあり、
 どんな場合に処理するか、ではなくて、
 不要ならプロシージャを抜ける、
という思想で書かれたのが
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プロパティを省略しているおつもりなのでしょうか
    • good
    • 0
この回答へのお礼

ありがとうございます。
仕事で作らなければならなくなったのですが、今までVBAなど縁遠くてなかなか上手くいきません(;´Д`A
ネットと参考書片手に苦戦しております。
ユーザーインターフェイスは大切ですね。凝った作りにすると思いがけない事されてエラーでますし。
色々と参考になりました、今後使わせていただきます。

お礼日時:2013/06/24 10:17

何度もすいません。


よく見ると、私のはあまり良くないですね。
ダブルクリックする順番が違う(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さんのコードです。


思いつきで書いて検証もせずに出すとダメですね(汗)。
大変失礼しました。
    • good
    • 0
この回答へのお礼

返答ありがとうございます。
試しに使ってみたのですがエラーが出てしまいました。間違って入力したかもですが。。。
でも、tom04さんの物と組み合わせて作ってみたら上手くいきました。
なかなか自分では思いつけないので大変参考になりました。ありがとうございます。

お礼日時:2013/06/24 10:21

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でも問題ないです。
ここは好みです。
    • good
    • 0

No.2です!



投稿後に気づきました。
No.1さんとほぼ同じ内容になっていました。

どうも失礼しました。m(_ _)m
    • good
    • 0

例えば、



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が便利ですよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!