お世話になっております。
自分で実装して納得出来てから実際のものに組み込みたいと思っております。
excel
1 5期 2 5期A 3 5期B 4 5 4期A 6 5期A+B
vba
1Option Explicit 2Dim year, month, kikawarime As Integer, gKi As String 3Private Function getTounenndoGyou() As Variant 4 Dim tmp As Integer 5 Dim rng As Range, tempRng As Range, searchRng As Range 6 tmp = year - 2015 7 gKi = Str(tmp) & "期" 8 gKi = Replace(gKi, " ", "") 9 Dim kiGyouArray(7), i As Integer 10 Set searchRng = Range("B5:B99") 11 ' 最初はFindで検索 12 Set rng = searchRng.Find(What:=gKi, LookAt:=xlPart) 13 ' 検索結果を一時保存 14 Set tempRng = rng 15 i = 1 16 ' 条件にあったセルが見つからなければNothingが返るので何もしません 17 Do While Not rng Is Nothing 18 Debug.Print rng.Row 19 kiGyouArray(i) = rng.Row 20 i = i + 1 21 ' FindNextで検索を継続 22 Set rng = searchRng.FindNext(rng) '←←←←←←←←←←←これでどう???rng付けた 23 ' すべて検索し終えると最初に戻るので、Addressで確認! 24 ' これを忘れると無限ループになるので注意! 25 If rng.Address = tempRng.Address Then 26 Exit Do 27 End If 28 Loop 29 getTounenndoGyou = kiGyouArray 30End Function 31 32 33'================================ 34' B列の”5期hogehoge”の行を返す 35'================================ 36Sub ボタン1_Click() 37 year = 2020 38 month = 9 39 Dim tounendoGyou() As Variant 40 tounendoGyou = getTounenndoGyou 41End Sub 42
上記
tounendoGyou = getTounenndoGyou
のVBAを動作したところ
5期A+B
のある7(行目)しか帰って来ませんでした……
5期 5期A 5期B
を見つけてくれないのでどうしてかと
Set rng = searchRng.Find(What:=gKi, LookAt:=xlPart)
でxlPart を指定しているのですが正解だと思います……
もしかしてexcel内の指定で下から上への検索が有効になっているのかと勝手に思ってしまったのでお問い合わせいたします。
FindNextの指定方法で下から上と明示的に指定する方法をご教授頂けないでしょうか?
それとも考え方まるっと違っていて
上記ソースの訂正方法をアドバイス頂けないでしょうか?
本当にお忙しい所大変申し訳無いのですがご助力頂けますと嬉しく思います。
FindNext、日本語だと「次を検索」って名称から、その逆や他のFindは無いか、と考え至れば、Rangeオブジェクトのドキュメントのメソッドからすぐ探せるのではないでしょうか。
前回のあなたの質問で、hatena19さんの紹介しているページで検索のパターンも何種類か載っていますが、もし読んでたらそもそもこういう質問出てこないと思うんですけど。
1行ずつ実行していけばどのように動作しているかわかると思うのですが・・・
radian様
https://www.moug.net/tech/exvba/0050116.html
にはFindPreviousとありますね……
何故最終行しか検索で引っかからなかったのか謎なのです……
bebebe_様
すいません。
一行ずつ実行していっても
Set rng = searchRng.FindNext(rng)
で同じ所しか見つけてくれないのです……
皆様のお叱りは重々承知なのですが頼れる所がこちらしか思いつかないのです……
ご助力頂けますようお願い申し上げます。
> 一行ずつ実行していっても
> Set rng = searchRng.FindNext(rng)
> で同じ所しか見つけてくれないのです……
そりゃコード変えてないなら、同じ動きになるのは当たり前でしょう。一行づつ実行して期待通りの動きをしない行を探し、変数の値を見ておかしい所が無いか確認して、自分の期待する動きになるよう修正するという事です。(俗にいうデバッグ)
teratailではデバッグは非推奨質問なので、最低限自分で調査出来る事くらいはやってください。
コードを丸投げして、答えを貰いに来る場所じゃありません。
[推奨していない質問]
https://teratail.com/help/avoid-asking
[1-1. teratailはサポートセンターではなく、思考するエンジニアの為のQ&Aコミュニティです]
https://teratail.com/help/question-tips#questionTips1
> teratailを「サポートセンター」だとは思わないでください。
> 作業依頼のような投稿をして、課題や仕事を無償でやってもらえる場ではありません。
radian様
仰る通りですね……
```
gKi = Str(tmp) & "期"
gKi = Replace(gKi, " ", "")
Set searchRng = Range("B5:B99")
' 最初はFindで検索
Set rng = searchRng.Find(What:=gKi, LookAt:=xlPart)
```
で何故か”5期A+B”しか見つけてくれないので
そこが怪しいので見てみます。
ウォッチウィンドウを使っていますか?
[VBEの使い方:ウォッチ ウィンドウ|VBA入門 - エクセルの神髄]
https://excel-ubara.com/excelvba1/EXCELVBA488.html
"VBA ウォッチ" とかで検索したら他にも記事が出てくるので、読んでみて下さい。
(まずこれが使えないと厳しい)
どこで「5期A+B」しか見つけてないと判断されていますか?
Debug.Print rng
等ですかね?
それでうまく行っていないならシートのB1から入力していたりしませんか
radian 様
もちろんウォッチウィンドウは使用して追っております……
bebebe_様
分かりました!!!!!!!!!!!!!!!!!
Set searchRng = Range("B5:B99")
とやっていたため
Set searchRng = Range("B1:B99")
とすれば解決しました。
ありがとうございました。この質問そのうち閉じます。
本当にありがとうございました。
回答1件
あなたの回答
tips
プレビュー