[[20220618061746]] 『vba 文字を検索・起点にしてセル範囲をコピー』(水無月) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『vba 文字を検索・起点にしてセル範囲をコピー』(水無月)

	お世話になります。
	特定の文字を検索・起点にしてセル範囲をコピーするvbaを教えて下さい。

	【流れ】
	セルB10 に あいう という文字列あります。あいう の位置は都度移動します。
	アクティブシート上で あいう の文字列を検索し セルB10 を取得

	見つかった場合
	B10を起点に、一つ右のC10から G20 までをコピーし計算2シートの B3へペースト

	見つからなかった場合
	C20から G30 までをコピーし計算2シートの B3へペースト

	はどのように書けばいいのでしょうか?
	下記までは分かったのですが、「起点検索してセル取得」が分かりません。よろしくお願いします。

	Sub 検索コピー1()
	   (起点を検索してセル取得)
	見つかれば
	   Range(Cells(起点, 起点 + 1), Cells(起点 + 10, 起点 + 5)).Copy
	   Sheets("計算2").Select
	   Cells(3, 2).PasteSpecial
	見つからなければ
	   Range(Cells(20, 3), Cells(30, 7)).Copy
	   Sheets("計算2").Select
	   Cells(3, 2).PasteSpecial
	End Sub

< 使用 Excel:Office365、使用 OS:Windows10 >


 検索対象範囲内に"あいう"が1つしか存在しない事が前提です。
 ActiveSheet.UsedRange は、必ず"あいう"が入力され得る範囲に変更可能。
 例) Range("B10:B20")等

    Sub 検索コピー2()
        Dim rng As Range
        Set rng = ActiveSheet.UsedRange.Find("あいう", , xlValues, xlWhole)
        If Not rng Is Nothing Then
            rng.Offset(, 1).Resize(11, 5).Copy Sheets("計算2").Range("B3")
        Else
            Range("C20:G30").Copy Sheets("計算2").Range("B3")
        End If
    End Sub
(あなご) 2022/06/18(土) 07:21

 あなごさん
 ありがとうございます。うまくいきました。

 一つ伺います。
 If Not rng Is Nothing Then
 この意味は「もし rng が無いことがなかったら」でしょうか?
 言い換えると
 「もし rng があれば」 で、vbaではこう書くのですね

(水無月) 2022/06/18(土) 10:17


横入りですが。

そうですよ。

RangeのFindメソッドのヘルプを読まれることです。
>一致するデータが見つからなかった場合、このメソッドは Nothing を返します。
と書いてあります。
日本語に逐一変換せずに、そういうキーワードを使うのだと考えて下さい。
「Nothingを返さなかったら」ということです。
(γ) 2022/06/18(土) 11:11


否定形がどうしても我慢ならん、ということなら
If Not rng Is Nothing Then
の代わりに、
If TypeName(rng) = "Range" Then
と書いてもいいでしょう。

(γ) 2022/06/18(土) 11:23


 「否定形がどうしても我慢ならん」
 その通り! の訳ないです(^^)。

 ありがとうございました。

(水無月) 2022/06/18(土) 14:26


 既にご指摘がある通り、 Findメソッドの戻り値は、
 検索対象が有った場合は、Rangeオブジェクト(検索対象が最初に見つかったセル)が、
 検索対象が無かった場合、Nothingが返ります。

 コードを実行した時、戻り値の中身の可能性を挙げると、
 例えば、Range("B10")が返る、Range("B11")が返る、Range("B12")が返る・・・Nothingが返るとなります。
 つまり、有った/無かった という二択ではありませんので、
 IFステートメントで条件分岐するとき、
 If rng Is 「有った」 Then の様には書けません。
 「無かった」方は明確に Nothing と書けるので、こちらを用います。

 Not演算子を用いずに記述する場合、
 γさんがご提示のTypeName関数以外にも、
 If rng Is Nothing = False Then
 とか
 If rng Is Nothing <> True Then
 でも同じ結果になります。
 今回の場合、有/無 の両方の場合に処理がありましたので、
 If rng Is Nothing Then
     '無かった場合の処理
 Else
     '有った場合の処理
 End If
 と書くこともできました。

 結論としては、書き方はいろいろあるので
 自分が理解出来て読みやすい書き方をすれば良いと思います。
(あなご) 2022/06/18(土) 14:29

 とても丁寧な解説
 感謝いたします。
 ありがとうございました。

(水無月) 2022/06/18(土) 15:19


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.