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

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

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

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

Q&A

解決済

2回答

1366閲覧

FineNextにて一回検索された文言に変更されてしまう……

ma2hiro

総合スコア159

VBA

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

0グッド

0クリップ

投稿2021/12/03 08:21

編集2021/12/06 04:37

お世話になっております。

今現在”今期””をエクセル内検索して配列に格納しようとしております……

ネット上で ”vba 検索 Find複数” で検索して出てきた
【エクセルVBA】FindNextメソッドで指定範囲内の検索条件にヒットする値をすべて取得する方法
にてFindNextというものがあり使えそうだと思って実装したのですが

excel

1 23期A1 60 34期A1 70 45期A1 80 5 63期B1 55 74期B1 66 85期B1 77 9 103期A+B 555 114期A+B 666 125期A+B 777 13 143期A+B 55 154期A+B 66 165期A+B 77 17 18[利益シート]

のようなデータがあった場合
実装として

VBA

1Dim year, kikawarime As Integer, gKi As String 2 3Private Function getTounenndoGyou() As Variant 4 Dim tmp As Integer 5 Dim rng As Range, tempRng As Range, searchRng As Range 6 7 tmp = year - 2018 8 gKi = Str(tmp) & "期" 9 gKi = Replace(gKi, " ", "") 10 Dim kiGyouArray(7), i As Integer 11 12 Set searchRng = Range("B:B") 13 ' 最初はFindで検索 14 Set rng = searchRng.Find(gKi) 15 ' 検索結果を一時保存 16 Set tempRng = rng 17 18 i = 1 19 20 ' 条件にあったセルが見つからなければNothingが返るので何もしません 21 Do While Not rng Is Nothing 22 23 Debug.Print rng.Row 24 kiGyouArray(i) = rng.Row 25 i = i + 1 26 27 ' FindNextで検索を継続 28 Set rng = searchRng.FindNext() '←←←←←←←←←←←これでどう??? 29 30 ' すべて検索し終えると最初に戻るので、Addressで確認! 31 ' これを忘れると無限ループになるので注意! 32 If rng.Address = tempRng.Address Then 33 Exit Do 34 End If 35 Loop 36 37 getTounenndoGyou = kiGyouArray 38 39End Function 40 41Sub 全社支社利益の色更新_Click() 42 Dim wb As Workbook 43 Dim fname As String 44 Dim tounendoGyou() As Variant 45 fname = Range("B1").Value 46 47 Set wb = Workbooks.Open(fname) 48 With Worksheets("利益") 49 Worksheets("利益").Select ' 50 tounendoGyuu = getTounenndoGyou 51 52: 53End Sub

以上の上記URLを参考に実装しました……

ですが一回 searchRng.Findをすると上記の場合だと
rng が 5期A1 とセットされてしまい
5期のみで検索した次の文言が取得出来ません……

Set rng = searchRng.FindNext()


Set rng = searchRng.FindNext(gKi)
とすると実行時エラー'1004'と出て「ヘルプ」を押下すると

https://docs.microsoft.com/en-us/office/client-developer/excel/excel-home?redirectedfrom=MSDN
に飛んでしまうのでen-usをja-jpにして右上の検索窓で
FindNextと検索して探した
https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.findnext
を見てWhat:="X"と指定してあったので
Set rng = searchRng.Find(What:=gKi, LookAt:=xlPart)
としても駄目でした……

どうやったら検索の文言を変更せずにFindNextが使用出来るのか
なんという語句で調べれば良いかお問い合わせしてよろしいでしょうか?

長々と大変申し訳ないのですが何か情報をお持ちな方はコメント頂けますと嬉しく思います。


追記
[利益シート]

3期A+B 55
4期A+B 66
5期A+B 77

3期A+B 55
4期A+B 66
5期A+B 77

と同じものがあった場合
Set rng = searchRng.FindNext(rng)
では何か先に進めない気がします……

もうちょっと調べてみます。

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

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

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

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

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

guest

回答2

0

FindNextの引数の説明をよく読んでください。
Webサイト検索して調べた、FindNextを使用したサンプルと見比べてみて、引数がおかしいと思いませんか?よーく見てみましょう。

FindNextというものがあり使えそうだと思って実装したのですが

いきなり本番で使うExcelで実装する前に、別にExcelファイルを作って、
必要最小限のコードで動作を確認して、上手くいってから実装するようにしましょう。

投稿2021/12/03 09:14

編集2021/12/03 09:21
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ma2hiro

2021/12/06 00:28

radian様 仰る通り >別にExcelファイルを作って、 >必要最小限のコードで動作を確認して、上手くいってから実装するようにしましょう。 ですね…… アドバイスありがとうございます。 そのように心がけます。 本当にありがとうございました。
guest

0

ベストアンサー

部分一致で検索したいということでしょうか。
検索値が「5期」で「5期A1」「5期B1」にヒットさせたい。

だとしたら、 FindメソッドのLookAt引数にxlPartを指定しましょう。
指定を省略すると完全一致(xlWhole)になる可能性があります(検索ダイアログの設定を引き継ぐ)。

vba

1 Set rng = searchRng.Find(What:=gKi, LookIn:=xlValues, LookAt:=xlPart) 2

また、FindNextメソッドの引数には検索したセル(Rangeオプジェクト)を指定します。そのセルの次から検索するという意味になりますので。

vba

1Set rng = searchRng.FindNext(rng)

条件に当てはまるセルを検索する(Find/FindNext/FindPreviousメソッド) :Excel VBA|即効テクニック|Excel VBAを学ぶならmoug

投稿2021/12/03 09:11

編集2021/12/05 00:48
hatena19

総合スコア33795

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

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

ma2hiro

2021/12/06 02:02 編集

ありがとうございます。 Set rng = searchRng.FindNext(rng) としなければ次を検索と出来なかったのですね…… 勉強不足失礼しました。 ありがとうございました。 調べていた [【エクセルVBA】FindNextメソッドで指定範囲内の検索条件にヒットする値をすべて取得する方法 ](https://tonari-it.com/excel-vba-findnext-method/) にも Set rngSearch = myRange.FindNext(rngSearch) とか書いてありました…… 【Excel VBA入門】Findメソッドで条件に一致するセルを検索する方法 – Valmore https://valmore.work/find-cell-by-find/ にも ‘ 前回値が見つかったセルの次から検索 Set rng = .FindNext(rng) と書いてありますね…… ちゃんと読まなくて実装してお手数おかけして失礼しました。
ma2hiro

2021/12/06 05:00 編集

と思いましたが ``` [利益シート] に ``` 3期A+B 55 4期A+B 66 5期A+B 77 3期A+B 55 4期A+B 66 5期A+B 77 ``` と同じものがあった場合 Set rng = searchRng.FindNext(rng) で次のを探さない気がしますので調査方法をご助力頂けないでしょうか? TOPも追記しました。 お忙しい所大変申し訳無いのですが以上お問い合わせいたします。
ma2hiro

2021/12/07 05:17

と思いましたが =$B$8 とか指定していたので駄目だった模様…… とりあえず元excelの値コピーして対処します。 度々失礼いたしました。
hatena19

2021/12/07 06:05

回答のリンク先などで引数について調べてみてください。 下記の記述があるはずです。 LookIn 検索の対象を指定 数式(xlFormulas)、値(xlValues)、コメント(xlComments) 下記のように値で検索するようにすれば、=$B$8などと数式が設定してあってもヒットするはずです。 Set rng = searchRng.Find(What:=gKi, LookIn:=xlValues, LookAt:=xlPart)
ma2hiro

2021/12/07 06:20 編集

度々ありがとうございます。 せっかくご紹介して頂いたURLなのに じっくり見ていないため大変失礼しました。 そちらで実装してみます。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問