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

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

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

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

Q&A

解決済

2回答

6262閲覧

VBAのfindメソッドで型が一致しません

skjdujr9djhf

総合スコア28

VBA

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

0グッド

0クリップ

投稿2018/03/13 05:08

前提・実現したいこと

今Excel上のB19:B387に日付のデータが入っています。
B19を開始日として1日ずつ加算された日付がB387まで約1年間入っています。

C6セルに日付を入力し、その日付から3日先以降の行を消す
処理をVBAで作成しています。

B19からB387には一意の日付のデータが入っており、途中に空白のデータは
存在しません。

C6(終了日と呼ぶ)セルと一致する行番号を取得しようと思うのですが、型が一致しません。
findメソッドのwhatはvariant型を指定しなければならないと思うのですが、日付のデータが
入っているセルは指定できないのでしょうか。

日付型のデータのセルをvariant型に変換しなくてはいけませんか?

型が一致しません

該当のソースコード

VBA

1Sub run() 2 3 Sheets("sheet1").Activate 4 5Dim r1 As Range 6Dim r3 As Range 7 8'終了日と一致する行番号を取得 9Set r1 = Range("B19:B387").Find(What:=Cells(6, 3).Value).Row 10 11 12'終了日から3行後の行番号を代入 13r2 = r1 + 3 14 15' セル「B19」の下端の行を取得 16Set r3 = Range("B19").End(xlDown).EntireRow 17 18 19'掲載終了日の3行したから下の行を全て削除 20Range(r2 & ":" & r3).Delete 21 22End Sub 23 24

試したこと

Set r1 = Range("B19:B387").Find(What:=Cells(6, 3).Value).Row
の処理で(What:=Range("C6").Value)とRangeでもやってみましたが駄目でした。

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

Rowはオブジェクトではないので、Setは不要では。

VBA

1r1 = Range("B19:B387").Find(What:=Cells(6, 3).Value).Row

投稿2018/03/13 05:33

ttyp03

総合スコア16998

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

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

ExcelVBAer

2018/03/13 05:44

見つかるか不明なので、一旦 Set して、Nothing 判定を入れた方が無難かと~
ttyp03

2018/03/13 05:54

正にExcelVBAerさんがおっしゃっていることが起こっているのでは。 つまりFindで見つかっていない。 こんな感じの実装がよいかと。 Set fr = Range("B19:B387").Find(What:=Cells(6, 3).Value) If fr Is Nothing Then ' 見つからない処理 Else r1 = fr.Row End If
skjdujr9djhf

2018/03/13 06:49 編集

Dim fr As Range result1 = VarType(Range("C6").Value) result2 = VarType(Range("B30").Value) Debug.Print result1 Debug.Print result2 Set fr = Range("B19:B387").Find(What:=Cells(6, 3).Value) If fr Is Nothing Then ' 見つからない処理 MsgBox "見つかりませんでした。" Else r1 = fr.Row MsgBox "見つかりました。" ソースを上記のようにして調べたところ、C6は日付型のデータでした。 またB30セルと同様の日付をC6のセルに入れてデバックしてみたのですが、判定では見つかりませんでした。 B30セルはあらかじめ、式で「=$B$19+11」という式を入れて日数を出しているのですが、 このデータは日付型のデータにはならないのでしょうか。 セルの書式設定では表示の形式を変更すると、日付の形式がyyyymmddやyyyy年m月等に変更できるので日付型のデータになっていると思っていたのですが、デバックをすると空が返ってきます。 何かしらの数字が返ってくると予想していたのですが。 B30セルに直接「2018/05/01」等を入力すると、見つかります。 何か質問の趣旨と違った質問になり、すみません。
ttyp03

2018/03/13 07:16

日付型同士であれば、問題なく結果が得られました。 B30セルのように計算していても大丈夫です。 この手の動作確認作業は本番環境で確認すると大変なので、簡単なデータを作ってそちらで基本構文や動きを確認することをお勧めします。
skjdujr9djhf

2018/03/13 08:39

>ExcelVBAerさん 参考資料ありがとうございます。 LookInオプションは指定が必須ではなかったので、軽視して見ていました。 また記事の通りLookIn:=xlValues を使う場合はデータの種類を 「*2018/5/1」等にしておかないと拾ってくれないことも確認しました。 >ttyp03さん 一応テストデータ的な感じでデータは作って動作確認はしております。 アドバイスありがとうございます。 上記を元に意図した物が作成できました。 ありがとうございます。
guest

0

  • r1が Rangeで宣言されている
  • Range("B19:B387").Find(What:=Cells(6, 3).Value).Row が返すのはlong

なので型が一致しないのでは?

投稿2018/03/13 06:12

h.horikoshi

総合スコア505

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

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

skjdujr9djhf

2018/03/13 08:40

Longでも宣言してみましたが、上手くいきませんでした。 今度時間があるときに挑戦してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問