エクセルにて特定のセルをダブルクリックをした時に日付を表示させたくて以下のマクロを組みました。
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を書き換えて複数このマクロを書き込んだのですがうまく動作しなくて。
知恵を貸していただけると助かります。
No.2ベストアンサー
- 回答日時:
こんばんは!
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
返答ありがとうございます。
教えていただいた物を参考にtsubuyukiさんの物と組み合わせて作ってみたら上手くいきました。
ネットと参考書を片手に作っているのですが、思った通りの例やコードの組み合わせが見つからなく困っていました。
ありがとうございました。
No.6
- 回答日時:
こんにちは。
お邪魔します。イベントプロシージャのツボは抜けることにあり、
どんな場合に処理するか、ではなくて、
不要ならプロシージャを抜ける、
という思想で書かれたのが
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
ネットと参考書片手に苦戦しております。
ユーザーインターフェイスは大切ですね。凝った作りにすると思いがけない事されてエラーでますし。
色々と参考になりました、今後使わせていただきます。
No.5
- 回答日時:
何度もすいません。
よく見ると、私のはあまり良くないですね。
ダブルクリックする順番が違う(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さんの物と組み合わせて作ってみたら上手くいきました。
なかなか自分では思いつけないので大変参考になりました。ありがとうございます。
No.4
- 回答日時:
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でも問題ないです。
ここは好みです。
No.1
- 回答日時:
例えば、
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が便利ですよ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Excel(エクセル) エクセルのイベントプロシージャーでF列の最終行のセルの入力をトリガーにしたいのですが 1 2022/10/14 09:36
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) VBAで重複した値のセルに色付けをしたい 1 2022/11/02 16:12
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) エクセルVBA ダブルクリックしたら色反転を指定したセルのみにしたい 2 2022/04/06 12:52
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【スプレドシート】IMPORTRANGE...
-
MicrosoftOfficeの1ユーザー2...
-
MicrosoftOffice2019なんですが、
-
Microsoft 365のディフェンダー...
-
英数字のみ全角から半角に変換
-
Excel 日付を比較したら、同じ...
-
Microsoft Officeを2台目のPCに...
-
Microsoft365の「お支払いを更...
-
会社PCのメールが更新されない
-
エクセル関数について
-
エクセルのシフト表を簡単にGoo...
-
ウィンドウィズ メモ帳で日付だ...
-
会社のTeamsのことで相談です。...
-
バソコンが二台とも壊れ後換装...
-
Microsoft Formsの「個人情報や...
-
複数の写真を1枚に印刷
-
Formsにて、匿名にて回答する方...
-
パソコン画面の中の小さい画面...
-
マイクロソフト 一時使用コード...
-
MicrosoftOfficeについて質問で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【スプレドシート】IMPORTRANGE...
-
【スプレッドシート】指定の日...
-
英数字のみ全角から半角に変換
-
会社PCのメールが更新されない
-
マイクロソフト 一時使用コード...
-
Office 2021 Professional Plus...
-
エクセルで例えば、関数を使っ...
-
Microsoft Formsの「個人情報や...
-
1つのPCに「Excel 2010」「Exc...
-
エクセルで例えば、A1に㈱ベ...
-
理由を教えてください。
-
エクセルでXLOOKUP関数...
-
マイクロソフト オフィスについて
-
VLOOKUP関数について
-
teams設定教えて下さい。 ①ビデ...
-
Googleのスプレッドシートでシ...
-
【Excel VBA】PDFを作成して,...
-
Microsoft365で写真をアルバム...
-
Outlook で宛先が複数の場合の人数
-
Excel テーブル内の空白行の削除
おすすめ情報