dポイントプレゼントキャンペーン実施中!

エクセル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

A 回答 (3件)

こんにちは!


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

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

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

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

お礼日時:2014/09/11 14:42

続けてお邪魔します。



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

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

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

お礼日時:2014/09/11 17:03

No.1です。


投稿後気になったのですが、

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

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

の部分は無視してください。m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2014/09/11 14:49

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