• ベストアンサー

FINDで複数ヒットする場合

EXCELで 範囲(A1:J2)で「東京」が存在する最初の列番号は以下で求められますが 範囲内には、他にも「東京」が複数ヒットします。 その場合は、どのようなコードになりますか ? 作業手順として考えたのは 最初に見つけた「東京」の次の列からを検索範囲に変更して次の「東京」をFIND 同じように検索範囲を次々と変更して最終的に「東京」が見つからなかったらFINDを終了すれば良さそうですが? 又、 他に良いコードがあれば教えてください。 Sub FindColumns() Dim searchString As String Dim searchRange As Range Dim foundCell As Range Dim columnNumbers As String ' 検索する文字列を指定 searchString = "東京" ' 検索範囲を指定 Set searchRange = Range("A1:J2") ' 検索を実行 Set foundCell = searchRange.Find(What:=searchString, LookIn:=xlValues, LookAt:=xlPart) If foundCell Is Nothing Then MsgBox "「東京」が見つかりませんでした。" Else MsgBox "ヒットした列番号: " & foundCell.Column End If End Sub

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.10

質問のコードで試すのでしたら A1とA3に東京と入れて 質問のコードで after:=Range("J2") を付けるか付けないかで実行して結果を見て、違いがあればFind.Nextとafterとは無関係ということになります。 回答No.6の補足のテストデータですが、同じデータを下にコピーしているので〇の位置が変化していません。 15行目の9/1が2行目の○がヒットした結果なのか5行目の○がヒットした結果なのか…。 after:=Range("J4")を外して違いが出なければいいですね。

その他の回答 (15)

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.16

>  私の利用している「エクセルの学校」で紹介されたVBAコードを記載します。 なるほど、便利なものがあったのですね。 クリップボード送りはなくてもいいかなと思ってたのですが、計算式までとかは思いつきませんでした。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.15

勝手に回答欄で遊んでいるコードの訂正です。 If IsDate(c.Value) = True Or IsNumeric(c.Value) = True Then mLen = Len(c.Text) Else mLen = LenB(StrConv(c.Text, vbFromUnicode)) End If のところは mLen = LenB(StrConv(c.Text, vbFromUnicode)) に訂正です。 ふと時間が2023年9月2日みたいに半角全角が混ざっていたら駄目じゃないかと調べたら最初のままだとうまくいかず、訂正したほうがいい感じです。

NuboChan
質問者

お礼

kkkkkmさん、便利なコードを作成いただき感謝いたします。 以下について  私の利用している「エクセルの学校」で紹介されたVBAコードを記載します。  (「エクセルの学校」 >セル上でVBAで成型したものを手動でエディタにコピペするようにしたら楽そうと思って挑戦。 シートレイアウトの投稿どうしてますか? https://www.excel.studio-kazu.jp/kw/20110209184943.html レイアウトでは、計算式も書き出せるのでとても便利に利用させていただいてます。 後添付された画像を分かりやすくするために画面キャプチャーソフトを併用しています。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.14

必要かどうかもわからないのにやたら追加してすみません。 よく考えたら、余分なセルを変更しても必要な部分だけコピペすればいいのですからUsedRangeを使えばいいような気がしました。 何も入力されていないシートのB2からデータを貼り付けてあとは単に実行してください。 前回のように最後の列を選択とかはありませんし、A列の番号も入れなくていいです。 実行時にどこのセルを選択していてもいいです。 Sub TestUsedRange() Dim c As Range Dim i As Long Dim MaxLen As Long, mLen As Long Dim LastRow As Long, LastColumn As Long, mColumn As Long LastRow = UsedRange.Rows(UsedRange.Rows.Count).Row LastColumn = UsedRange.Columns(UsedRange.Columns.Count).Column Cells(1, 1).Value = " " For i = 2 To LastRow Cells(i, 1).Value = "[" & i - 1 & "]" Next For mColumn = 1 To LastColumn MaxLen = 0 If mColumn <> 1 Then Cells(1, mColumn).Value = "[" & Chr(63 + mColumn) & "]" End If For Each c In Range(Cells(1, mColumn), Cells(LastRow, mColumn)) If IsDate(c.Value) = True Or IsNumeric(c.Value) = True Then mLen = Len(c.Text) Else mLen = LenB(StrConv(c.Text, vbFromUnicode)) End If If MaxLen < mLen Then MaxLen = mLen End If Next For Each c In Range(Cells(1, mColumn), Cells(LastRow, mColumn)) If IsDate(c.Value) = True Or IsNumeric(c.Value) = True Then mLen = Len(c.Text) Else mLen = LenB(StrConv(c.Text, vbFromUnicode)) End If If MaxLen > mLen Then c.Value = c.Text & String(MaxLen - mLen, " ") & "|" Else c.Value = c.Text & "|" End If Next Next

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.13

勝手に作成した変更用VBAです。 変更後にコピペでエディタに貼り付けてください。TABが入ると思いますのでエディタで置換して削除してください。 A2に ="[" & ROW(A1) & "] |" として10行目までコピー A11に ="[" & ROW(A10) & "]|" として適当な行数分コピー して行数部分を作成しておいてください。 列の[A][B]などはVBAで記載しますので1行目は未入力で。 B2から元のデータを貼り付けてください。 データを変更したい列の右端のどこかのセルを選択してから実行してください。 2列目から選択しているセルの列までデータを変更します。 CurrentRegionとかUsedRangeで範囲決定しようかと思いましたが、A列が入ってしまいそうなので利用してません。 Sub Test() Dim c As Range Dim i As Long Dim MaxLen As Long, mLen As Long Dim LastRow As Long, mColumn As Long For mColumn = 2 To Selection.Column If LastRow < Cells(Rows.Count, mColumn).End(xlUp).Row Then LastRow = Cells(Rows.Count, mColumn).End(xlUp).Row End If Next For mColumn = 2 To Selection.Column MaxLen = 0 Cells(1, mColumn).Value = "[" & Chr(63 + mColumn) & "]" For Each c In Range(Cells(1, mColumn), Cells(LastRow, mColumn)) If IsDate(c.Value) = True Or IsNumeric(c.Value) = True Then mLen = Len(c.Text) Else mLen = LenB(StrConv(c.Text, vbFromUnicode)) End If If MaxLen < mLen Then MaxLen = mLen End If Next For Each c In Range(Cells(1, mColumn), Cells(LastRow, mColumn)) If IsDate(c.Value) = True Or IsNumeric(c.Value) = True Then mLen = Len(c.Text) Else mLen = LenB(StrConv(c.Text, vbFromUnicode)) End If If MaxLen > mLen Then c.Value = c.Text & String(MaxLen - mLen, " ") & "|" Else c.Value = c.Text & "|" End If Next Next End Sub

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.12

着地できたみたいで良かったです。 いつも質問やお礼などに記載してくれているデータですが、今回添付された画像を見るととても手がかかってそうでした。 セル上でVBAで成型したものを手動でエディタにコピペするようにしたら楽そうと思って挑戦。日付が無ければできたのですが、日付の文字数取得にちょっと難航中です。 もし、現在自動化していないのでしたら、しばしお待ちいただくとできるような気がします。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.11

試す場合念のためにafterなしからテストしてください。

NuboChan
質問者

お礼

何度もアドバイスありがとうございます。 以下のコードでafterがある場合と無い場合を試してみました。 結果は、kkkkkmさんの言うように  afterがなければ指定範囲の最初の次("B2:J13"ならC2)から検索されていました。  B2は最初にヒットせずに   最後に検索されるので一番最後に日付が表示されました。 範囲を確実に順番に検索したいなら  検索範囲の最後のrangeをAfterで指定しないとダメなのがやっと理解できました。  参照したネット情報が正しくないのが判りました。 結果の参考図 https://imgur.com/aeDhLE6 Sub FindColumns() Dim SearchString As String Dim SearchRange As Range Dim FoundCell As Range Dim FirstAddress As String Dim i As Long, k As Long Dim Cr1 As Long, Cr2 As Long '書き出し箇所の初期化(クリアー) Range("B15:K26").ClearComments ' 検索する文字列を指定 SearchString = "〇" ' 検索範囲を指定(例:A1からA10までの範囲) Set SearchRange = Range("B2:J13") Range("B1:J1").NumberFormatLocal = "m/d" Range("B15:k26").NumberFormatLocal = "m/d" ' 検索を実行 'Set FoundCell = SearchRange.Find(What:=SearchString, LookIn:=xlValues, LookAt:=xlWhole, searchorder:=xlByRows) Set FoundCell = SearchRange.Find(What:=SearchString, LookIn:=xlValues, LookAt:=xlWhole, searchorder:=xlByRows, after:=Range("J4")) If FoundCell Is Nothing Then MsgBox "〇が見つかりませんでした。" Else FirstAddress = FoundCell.Address i = 15 k = 2 Do Cr1 = FoundCell.Row Cells(i, k) = Cells(1, FoundCell.Column).Value Set FoundCell = SearchRange.FindNext(FoundCell) Cr2 = FoundCell.Row If FoundCell Is Nothing Then Exit Do End If If FoundCell.Address = FirstAddress Then Exit Do Else k = k + 1 End If If Cr1 <> Cr2 Then i = i + 1 k = 2 End If Loop End If End Sub

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.9

> Set SearchRange = Range("B2:J13") 最初は > SearchRange = Range("B2:J4") でしたので、こちらで考えてます。

NuboChan
質問者

お礼

>Set searchRange = Range("A1:J2")だとして すいません。 例が適当でご迷惑をおかけしました。 この例は、一番最初(2023/08/28 08:52)です。 つづいていた今までの質問と違って 単独の質問としてに意味で範囲ならどこでも良いと適当に挙げてしました。 (OKWAVEで自分の質問で最初に表示されたSerchRangeをコピペして貼り付けました。) >私はafterがなければ指定範囲の最初の次("B2:J13"ならC2)から検索されると考えてますので、基本的に違います。 なるほどやっと理解できました。 今回もスレが長くなり大変お世話になりました。 お礼申し上げます。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.8

> Set searchRange = Range("A1:J2")だとして いつからその範囲になったのですか。 A1から範囲にしたらそりゃB2は最初にヒットします。 > Set SearchRange = Range("B2:J13") コードでは上記でしたからコードと違います。 どちらにしても afterがなくても指定範囲の最初("B2:J13"ならB2)から検索されているのでしたら私の意見は無視したほうがいいです。 私はafterがなければ指定範囲の最初の次("B2:J13"ならC2)から検索されると考えてますので、基本的に違います。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.7

> 参照先でMicrosoftが紹介されましたが、以下のような内容で > 私が見た「エクセルの神髄」とほぼ同じ内容です。 肝心なところが違います。問題にしているところを説明したつもりですが、伝わらなければいいです。 どちらにしても以下の状態でしたら気にすることはないでしょう。 > 自前のコードとkkkkmさんのコードの両方で試してみましたが > Afterが無くてもB2に○があった場合は、B7に9/1と表示されて > B10が9/1となる表示にはなりませんでした。 そうですか、それでしたらAfterはなくていいですね。 ちなみに、私のコードは行を相対で指定してますから10行にはならずに9/1が本来の行の最後の列に追加されるだけです。 > iが9を超えるとどんな不具合がある iは行指定だと思いますが、9行目までしか対象データが無いのにiが10になったらどうなるのでしょう。

NuboChan
質問者

お礼

>肝心なところが違います すいません。 違いが理解できませんでした。 >9行目までしか対象データが無いのにiが10になったらどうなるのでしょう。 If Cr1 <> Cr2 Then で前回と行比較しているので 9行目までしかない対象データでiが10になる事は無いと思いますが? ’---------------------------------------------------- Set searchRange = Range("A1:J2")だとして Set foundCell = searchRange.Find(What:=searchString, LookIn:=xlValues, LookAt:=xlPart,after:=range("J2")) とafterを検索範囲の最後のセルと明示させた方が Find.Nextで思わぬエラーが起こりにくいとアドバイスと理解しても良いのでしょうか?

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.6

> B1に〇が有っても B1じゃなくてB2の間違いでした。 > この引数を省略すると、対象セル範囲の左上端のセルが検索の開始点になります。 この悦明が間違っているか、「開始点」がAfterで指定した時のセル位置と同じと考えるのか…。 注意点1.には > 引数、Afterの説明にもあるように、このセルの次のセルから検索が開始されるからです。 ここで「次から」とあり私の記憶と同じでしたので説明の所は見てませんでした。 Microsoftの説明です。 Range.Find メソッド (Excel) https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.find > この引数を指定しない場合は、範囲の左上端のセルの後から検索が開始されます。 とありますので、検索の開始はB2ではなくC2からになります。 あと、コードの気になる点ですが i = i + 1 の時にiが9を超えたときにどうするのかを追加しておいた方がいいかもしれません。

NuboChan
質問者

補足

>この悦明が間違っているか、 記事の参照先は以下です。 エクセルの神髄 - 引数の説明(After) https://excel-ubara.com/excelvba1/EXCELVBA398.html 確認の為、時々検索でお世話になっている「Office TANAKA」で「After」を見てみたら [AFTER]   ここに指定したセルの次から検索を開始します。   省略するとexpressionの左上セルを指定したことになります このexpressionがどういう意味なのかは? 理解できませんでした. 参照先でMicrosoftが紹介されましたが、以下のような内容で 私が見た「エクセルの神髄」とほぼ同じ内容です。   After このセルの後から検索を開始します。    これは、ユーザー インターフェイスから検索が実行されたときにアクティブなセルの場所に対応しています。   After は範囲内の 1 つのセルにする必要があることに注意してください。   このセルの後から検索が開始されるため、メソッドによって範囲内の他のセルがすべて検索され、   このセルに戻るまで、指定されたセルは検索されません。   この引数を指定しない場合は、範囲の左上端のセルの後から検索が開始されます。 '---------------------------------------------------------- >B1じゃなくてB2の間違いでした。 修正して以下のようにになると思います。 Afterを最後のセル指定で入れておかないとB2に○があった場合9/1がB10に入ります。 実際に 自前のコードとkkkkmさんのコードの両方で試してみましたが Afterが無くてもB2に○があった場合は、B7に9/1と表示されて B10が9/1となる表示にはなりませんでした。 ’---------------------------------------------------------------- >あと、コードの気になる点ですが > i = i + 1 >の時にiが9を超えたときにどうするのかを追加しておいた方がいいかもしれません。 コードを修正してiが9を超える場合で試してみました。 iが9を超えても書き出し行に不具合が無かったのですが iが9を超えるとどんな不具合があるのでコードを修正すべきなのでしょうか ? |[A] |[B]|[C]|[D]|[E]|[F]|[G]|[H]|[I] [1] | |9/1|9/2|9/3|9/4|9/5|9/6|9/7|9/8 [2] |蜷川 |〇 | | |〇 | | |〇 | [3] |佐々木| |〇 |〇 | | | | |〇 [4] |田中 | | | |〇 |〇 |〇 | | [5] |蜷川 |〇 | | |〇 | | |〇 | [6] |佐々木| |〇 |〇 | | | | |〇 [7] |田中 | | | |〇 |〇 |〇 | | [8] |蜷川 |〇 | | |〇 | | |〇 | [9] |佐々木| |〇 |〇 | | | | |〇 [10]|田中 | | | |〇 |〇 |〇 | | [11]|蜷川 |〇 | | |〇 | | |〇 | [12]|佐々木| |〇 |〇 | | | | |〇 [13]|田中 | | | |〇 |〇 |〇 | | [14]| | | | | | | | | [15]|蜷川 |9/1|9/4|9/7| | | | | [16]|佐々木|9/2|9/3|9/8| | | | | [17]|田中 |9/4|9/5|9/6| | | | | [18]|蜷川 |9/1|9/4|9/7| | | | | [19]|佐々木|9/2|9/3|9/8| | | | | [20]|田中 |9/4|9/5|9/6| | | | | [21]|蜷川 |9/1|9/4|9/7| | | | | [22]|佐々木|9/2|9/3|9/8| | | | | [23]|田中 |9/4|9/5|9/6| | | | | [24]|蜷川 |9/1|9/4|9/7| | | | | [25]|佐々木|9/2|9/3|9/8| | | | | [26]|田中 |9/4|9/5|9/6| | | | | Sub FindColumns() Dim SearchString As String Dim SearchRange As Range Dim FoundCell As Range Dim FirstAddress As String Dim i As Long, k As Long Dim Cr1 As Long, Cr2 As Long ' 検索する文字列を指定 SearchString = "〇" ' 検索範囲を指定(例:A1からA10までの範囲) Set SearchRange = Range("B2:J13") Range("B1:J1").NumberFormatLocal = "m/d" Range("B15:J26").NumberFormatLocal = "m/d" ' 検索を実行 Set FoundCell = SearchRange.Find(What:=SearchString, LookIn:=xlValues, LookAt:=xlWhole, searchorder:=xlByRows, after:=Range("J4")) If FoundCell Is Nothing Then MsgBox "〇が見つかりませんでした。" Else FirstAddress = FoundCell.Address i = 15 k = 2 Do Cr1 = FoundCell.Row Cells(i, k) = Cells(1, FoundCell.Column).Value Set FoundCell = SearchRange.FindNext(FoundCell) Cr2 = FoundCell.Row If FoundCell Is Nothing Then Exit Do End If If FoundCell.Address = FirstAddress Then Exit Do Else k = k + 1 End If If Cr1 <> Cr2 Then i = i + 1 k = 2 End If Loop End If End Sub

関連するQ&A

  • 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

  • マクロFind検索で見つからなかった時の対処

    エクセル2013です 以下のコードを作成しましたが .Rowが色で塗られ 「型が違います」でERRになります。 .Columnの方はERRでなく なぜ.Rowの方がERRなのでしょうか? よろしくお願いします。 Dim 検索行番号 As Range Dim 判定列番号 As Range Dim 検索列番号1 As Range Dim 検索列番号2 As Range Set 検索行番号 = Rows(1).Find("みかん").Column If 検索行番号 Is Nothing Then MsgBox "みかんが有りません。" End If Exit Sub Set 判定列番号 = Rows(1).Find("りんご").Column If 判定列番号 Is Nothing Then MsgBox "りんごが有りません。" End If Exit Sub Set 検索列番号1 = Range("B:B").Find("大箱").Row If 検索列番号1 Is Nothing Then MsgBox "大箱が有りません。" End If Exit Sub Set 検索列番号2 = Range("B:B").Find("小箱").Row If 検索列番号2 Is Nothing Then MsgBox "小箱が有りません。" End If Exit 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 というようなこともしてみたのですが、エラーになってしまいました。 なにかアイディアを教えてください。

  • Excel VBA テキストボックスを検索

    テキストボックス3に数値を入力し ExcelのA列にあるか検索をかける。 ある場合は、B列の同じ行に 「みーつけた!」と入力。 その設定で組んでみたのですが、 テキストボックス3にデータを6桁入力しようとすると 6桁目にオーバーフローエラーが出ます。 このプログラムの何処がおかしいのでしょうか? Private Sub TextBox3_Change() Dim Number As Integer If TextBox3.Value <> "" Then '空じゃない場合 Number = TextBox3.Value Call 検索(Number) MsgBox TextBox3.Value End If End Sub Sub 検索(ByVal Number As Variant) Dim FoundCell As Range Set FoundCell = Range("A:A").Cells.Find(What:=Number, lookat:=xlPart) If FoundCell Is Nothing Then Else FoundCell.Activate Range("O" & ActiveCell.Row).Value = "みーつけた!" End If End Sub

  • VBA 特定もセルに入力で実行

    下記のコードを実行した際は問題なく実行されるのですが これを特定のセルに値が入力された際に動かそうとするとエラーになってしまいます。 Sub PaintTargetCharacter() Dim FoundCell As Range, FoundCell2 As Range Dim Addr As String Dim Addr2 As String Dim SearchArea As Range Dim SearchArea2 As Range Application.ScreenUpdating = False ActiveCell.Interior.ColorIndex = 0 '検索対象範囲 Set SearchArea = Worksheets("G番情報").Range("AE6:BG6") '検索実行 Set FoundCell = SearchArea.Find(What:=ActiveCell.Offset(0, -1), LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) '検索文字列を含むセルがない場合は終了 If FoundCell Is Nothing Then Exit Sub Set SearchArea2 = Range(FoundCell.Offset(1, 0), FoundCell.Offset(33, 0)) Set FoundCell2 = SearchArea2.Find(What:=ActiveCell, LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) If FoundCell2 Is Nothing Then Exit Sub FoundCell2.Copy Destination:=ActiveCell Application.ScreenUpdating = True End Sub 当然、特定のセルで値を入力後エンターキーを押すとアクティブセルは下に下がってしまうので Private Sub Worksheet_Change(ByVal Target As Excel.Range) Target.select Call PaintTargetCharacter End Sub としているのですが Set FoundCell = SearchArea.Find(What:=ActiveCell.Offset(0, -1), LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) の部分でエラーが起きてしまいます。 また停止してシートに戻るとセルのカーソル表示が消えてしまいます。 この現象はシートを閉じて再度開くと直りますが なにかエラーと関係しているのでしょうか? 初心者なのでおかしな部分が多々あると思います。 ご指摘などあれば宜しくお願いします。

  • Excel vba 一度で全角・半角の文字を検索

    Excel vbaの初心者ですが、他のサイトを参考にして 以下のプログラムを作成しました。 指定された文字をシートから削除する物です。 「FindDelete」の中で、一度で全角・半角の文字を検索する方法があれば 教えてください。よろしくお願いします。 Sub FindDelete(ss As String) Dim FoundCell As Range Dim FirstCell As Range Dim Target As Range Dim c As Range Dim findArea As Range Set findArea = Intersect(Columns("E:F"), ActiveSheet.UsedRange) Set FoundCell = findArea.Find(What:=ss, LookAt:=xlPart) If FoundCell Is Nothing Then MsgBox ss & "は見つかりません" Exit Sub Else Set FirstCell = FoundCell Set Target = FoundCell End If Do Set FoundCell = findArea.FindNext(FoundCell) If FoundCell.Address = FirstCell.Address Then Exit Do Else Set Target = Union(Target, FoundCell) End If Loop Target.Select If MsgBox(ss & ":" & vbCrLf & Target.Count & "件見つかりました", vbYesNo, "削除しますか?") = vbYes Then For Each c In Target c = Replace(c, ss, "") Next c End If End Sub Sub tFindDelete() Dim ss As String ss = "カブシキガイシャ" ss = StrConv(ss, vbNarrow) FindDelete (ss) ss = StrConv(ss, vbWide) FindDelete (ss) ss = "ユウゲンガイシャ" ss = StrConv(ss, vbNarrow) FindDelete (ss) ss = StrConv(ss, vbWide) FindDelete (ss) End Sub

  • エクセル マクロ 同じ数値のセルを検索

    教えてください。 sheet2のG1に3と入力しマクロを実行すると、sheet1のA列(通し番号)の3~5の行をコピーして、sheet2のA2にペーストしたいと思ってます。 (sheet1) 番号 数値1 数値2 数値3 数値4   1     5   10   15   20   2    10   15   20   25   3     5   15   20   20   4    10   20   15   25   5     10   15   20   20 ・    ・    ・    ・    ・ ・    ・    ・    ・    ・            ↓ (sheet2) 番号 数値1 数値2 数値3 数値4      3   3    5   15   20    20   4   10   20   15    25   5   10   15   20    20 イメージとしては上の通りです。 まずは、同じsheet1のG1に3を入力して、A列の3(A4)を検索することを目標にしましたが、ここの時点でこけてしまいました。。 Sub 同じ数値のセルを検索() Dim 番号 As String Dim FoundCell As Range Range("A1").Select 番号 = "G1" Set FoundCell = Cells.Find(What:="番号") If FoundCell Is Nothing = False Then FoundCell.Select End If End Sub 笑われると思いますが、これではダメでした。 どうかお助けしていただけないでしょうか。

  • Find,Offsetを使ってセルを指定する方法

    エクセルVBAのことで伺います。 以下の記述は、「D3からQ3までのセルの中で「年」と入ったセルの左横のセルを探し、 その中の値(西暦の年が入っています)を、G4からI100までの範囲に入力される月日 の年として置き換える」といったものなのですが、エラーが出てしまいます。 「実行時エラー424、オブジェクトが必要です。」とのメッセージが表示され、デバックを クリックすると、「Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1).Select」 が黄色く強調表示されています。 プログラムの記述をどのように修正すれば良いか、どなたかお教えください。 よろしくお願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim FoundCell As Range Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1).Select With Target If Intersect(Target, Range("G4:I100)) Is Nothing Or Target.Count <> 1 Then Exit Sub If IsDate(.Value) Then If Year(.Value) <> FoundCell Then Application.EnableEvents = False .Value = DateSerial(FoundCell, Month(.Value), Day(.Value)) Application.EnableEvents = True End If End If End With End Sub

  • ExcelVBA:複数の文字列を検索し、行ごと削除したい

    VBA初心者です。お教え下さい。 タイトル通り複数の文字列(例えば「aaa」)を検索し、行ごと削除したいのですが、以下のコードでは、「aaa」を検索せず、一番上の行から削除されてしまいます。。。 どこがどう間違ってるかわかりません。 どうかよろしくお願いします。 Private Sub CommandButton1_Click() Dim StrkeyWord(10) As String '検索した文字列 Dim IngStartRow As Long '検索結果の行 Dim FoundCell As Range Dim SearchArea As Range Set SearchArea = ActiveSheet.UsedRange '検索対象範囲 Set FoundCell = SearchAea.Find(what:=trkeyWord) '検索実行 If FoundCell Is Nothing Then Exit Sub '検索文字列が含まれるセルがない場合中断 StrkeyWord(1) = "aaa" StrkeyWord(2) = "bbb" StrkeyWord(3) = "ccc" StrkeyWord(4) = "ddd" StrkeyWord(5) = "eee" StrkeyWord(6) = "fff" StrkeyWord(7) = "ggg" StrkeyWord(8) = "hhh" StrkeyWord(9) = "iii" StrkeyWord(10) = "jjj" For i = 1 To 10 Cells.Find(what:=StrkeyWord).Activate '検索 IngStarRow = ActiveCell.Row '検索結果の行からの削除の場合 Rows((Str(IngStartRow)&":"&Cstr(IngStartRow)),Delete Shift :=xlUp '削除 End Sub

  • 結合していないセルの検索?

    複数シートから指定の1行を別のシートに行を追加して貼り付けをしたいのですが、コピー元が結合していたり、していなかったりとバラバラなため、貼り付け先がぐちゃぐちゃになってしまいお手上げ状態です。 セルの結合は、行は最大2行ですが、列は1列~6列など添付画像のように統一されていません。 例えば、B3~AC4の中でセルの結合が解除されている場所を検索して、ヒットしたら手動でその部分を結合させるということはできますか? もしくは他に良い方法はありますか? ご教示よろしくお願いいたします。 スクリプトは見様見真似で以下のように書きました。 Sub コピー() Dim sh1 As Worksheet Dim FoundCell As Range, FirstCell As Range '「項 目」という文字列を検索  For i = 1 To Worksheets.Count - 2 '←最大シート数  Sheets(Sheets(i).Name).Select  Set FoundCell = Cells.Find(What:="項*目")    If FoundCell Is Nothing Then       MsgBox "見つかりません"     Exit Sub     Else       ’入力されているセルを右に向かって探す     Set FirstCell = FoundCell     Set FoundCell = FoundCell.End(xlToRight)        '指定の範囲を貼り付け先にコピー        FoundCell.Resize(2, 25).Copy     Sheets("SheetA").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteAll     Application.CutCopyMode = False   End If  Next i End Sub

専門家に質問してみよう