• ベストアンサー

ExcelVBA Findメソッドで検索のスタート位置について

おせわになっております。 Findメソッドを用いて、先頭から順に値を検索しようとしています。 Set rngSearch = rngList.Find("ゴルフ", rngSearch, , xlPart) ↑ このような方法で、該当するものを一つ一つ探そうとしています。 つまり、仮に一列目で見つかったら、次は二列目以降から探そうと しています。 FindNextなどを使用しないのは、連続で求めるためではなく、 ボタンを押したときに一つずつ検索するからです。 しかし、この書式ではスタート地点にした、次のセルから検索する はずが、スタート地点に指定したセルから検索してしまい、 何度行っても同じセルばかりを検索して返してしまいます。 Offsetなどで一行ずつずらしても、同じ場所からしか検索が 始まりません。 これはなぜなのでしょうか? 念のため、他のメソッドなどでは決してrngSearch は代入等の 操作はしておりません。 ちなみに、同じメソッドの中で同じ書式を繰り返すと   Set rngSearch = rngList.Find("ゴルフ", rngSearch, , xlPart) MsgBox rngSearch.Value   Set rngSearch = rngList.Find("ゴルフ", rngSearch, , xlPart) MsgBox rngSearch.Value   Set rngSearch = rngList.Find("ゴルフ", rngSearch, , xlPart) MsgBox rngSearch.Value   Set rngSearch = rngList.Find("ゴルフ", rngSearch, , xlPart) MsgBox rngSearch.Value   … うまくいくようなのです。一度でもメソッドを抜けるとうまくいか なくなるような感じです。 以上、わかりづらい説明で大変申し訳ありませんが、なにとぞお願い 致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • pulsa
  • ベストアンサー率57% (34/59)
回答No.5

pulsaです No.3の方のおっしゃるとおり、No.1の方への返答で示されたコード >Set rngList = .UsedRange.Columns(7) では、7列目しか検索対象になっていません これが、列が移動しない原因でしょう 簡単に言うと Columns(7).Select Set rngSearch = Selection.Find(stKeyword, rngSearch, , xlPart, xlByRows, xlNext) と変わりません Set rngList = .UsedRange で良いと思います(.UsedRangeが実際はなんなのか、は新たな謎ですが^^;) 他の部分はきちんとできているようなので、これだけで目的の動作が可能なはずです あとは、エラーをどうするかです 今回の場合、同じRangeが検索結果=他に見つかっていない はエラーです つまりNothing以外に、同じRangeが検索結果もエラーとして拾う必要があります 対応は簡単でしょう 検索結果をいきなりrngSearchにセットするのではなく、別な変数に入れておいて、『Is』でrngSearchと比較し、結果がFalseであれば、その時点でrngSearchにセットすればいい事です コードを示します Dim FindRange As Range Set FindRange = rngList.Find(stKeyword, rngSearch, , xlPart, xlByRows, xlNext) If Not (FindRange Is Nothing) And Not (FindRange Is rngSearch) Then   Set rngSearch = FindRange   Call review(rngSearch.Offset(0, -4)) End If 返答されたコードを変形しています Exit Subをそこかしこで使うのが好きでないので、Notで反転しています And を分解すれば、見つからない時と同じRangeを取ってきた時の動作を、別にする事ができます

tatapata
質問者

お礼

皆様、色々ありがとうございました。 本来は仕様とは違うのですが、Columns(7)を消したところ、 とりあえずスタートポイントの移動は確認できました。 一行単位での動作はいまだにおかしいままですが、とりあえず 目的は達成できたので、この質問は終了させていただきます。 本当にありがとうございました。

tatapata
質問者

補足

回答していただいた皆様方、何度もありがとうございます。 私の説明の悪さで誤解をさせてしまい、本当に申し訳ありません。 まず、私の表現で勘違いしていまして、列と行を間違えていました。 要は、縦一行の中で検索したいため、特定の七列目のみで検索を かけています。その為、余計なColumnに検索が移らぬよう、Columns(7) で絞り込みをしています。 その処理の中で、いちばん上のセルから検索し、仮に二番目に 見つかったら、次は三番目のセルから再び検索…ということを 行っているつもりです。 ためしに、検索をする先頭セルを、下に一つずらして処理させて みると、一回目はうまくいって次のセルに移るのですが、二回目以降は やはり動かずに同じセルばかり拾ってきてしまいます。 …これは何となくですが、なんか固定で『2』行目から検索を 始めているような感じに思えます…が、それはただの 思いすごしでしょうか^^; Findメソッドの説明には、二番目の引数、Afterには、そこで指定した 『次のセル』から検索とありますので、その通りで行くと、コードとしては間違っていないとは思ったのですが…、うまくいきませんでした。 一応Offsetして確かめてみたコードを再度掲載します。 たびたびすみませんが、再びお力添えを何卒お願いいたします。 'フォーム初期化時 With ThisWorkbook.Worksheets("Data") Set rngList = .UsedRange.Columns(7) Set rngSearch = rngList.Cells(1, 1) End With Private Sub searchKeyword() If (Me.fldSummary.Text = "") Then Exit Sub End If Dim stKeyword As String stKeyword = Me.fldSummary.Text With ThisWorkbook.Worksheets("Data") ' Set rngSearch = rngList.Find(stKeyword, rngSearch, , xlPart, xlByRows, xlNext) Dim rngBuff As Range Set rngBuff = rngList.Find(stKeyword, rngSearch.Offset(1, 0), , xlPart, xlByRows, xlNext) If (rngBuff Is Nothing) Then MsgBox "見つからないよ" Exit Sub End If Set rngSearch = rngBuff 'Call review(rngSearch.Offset(0, -4)) End With End Sub

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.4

質問と補足から、以下のような話でしょうか? 何かすると(たとえばシートの検索のコマンドボタンを押すと)、ユーザーフォームを表示する。 テキストボックスとコマンドボタンがある。 テキストを入力してコマンドボタンを押すと次々に検索する。 違ったら読み飛ばしてください。 ユーザーフォームのモジュール部に、確認用などで若干追加しましたが、補足で書いてあるプログラムをできるだけそのまま書いてみました。 ユーザーフォームにはテキストボックス(fldSummary)とコマンドボタン(CommandButton1)があるとします。 で、動いてるみたいなんですが・・・ どこか間違ってますか? Option Explicit Dim rngSearch As Range Dim rngList As Range Private Sub UserForm_Activate() With ThisWorkbook.Worksheets("Data") .Activate '後で確認のためselectするので一応Activateにしておきます Set rngSearch = .UsedRange.Columns(7).Cells(1, 1) Set rngList = ThisWorkbook.Worksheets("Data").UsedRange.Columns(7) End With End Sub Private Sub CommandButton1_Click() searchKeyword End Sub Private Sub searchKeyword() If (Me.fldSummary.Text = "") Then Exit Sub End If Dim stKeyword As String stKeyword = Me.fldSummary.Text With ThisWorkbook.Worksheets("Data") Set rngSearch = rngList.Find(stKeyword, rngSearch, , xlPart, xlByRows, xlNext) If (rngSearch Is Nothing) Then MsgBox "ありません" '無かった場合、一応黙っているのは何なので Set rngSearch = ThisWorkbook.Worksheets("Data").UsedRange.Columns(7).Cells(1, 1) 'Nothingのままだと次の検索でエラーになるので Exit Sub End If 'Call review(rngSearch.Offset(0, -4)) rngSearch.Select 'とりあえず選択部を表示 End With End Sub

tatapata
質問者

補足

fumufumu_2006さん、ありがとうございます。 ほぼ、記述してある通りです。 この通りでうまくいくはずなのですが…。 うまくいきません。 何かお心当たりがありましたら、ぜひお力添えをお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

最初の質問文で >仮に一列目で見つかったら、次は二列目以降から探そうとしています。 とあります。 ANo.1の補足に >それ以外の場所では、前回記述したメソッド以外では、 >rngList、及びrngSearchともに使用しておりません。 とあります。 rngListが固定なら、常に 7 列目しか検索してくれません。 7列目に検索値が1つしかないという事は考えられないのですか? >ちなみに、同じメソッドの中で同じ書式を繰り返すとうまくいくようなのです。 と書いてありますので、そのケースはないのかもしれませんが念の為。 また、検証するにはごくシンプルなコードでテストしてみる事が必要でしょう。 例えば、メソッドを抜けても次検索できる例をANo.1で提示しました。 新規Bookに適当なデータを入れて、標準モジュールに置いて試してみると良いと思います。 うまく動くようなら、問題のコードでは変数の初期化が関係している可能性が大きいと思うのですが。 (変数の初期化は明示的に = Nothing とするだけでなく、何らかのタイミングで破棄される事も含みます) [VBA] Public 宣言された変数の有効期間 http://support.microsoft.com/kb/408871/ja ただ、rngSearch が初期化されてNothingであれば検索時にエラーがかかるはずなのです。   With ThisWorkbook.Worksheets("Data")     MsgBox rngSearch.Address     Set rngSearch = rngList.Find(stKeyword, rngSearch, , xlPart, xlByRows, xlNext) (エラー制御されていなければ。) もし、変数初期化が関係しているなら、検索結果アドレスをどこかに記録しておくようにすれば良いです。 それは Private Sub UserForm_Initialize()   With ThisWorkbook.Worksheets("Data")     Set rngSearch = .UsedRange.Columns(7).Cells(1, 1)     Me.Tag = rngSearch.Address : Private Sub searchKeyword()   If (Me.fldSummary.Text = "") Then     Exit Sub   End If   Dim stKeyword As String   stKeyword = Me.fldSummary.Text   With ThisWorkbook.Worksheets("Data")     Set rngSearch = rngList.Find(stKeyword, .Range(Me.Tag), , xlPart, xlByRows, xlNext)     If (rngSearch Is Nothing) Then       Exit Sub     End If     Me.Tag = rngSearch.Address : こんな感じで、UserFormのTagプロパティを使っても良いですし、 ダミーな非表示シートのセルにアドレスを書き込んだりしても良いかと思います。

tatapata
質問者

補足

end-uさん、たびたびありがとうございます。 上記の方法でも試してみましたが、やはりうまくいきません。 どうしても二行目で止まってしまいます(二行目に該当データがあると ずっと二行目ばかり返す)。 ちなみに、行と列の言葉を組みちがえていました。 大変申し訳ありません。 引き続き、お力添えをいただければ幸いです。

全文を見る
すると、全ての回答が全文表示されます。
  • pulsa
  • ベストアンサー率57% (34/59)
回答No.2

Findは、Rangeのプロパティのひとつと考えると良いと思います つまり、探すんではなく、有るところを教えてくれます これが、戻り値がRange『Object』で帰る理由です(無いときはNothing) ご質問の場合、No.1の方がおっしゃるとおり これだけの情報では判断が難しいです 上に書いたとおり検索範囲のRangeの内、最初に該当するRangeを返すので、ご質問の内容は最初に見つけた"ゴルフ"のRangeを返します つまりセルを教えてくれるだけ、です ですので、実行中のメソッドで複数呼ぶ(この場合、rngSearchが生きてる間と解釈してもOK)と成功するのに、メソッドを抜けると上手く行かないとなります 理由は rngSearch がクリアされる為で、Findの引数でAfterが省略されているときは、指定範囲の左上から検索するとなっています。(因みにNullの場合も左上が検索開始位置になる) 回避方法はいくつかありますが、まず rngSearch に値が入った直後に、Actveにする方法があります ただ、この方法は当然、該当セルが存在しない場合、エラーです ですので、次のようにします おそらく現状 rngList には Cells か、ざっくりしたRange(行列複数)が指定してあるように思いますが、質問からすると列ごとに検索していくようですので、それであれば rngList を検索が成功するたびに、1列ずつずれるように指定するほうがいいでしょう コードを示します   Dim rngSearch   Set rngSearch = Columns(1).Find("ゴルフ", , , xlPart) '一回目   If Not rngSearch Is Nothing Then     Set rngSearch = Columns(2).Find("ゴルフ", rngSearch, , xlPart) '二回目     If Not rngSearch Is Nothing Then       Set rngSearch = Columns(3).Find("ゴルフ", rngSearch, , xlPart) '三回目       ・       ・       ・     End If   End If ただ、これでは面白くありませんので   Dim rngSearch   Dim iCnt As Integer     Set rngSearch = Columns(1).Find("ゴルフ", , , xlPart) '一回目   If Not rngSearch Is Nothing Then     MsgBox rngSearch.Value     For iCnt = 2 To Range("A1").CurrentRegion.Columns.Count       Set rngSearch = Columns(iCnt).Find("ゴルフ", , , xlPart) '二回目以降       If Not rngSearch Is Nothing Then         Exit For       Else         MsgBox rngSearch.Value       End If     Next iCnt   End If Findは意外と難しく、ハマるんですが、Forなんかよりかなり高速化できますので、使いこなせれば強力な武器になります がんばれ!

tatapata
質問者

補足

pulsaさん、ありがとうございます。 1の方にもお返事をしたのですが、rngList,rngSearchは外部で 宣言し、Form_Loadでその値を設定した後、他では決して 操作していません。 フォームを閉じたりしない限りは、外部変数は初期化されないと 思うのですが…。 いただきましたサンプルを元に、いろいろと調べてみますが、 もう少しお力添えいただければ幸いです。 念のため、メソッドを書き込みます。 Private Sub searchKeyword() If (Me.fldSummary.Text = "") Then Exit Sub End If Dim stKeyword As String stKeyword = Me.fldSummary.Text With ThisWorkbook.Worksheets("Data") Set rngSearch = rngList.Find(stKeyword, rngSearch, , xlPart, xlByRows, xlNext) If (rngSearch Is Nothing) Then Exit Sub End If Call review(rngSearch.Offset(0, -4)) End With End Sub 以上、よろしくお願い申し上げます。

全文を見る
すると、全ての回答が全文表示されます。
  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

こんにちは。 それだけの情報では判断が難しいです。 最初の >Set rngSearch = rngList.Find("ゴルフ", rngSearch, , xlPart) 引数Afterの rngSearch はどのようにSetされているのですか? Option Explicit Dim rngSearch As Range Dim rngList  As Range Sub try()   If rngList Is Nothing Then     Set rngList = ActiveSheet.UsedRange   End If   If rngSearch Is Nothing Then     Set rngSearch = rngList.Cells(1)   End If   Set rngSearch = rngList.Find("*", rngSearch, , xlPart)   MsgBox rngSearch.Value End Sub もし、こういう使い方なら、モジュールレベルの変数が初期化されるような処理がどこかにないですか?

tatapata
質問者

補足

end-uxyさん、ありがとうございます。 説明が不足しており、大変申し訳ありません。 rngList及び、rngSearchは、Form_Loadの時点で 外部変数としてセットしています。 With ThisWorkbook.Worksheets("Data") Set rngSearch = .UsedRange.Columns(7).Cells(1, 1) Set rngList = .UsedRange.Columns(7) End With 上記の記述で、Columns一行分を範囲として取得し、その先頭を rngSearchの起点としてセットしています。 それ以外の場所では、前回記述したメソッド以外では、 rngList、及びrngSearchともに使用しておりません。 以上、なにとぞお願い申し上げます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excel VBAのFindメソッドについて

    Excel VBAを勉強中の者です。 Findメソッドで、数字の入ったF5セルからF28セルの範囲から、 1という数字の入ったセルを検索したいと思い Sub test() Dim xRange As Range Set xRange = Range("F5:F20").Find(What:=1, LookIn:=xlValues)   xRange.Select End sub としました。 しかし、このまま検索するとF6セルの12が検索されてしまいます。 他の数字では問題なく、対象の数字の先頭の数字が選択されます。 どうしてでしょうか? よろしくお願いします。

  • Findステートメントで別なブックの検索

    Findステートメントで検索した内容のある行のA列にある値をキーワードとして別なブックのA列に検索をかけてヒットしたセルの内容を元のブックの指定したセルに移すという動作をさせたいので次ののように書いてみました。 Private Sub CommandButton2_Click() Dim Yline As Long Dim No As Variant Dim c As Range Dim sh As Worksheet Dim sh_no As Integer Dim findcell As Range Dim add As String Set sh = Worksheets("ブックAの1") No = TextBox1.Text sh_no = 1 'テキストボックスに値が入っていた場合 If No <> "" Then 'Find メソッドの最低のプロパティは入れる。SearchOrder は特にいらない Set c = sh.Range("B:B").Find( _ What:=No, _ LookIn:=xlValues, _ LookAt:=xlPart, _ Searchorder:=xlByRows) '見つかった場合にのみ、値を入れる If Not c Is Nothing Then Yline = c.Row '見つかった行のA列の文字列でブックBに検索をかける add = sh.Cells(Yline, 1).Value Workbooks("B").Activate Set findcell = Workbooks("B").Worksheet(sh_no).Range("A:A").Find( _ What:=add, _ LookIn:=xlValues, _ LookAt:=xlPart, _ Searchorder:=xlByRows) '前Setステートメントからのループ検索開始 If findcell Is Nothing Then Do sh_no = sh_no + 1 If sh_no > ThisWorkbook.Worksheets.Count Then Exit Sub End If Set findcell = Workbooks("B").Worksheets.(sh_no).Range("A:A").Find( _ What:=add, _ LookIn:=xlValues, _ LookAt:=xlPart, _ Searchorder:=xlByRows) Loop While findcell Is Nothing End If End If Workbooks("A").Activate With Worksheets("Aの2")   .Cells(21, 4).Value = sh.Cells(Yline, 14).Value .Cells(20, 4).Value = sh.Cells(Yline, 15).Value .Cells(36, 4).Value = findcell End With Unload Me Else MsgBox No & " は見つかりません。", 48 End If Set sh = Nothing End Sub するとwhat:=addとしてaddが見つかるまでシート番号を増やしていくループのところでエラーがでてキーワードが見つからないと出ます。恐らくブックBを検索してくれているとは思うのです。A列に空白があるためかと思い埋めてみましたが関係ないようです。 構文エラー的なものは無いと思いますが、宜しくお願いします。

  • ExcelVBAのFind関数について質問です。

    Find関数を使用して検索を行う際に、検索対象のシートに"ヶ月"、"ヵ月"という文字が記載されていると 処理が遅くなってしまします。 解決方法をご存知の方いらっしゃいますでしょうか? 以下、読みにくいプログラムかもしれませんが、ご教授願います。 Sub ボタン1_Click() Dim value As String Dim pass As String Dim template As Workbook Dim object As Object '検索対象文字 value = "A" 'テンプレートのパス pass = "C:\template.xls" 'テンプレートを開く Set template = Workbooks.Open(pass) 'テンプレートをコピー ActiveWorkbook.Sheets.Copy 'テンプレートを閉じる template.Close saveChanges:=False With ActiveWorkbook.ActiveSheet.Range(Cells(1, 1), Cells(10000, 256)) 'テンプレートにAという文字が存在するかのチェック Set object = .Find(What:=value, LookAt:=xlPart, SearchOrder:=xlByRows) Do '存在しない場合は処理を終了 If object Is Nothing Then End '存在する場合はA→Bに置き換える Else object = Replace(object, value, "B") End If '引き続きSheet2にAという文字が存在するかのチェック Set object = .Find(What:=value, LookAt:=xlPart, SearchOrder:=xlByRows) Loop While Not object Is Nothing End With End Sub

  • エクセルVBAの連続検索

    エクセルVBAで、textbox内に入力した参加者の名前を検索しチェックを入れる作業を行いたいです(集会の受付名簿用)。findnextを使っても無限にループするか、同姓の最初の一人しか検索できずに困っています。 Dim 検索セル As Range Dim 最初のセル As String Dim 次の候補 As Range 検索対象文字 = Range("h2").Value Set 検索セル = Range("a5:B100").Find(検索対象文字) If Not 検索セル Is Nothing Then 最初のセル = 検索セル.address Do 検索セル.Select Set 次の候補 = Range("a5:b100").FindNext(after:=検索セル) Loop Until 次の候補.address = 最初のセル End If 手直しをお願いしますTT

  • エクセル マクロ 検索

    お世話になります。 範囲がA2からK221までの表があります。 検索して検索されたセルの左のセルを表示するマクロを組みたいのですが、検索する文字(数値)はE1に、検索結果はK1に表示するようにするにはどのようにしたらいいでしょうか? Sub FIND_DATA1() ' FIND_DATA1 Macro ' マクロ記録日 : 2006/9/1 ユーザー名 : ' Cells.Find(What:=Range("E1").Value, After:=ActiveCell, lookAt:=xlWhole).Activate End Sub Sub Data_Find3() Dim 対象セル As Range Dim 最初のセル番地 As String Dim 検索件数 As Long Cells.Interior.ColorIndex = xlNone If Range("E1").Value = "" Then Exit Sub End If Set 対象セル = Cells.Find(What:=Range("E1").Value, After:=ActiveCell, lookAt:=xlWhole) 最初のセル番地 = 対象セル.Address Do 対象セル.Interior.ColorIndex = 37 検索件数 = 検索件数 + 1 Set 対象セル = Cells.FindNext(対象セル) Loop While 対象セル.Address <> 最初のセル番地 MsgBox "検索件数は" & 検索件数 - 1 & " 件です" End Sub 本を見たり調べたりでここまでできたんですがこれだと検索件数、検索結果が色付きになるだけで使い勝手がいまいちです。 よろしくお願いします。

  • FIND関数について教えてください

    EXCEL VBAを使って、検索ツールを作成中です。 1,sheet1のセルA1に入力されたものをsheet2,3の特定の列から検索して、結果のすべてをsheet1 A2以下に表示する。 2,1の検索結果(A2以下)をそれぞれsheet2,3から更に検索する。  ※sheet2,3のA列からsheet1A1を検索し、同じ行のC,D列のデータをsheet1A2以下に持ってくる  ※A2以下の検索結果は複数。sheet2,3のA列からsheet1A2以下を検索し、C列から横に更なる検索結果があればそれを表示して行きたい。 まず書いたのは下記のようなもの Sub 検索() Dim FoundCell As Range, FirstCell As Range Set FoundCell = Cells("A:A") .Find(What:=sh1.range("A1").value) If FoundCell Is Nothing Then MsgBox "見つかりません" Exit Sub Else Set FirstCell = FoundCell FoundCell.Resize(1, 2).Copy Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Do Set FoundCell = Cells.FindNext(FoundCell) If FoundCell.Address = FirstCell.Address Then Exit Do Else FoundCell.Resize(1, 2).Copy Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Loop End Sub 検索1()として If FoundCell Is Nothing Then MsgBox "見つかりません" Exit Sub を、 If FoundCell Is Nothing Then 検索2 と表記を変えて実行したのですが、見つからなかった場合、「見つかりません」のメッセージと共に「実行エラー5」で「 Set FoundCell = Cells.FindNext(FoundCell)」が示されます。 また、A2以下という曖昧な検索セルを指定する方法が分かりません。  set str=sheet1.Cells(i,1).value というようなこともしてみたのですが、エラーになってしまいました。 なにかアイディアを教えてください。

  • マクロのFINDメソッドで質問です。

    マクロの初心者で、いつもお世話になっております。 FINDメソッドを使って別々のシートから同じIDを探す処理をしたいのですが、IDが片方にしか無い場合に検索2rangeが"nothing"になってしまい止まってしまいます。 抜粋ですか以下の様にコーディングしました。 解る方がいましたらアドバイスをお願いします。 IDはIDがセットされている列です。 シート2を上から1つずつ見ていき、 シート1から該当するIDを探す処理をします。 最終的には該当したIDの行数を記憶して、 シート1とシート2をマッチングさせたいのですが。 Dim 検索range As Range Dim 検索2range As Range ID = Sheet2.Cells(LOOP_C1, 検索列).Value Set 検索Range = Range(Sheet1.Cells(F2TOP,検索列),Sheet1.Cells(LASTRow, 検索列)) Set 検索2range = 検索Range.Find(What:=ID, LookAt:=xlWhole, SearchOrder:=xlByRows, searchformat:=True).Row ※ If 検索2range Is Nothing Then Else   検索2range.Activate End If ・ ・ ・ ※の箇所で止まってしまいます。

  • Excel VBA Findで日付だけのセルが検索できない

    日付のセルを検索するために、以下のような処理をさせていますが、日付だけのセルが検索できません。  【例】(1)は検索できますが、(2)が検索されません。    (1) 2010/03/05が誕生日    (2) 2010/03/05    (※(1)、(2)共に検索できるようにしたいと思っています。) Dim FoundCell as Variant Dim search_words as String search_words = "20??/*/" Set FoundCell = Cells.Find(what:=search_words,After:=ActiveCell, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False) ※Excel2003を使用しています。

  • Find関数内にFind関数をかける場合

    エラー91が発生し、手詰まりです。 どなたかご教授お願いいたします。 Find関数でDo~lppoを行い、初期の検索結果アドレスでLoopを抜けようと思ったのですが。。 エラーしてしまいました。 Find関数内にFind関数を用いることが出来ない と目にしたのですが。 下記のようなVBAの場合 どのように対処したらいいでしょうか? また、VBA初心者のため VBA文が見づらかったり、おかしなところがあると思います。 その部分についても教えて頂けたらと思います。 Sub SAMPLE() Dim TargetDE As String '文字列型 Dim TargetNo As String '文字列型 Dim PODate As String '文字列型 Dim FoundCell As Range ' Dim FoundDate As Range Dim FoundCellNo As Long '長整数型 Dim FoundDateNo As String Dim SearchArea As Object 'オブジェクト型 Dim tar_obj(1) As Object 'オブジェクト型 Dim Addr As String '文字列型 Dim Lastrom As Long ' Dim POLEFT As Range '検索文字列入力(DE) TargetDE = Application.InputBox("Fill in a DE:??", "DE:??", Type:=2) If TargetDE = "False" Then Exit Sub '検索対象範囲 Set SearchArea = Workbooks("Sample sample.xlsx").Sheets("Sample") Set tar_obj(1) = Workbooks("INPUT FORMAT.csv").Sheets("INPUT FORMAT") '表示先をクリア tar_obj(1).Cells(1, 1).CurrentRegion.ClearContents '検索実行 Set FoundCell = SearchArea.Range("C:C").Find(What:=TargetDE, LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) '検索文字列(DE)を含むセルがない場合は終了 If FoundCell Is Nothing Then Exit Sub '検索文字列入力(DE Number) TargetNo = Application.InputBox("Fill in DE nomber", "Nomber", Type:=2) If TargetNo = "False" Then Exit Sub '最初の検索結果の行数を格納 Addr = FoundCell.Address '検索文字列入力(PO Date) PODate = Application.InputBox("Fill in Sample Date", "Date", Type:=2) If PODate = "False" Then Exit Sub Do '検索Cell右横の値がTargetNoと同じ場合 If FoundCell.Offset(0, 1).Value = TargetNo Then '行番号を代入 FoundCellNo = FoundCell.Row '検索の下限値を変数に代入 F_LAST = FoundCellNo + 50 '検索実行 Set FoundDate = SearchArea.Range(SearchArea.Cells(FoundCellNo, 1), SearchArea.Cells(F_LAST, 1)).Find(What:=PODate, LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) '検索文字列を含むセルがない場合は終了 If FoundDate Is Nothing Then 'MsgBox "Find is mistake" '検索文字列を含むセルがある場合 Else '変数に行番号代入 FoundDateNo = FoundDate.Row If FoundDate.Offset(1, 1).Value = "" Then MsgBox "The position of the cell is not correct. Please coordinate macro. " Else POLEFT = FoundDate.Offset(1, 1) For i = 2 To 13 If FoundDate.Offset(1, i) <> 0 Then If FoundDate.Offset(1, i) <> "." Then If IsNumeric(FoundDate.Offset(1, i).Value) = True Then '表示先(INPUT FORMAT)の行数をカウントアップ cnt = cnt + 1 PORIGHT = FoundDate.Offset(1, i).Value tar_obj(1).Range("E" & cnt) = POLEFT & PORIGHT End If End If End If Next i End If End If ElseIf FoundCell.Offset(0, 1) <> TargetNo Then ' MsgBox "Find is mistake" End If '次の検索を実行 Set FoundCell = SearchArea.Range("C:C").FindNext(After:=FoundCell) Loop While Not FoundCell Is Nothing And FoundCell.Address <> Addr ' If FoundCell.Offset(0, 1) <> TargetNo Then ' MsgBox "Not Find Number" ' End If End Sub

  • VBAのfindメソッドでセルの"先頭の"特定の文字のあるセルを検索したい。

    下記に示すようなテキストがワークシート(Sheet1)に 貼り付けてあります。 (Sheet1) A1:第一条  この法律は平和の為にある。 A2:第二条  この法律は戦争反対。 A3:2  すごいぞ日本。 A4:第二条の二  がんばれ日本。 A5:一  第二条は多分最強。 これから、【先頭が】"第*条*" というセルのみを検索したくて 以下のようなFindメソッドを組みました。 Sheets(Sheet1").Columns(1).Find("第*条*") ところが、結果として抽出されるのは 第一条  この法律は平和の為にある。 第二条  この法律は戦争反対。 第二条の二  がんばれ日本。 一  第二条は多分最強。 と、セルの先頭以外に"第*条*"が存在するセルも検索してしまいます。 検索結果が 第一条  この法律は平和の為にある。 第二条  この法律は戦争反対。 第二条の二  がんばれ日本。 となるようにするには、Findメソッドをどのように 組めばよいのでしょうか? どなたがご指導をお願い致します。

このQ&Aのポイント
  • 【MFC-J737DWN】で使えるスターターインクをなくしてしまったときの対処法を教えてください。
  • Windows10を使用している環境で、【MFC-J737DWN】のスターターインクをなくしてしまった場合、どのように復旧すれば良いのでしょうか。
  • 【MFC-J737DWN】のスターターインクをなくしてしまった場合、ひかり回線を使用している場合でも対応可能な方法があるのでしょうか。
回答を見る