
A1と同じものを検索するのにApplication.MatchとForNextを使って行いたいのですが上手く出来ません
A1 7000 B1 500
B2 250
B3 7000
B4 350
B5 7000
B6 650
B7 7000
B8 870
B9 900
B10 340
とあって下のマクロを実行すると一番最初のしかでませんあるもの全部を検索したいのですがどうすれば良いですか教えて下さい
Sub Sample3()
Dim ret As Variant
For i = 1 To 10
ret = Application.Match(Range("A1"), Range("B1:B10"), 0)
Cells(2, 5) = ret
Next
If IsError(ret) Then
MsgBox "該当データが見つかりません"
Else
MsgBox ret & "番めのデータです"
End If
End Sub
No.3ベストアンサー
- 回答日時:
よそ様の回答への補足に横槍を指させていただきます。
ご容赦ください。
> ForNextでは遅いのではと思っています。
2番さんの回答で提示くださっているコードは試してみましたか?
当方の環境(D社のごく一般的なビジネスモデルPC)で、
「B列に列記してある10万行のデータから
A1セルと合致するものをD列に、そのデータがある行をE列に、
それぞれ列記していくコード」
を思いつくまま書いたものが以下のコードです。
Sub test()
Dim TRow As Long
Application.ScreenUpdating = False
Range("D:E").ClearContents
TRow = 0
For i = 1 To Cells(Rows.Count, 2).End(xlUp).Row
If Range("B" & i) = Range("A1") Then
TRow = TRow + 1
Range("D" & TRow) = Range("B" & i)
Range("E" & TRow) = i
End If
Next
If TRow = 0 Then
MsgBox "該当なし"
End If
Application.ScreenUpdating = True
End Sub
これで10万件から該当約100件を書き出すのに2.5秒くらいです。
これを遅いとみるか早いとみるかは個人の判断ですが、
少なくとも「永遠に最初の1件しか見つけないMATCH関数を使う方法」よりは
確実に早いことだけは間違いないです。
単純に「検索」するだけなら、Findメソッドが早くて楽です。
順に「抽出」して書き出すなら、For~Nextが早いです。
ワークシート関数を使うなら、更なる工夫が必要です。
(例えば、見つけた行より下からまた探すように範囲を決めてFor~Nextなど)
> Application.WorksheetFunctionなんかを使用してできますか?
エクセルのワークシート関数で「合致した全ての値を返す関数」
あるいは「再計算すると合致したデータの内、2番目に合致した値を返す関数」
もしくはそれに代替できる「関数を使った機能」
と言うのが私の知識の中には無いので、上記の工夫以外には残念ながら思いつきません。
質問文中のコードについて
> For i = 1 To 10
> ret = Application.Match(Range("A1"), Range("B1:B10"), 0)
> Cells(2, 5) = ret
> Next
とりあえず、ここまで
ワークシート関数のMATCHを使って同じ範囲を検索している間は
何度繰り返そうが最初に合致したデータしか取りません。
つまり、変数retの値は「最初に合致した行数」「エラー 2042=値を取得できない」
この二つのどちらかしか持ちません。
なのでこの後で
> If IsError(ret) Then
> MsgBox "該当データが見つかりません"
> Else
> MsgBox ret & "番めのデータです"
>End If
としても、最初のデータ行数しか返さない、という事です。
仮に上部のFor~Nextで上から徐々に舐めていくように組めたとしても、
見つける度に変数retを書き換えて、
全てのデータを見終わった後でメッセージボックスを出しているのですから、
この場合も「最後のデータ行」「エラー」どちらかしか表示されません。
これは「お望みの処理」ではないはずです。
それよりもまず先に、余計なお世話かもしれませんが
「ご自身がやりたい作業はどんなものか?」
コレを整理なさった方がよろしいのではないでしょうか。
よく判りました。
もともとNo2の回答で私のやりたいことはできたのですが、前に自分でfornextで行った時に時間がかかった記憶がありましたので書かさせて頂いたのですが、これで10万件から該当約100件を書き出すのに2.5秒くらいです。これは早いですこれぐらいで出来れば満足です。
これを使わせて貰いたいと思います。丁寧な説明と適確なご指摘ありがとうございました。
No.2
- 回答日時:
>ForNextを使って行いたい
ならば、こんなかんじかな?
Sub Sample3()
Dim ret As Variant
For i = 1 To 10
If Cells(1, 1) = Cells(i, 2) Then
ret = ret & i & vbCrLf
End If
Cells(2, 5) = ret
Next
If ret = "" Then
MsgBox "該当データが見つかりません"
Else
MsgBox ret & "番めのデータです"
End If
End Sub
この回答への補足
早々ありがとうございました。
>ForNextを使って行いたいならば、こんなかんじかな?ですがこれ以外にApplication.WorksheetFunctionなんかを使用してできますか? ForNextでは遅いのではと思っています。
実際には沢山の中から検索したいのでできるだけ早いほうが助かります。
再度よろしくお願いします。
No.1
- 回答日時:
Application.Match(Range("A1"), Range("B1:B10"), 0)
↓
B1:B10の範囲内にA1のデータと同じ物がいくつあるかを調べる
これは何回実行しても3しか出て来ません、B3セルが該当しているという意味でもありません
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) Sheet2からオートフィルターで売上日を抽出した件数をカウントし、その件数をSheet1のセルB1 2 2023/01/12 12:24
- Excel(エクセル) 指定文字列が該当するA列をアクティブセルにするには 3 2022/08/17 13:18
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで長い行を5行ごとに1...
-
【エクセル】区切り文字が含ま...
-
差し込み印刷で文字列が「0」と...
-
テキストデータのPDFをWordで開...
-
エクセルの関数で範囲のある数...
-
オブジェクトブラウザでデータ...
-
使用しているエクセルデータか...
-
エクセルで時間の合計ができません
-
DBで改行が入っているデータをE...
-
COUNTIFS関数で日付データを数...
-
エクセルでプルダウン選択され...
-
【マクロ】転記ツール。転記先...
-
0:00をカウントしない方法
-
SUMIFS関数の計算結果が違います
-
膨大なデーターの変更点のみ抽...
-
256列以上のデータを作成し、ワ...
-
エクセルのマクロで他のシステ...
-
エクセルで列にあるユニークな...
-
WORD97/2000とXPの互換性
-
wordデータを、excelに自動で入...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで長い行を5行ごとに1...
-
【エクセル】区切り文字が含ま...
-
差し込み印刷で文字列が「0」と...
-
エクセルの関数で範囲のある数...
-
テキストデータのPDFをWordで開...
-
DBで改行が入っているデータをE...
-
SUMIFS関数の計算結果が違います
-
オブジェクトブラウザでデータ...
-
マクロ 行挿入で数式も反映す...
-
wordデータを、excelに自動で入...
-
エクセルでプルダウン選択され...
-
エクセルで時間の合計ができません
-
エクセルで列にあるユニークな...
-
膨大なデーターの変更点のみ抽...
-
エクセルで「データ」の「区切...
-
エクセルのマクロで他のシステ...
-
COUNTIFS関数で日付データを数...
-
エクセルにおいて、数値が入っ...
-
差し込み印刷で、生年月日を昭...
-
斜めの貼り付け
おすすめ情報