質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

613閲覧

クリックしたセルより上で最も近い、日付が書いてあるセルを別のセルにコピーペーストするシステム

matuemon

総合スコア4

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/12/04 15:45

前提

ダブルクリックしたセルの上にある一番クリックしたセルに近い、日付が書いてあるセルをコピーペーストするシステムを作っているのですが、どのようにすればよいかわからなくなってしました。

実現したいこと

対象:選択したセルの上には日付が載っているセルが複数ある。
想定機能:ダブルクリックしたセルに最も近い、同列で日付が書いているセルを獲得しコピーペースト。
構成予定:like関数を用いて上からダブルクリックしたセルまで順番に取得し、最後に得たものをコピーペースト。

発生している問題・エラーメッセージ

実行時エラー'424' オブジェクトが必要です。

該当のソースコード

VBA

1Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 2 3Dim SearchCells As Object 4Dim Possibility As Range 5 6 Set Possibility = SerchCells.Value 7 8 For Each SearchCells In Worksheets(1).Range(Cells(Target.Row, 1), Cells(Target.Row, Targe.Columns)) 9 10 If SearchCells.Value Like "####/##/##" Then 11 12End If 13 Next SearchCells 14 15 16Cells(Taarget.Row, Possibility.Column).Copy Destination:=Range("J3") 17 18 Cancel = True 19 20End Sub 21 22

試したこと

Setを用いたりしましたが、ダメでした。

補足情報(FW/ツールのバージョンなど)

Excel 2019を使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Set Possibility = SerchCells.Value

ここも誤りですね。
・Object型で宣言されているPossibilityに、Range.Valueは入れられない。
・この段階ではSerchCellsになにも入っていないため、SerchCells.Valueがエラーになる。
・宣言されている変数は"SearchCells"。

その後にPossibility.Columnsを使うことから、

VBA

1For Each SearchCells In Worksheets(1).Range(Cells(Target.Row, 1), Cells(Target.Row, Target.Columns)) 2 If SearchCells.Value Like "####/##/##" Then 3 Set Possibility = SearchCells 4 End If 5Next For

みたいな運用をするか、どうせほしいのがPossibility.Columnなら

VBA

1dim Possibility as Long 2 3If SearchCells.Value Like "####/##/##" Then 4 Possibility = SearchCells.Columns 5End If

のようにしてもいいかもしれませんね。

12/6追記:
いろいろと抜けがありましたので以下の通り修正します。とりあえず手元ですとエラーにならずに動きます。

・Target.Columns→Target.Column(誤字修正)
・SearchCells.Columns→SearchCells.Column(誤字修正)
・ Worksheets(1).Range(Cells(Target.Row, 1), Cells(Target.Row, Target.Columns))
→ Me.Range(Me.Cells(Target.Row,1),Me.Cells(Target.Row, Target.Column))
(ワークシート上に記述されているなら、Meを使った方が確実。また、Range内側のCellsにもMeをかけないと、エラーになることがある)

VBA

1For Each SearchCells In Me.Range(Me.Cells(Target.Row, 1), Me.Cells(Target.Row, Target.Column)) 2 3 If SearchCells.Value Like "####/##/##" Then 4 Possibility = SearchCells.Column 5 End If 6Next

また何度もMeと書くのは煩わしいので、Withを用いて以下のように書けます。

VBA

1With Me 2 For Each SearchCells In .Range(.Cells(Target.Row, 1), .Cells(Target.Row, Target.Column)) 3 4 If SearchCells.Value Like "####/##/##" Then 5 Possibility = SearchCells.Column 6 End If 7 Next 8End With

投稿2022/12/05 00:11

編集2022/12/06 01:11
Usirow

総合スコア364

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matuemon

2022/12/05 05:38

ご回答ありがとうございます。Possibility As Longにしてみたのですが、やはり、同じ「オブジェクトが必要です。」というエラーメッセージが出てきてしまいました。デバッグでは"For Each SearchCells In Worksheets(1).Range(Cells(Target.Row,1), Cells(Target.Row, Target.Columns))に黄色いマーカーが引かれてしまいます。
matuemon

2022/12/06 15:27

追記ありがとうございます。初歩的な不手際のご指摘ありがとうございます。また初歩的なミスで申し訳ないのですが、今度はDestination:=Range("J3")の部分で「修正候補:式」というコンパイルエラーがでてしまいました。
Usirow

2022/12/07 02:33

パッと考えられるのは以下の2点です。ご確認をお願いします。 ・pig_vba様の指摘されているタイプミス(Taarget)を修正していない ・PossibilityをLongにしたのに、Possibility.Columnをそのままにしている(この場合は.Columnは不要です)
matuemon

2022/12/07 17:41

一通り確認してみたのですが、解決できませんでした。一応、Possibility=SearchCellでも試してみましたが、この場合は「実行時エラー:91」が表示され、現在は”Cells(Target.Row, "Possibility").Copy Destination:=Range("J3")”にマーカーが引かれ、「型が一致しません」というエラーが出てしまいます。Copy Destination間を改行すると、「構文エラー」と表示されてしまいます。
Usirow

2022/12/08 00:05

SearchCells.Value Like "####/##/##" が機能していないのではないかと思うので、該当箇所をIsDate(SearchCells.Value) にしてみてください。
matuemon

2022/12/08 09:38

ご回答ありがとうございます。変更してみたのですが、変わらずに「Cells(Target.Row, "Possibility").Copy Destination:=Range("J3")」の部分が「型が一致しません」となり、改行すると「修正候補:式:」か「構文エラー」と出てしまいます。何度かスペルミスや今までご指摘頂いた内容を見返してみましたが、やはりミスが見つけられませんでしたので、現状の状態を載せさせて頂きます。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim SearchCells As Variant Dim Possibility As Long For Each SearchCells In Me.Range(Me.Cells(Target.Row, 1), Me.Cells(Target.Row, Target.Column)) If SearchCells.Value Like IsDate(SearchCells.Value) Then Possibility = SearchCells.Columns End If Next Cells(Target.Row, "Possibility").Copy Destination:=Range("J3") Cancel = True End Sub
Usirow

2022/12/09 00:02

Cells(Target.Row, "Possibility").Copy Destination:=Range("J3") を以下のようにしてください。 Cells(Target.Row, Possibility).Copy Destination:=Range("J3") ・"Possibility" → Possibility(ダブルクォーテーションを外す) ・改行しない
matuemon

2022/12/09 15:13

ご回答ありがとうございます。変更してみたところ。「実行時エラー1004:アプリケーション定義またはオブジェクト定義エラーです。」というエラーが出てきました。
matuemon

2022/12/11 16:49

その後、日付ではなく、アルファベットで試してみたところ、上手くいきました。日付についてはLike関数と日付の関係性をもう少し自身でも調べてみたいと思います。今まで長々と付き合って頂きありがとうございました。
guest

0

Cells(Taarget.Row, Possibility.Column).Copy Destination:=Range("J3")

Target.Rowのtypoですね。エラー出たときはまずどの行で止まってるか確認するといいでしょう。質問時にもエラー行が分かってると回答が早くなりますので…(特にコード全体が長くなるとき)

投稿2022/12/04 22:53

pig_vba

総合スコア807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問