こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Find,Offsetを使ってセルを指定する方法

エクセルVBAのことで伺います。

以下の記述は、「D3からQ3までのセルの中で「年」と入ったセルの左横のセルを探し、
その中の値(西暦の年が入っています)を、G4からI100までの範囲に入力される月日
の年として置き換える」といったものなのですが、エラーが出てしまいます。

「実行時エラー424、オブジェクトが必要です。」とのメッセージが表示され、デバックを
クリックすると、「Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1).Select」
が黄色く強調表示されています。

プログラムの記述をどのように修正すれば良いか、どなたかお教えください。

よろしくお願いいたします。


Private Sub Worksheet_Change(ByVal Target As Range)
Dim FoundCell As Range
Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1).Select
With Target
If Intersect(Target, Range("G4:I100)) Is Nothing Or Target.Count <> 1 Then Exit Sub
If IsDate(.Value) Then
If Year(.Value) <> FoundCell Then
Application.EnableEvents = False
.Value = DateSerial(FoundCell, Month(.Value), Day(.Value))
Application.EnableEvents = True
End If
End If
End With
End Sub

投稿日時 - 2014-09-11 13:17:54

QNo.8750441

困ってます

質問者が選んだベストアンサー

こんにちは!
具体的にどんな動きにしたいのか判らないのですが、
コードを拝見して・・・

>Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1).Select

>Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1)


>.Value = DateSerial(FoundCell, Month(.Value), Day(.Value))
はYearが抜けていますので
>.Value = DateSerial(Year(FoundCell), Month(.Value), Day(.Value))

としたらどうなりますか?m(_ _)m

投稿日時 - 2014-09-11 13:58:44

お礼

迅速なご回答ありがとうございました。

しかし、なぜ「Select」が入っているとダメだったのか、教えていただけないでしょうか。

投稿日時 - 2014-09-11 14:42:49

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

続けてお邪魔します。

No.1に
>しかし、なぜ「Select」が入っているとダメだったのか、教えていただけないでしょうか。
とありましたので・・・

Selectという動作は単に選択しするだけです。
>Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1)
の部分ですでに FoundCell に Range("D3:Q3")の中の対象セルがセットされています。
どうしてもSelectを使いたい場合は
>Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1)
>FoundCell.Select
のように2行に分割してやります。
当然
>.Value = DateSerial(FoundCell, Month(.Value), Day(.Value))

.>Value = DateSerial(Selection, Month(.Value), Day(.Value))
のように変えなければなりません。

※ Selectを使う場合は FoundCell の宣言は不要で

Private Sub Worksheet_Change(ByVal Target As Range)
Range("D3:Q3").Find("年").Offset(0, -1).Select
With Target
If Intersect(Target, Range("G4:I100")) Is Nothing Or Target.Count <> 1 Then Exit Sub
If IsDate(.Value) Then
If Year(.Value) <> Selection Then
Application.EnableEvents = False
.Value = DateSerial(Selection, Month(.Value), Day(.Value))
Application.EnableEvents = True
End If
End If
End With
End Sub

のようなコードになると思います。m(_ _)m

投稿日時 - 2014-09-11 16:10:48

お礼

丁寧なご説明、ありがとうございました。

ようやく理解できました。

投稿日時 - 2014-09-11 17:03:04

ANo.2

No.1です。
投稿後気になったのですが、

FoundCellがシリアル値ではなく、単に数値の場合は

>.Value = DateSerial(FoundCell, Month(.Value), Day(.Value))
>はYearが抜けていますので
>.Value = DateSerial(Year(FoundCell), Month(.Value), Day(.Value))

の部分は無視してください。m(_ _)m

投稿日時 - 2014-09-11 14:16:59

お礼

ありがとうございます。

投稿日時 - 2014-09-11 14:49:47

あなたにオススメの質問