• ベストアンサー

完全一致の検索

Sub test() D = UserForm1.Txet1.Text Cells.Find(What:=D).activate End sub UserForm1のテキストボックスに日付を入れ、 検索をかけようとしています 検索対象になるデータは、日付(4/1~3/31)です。 この検索で問題が・・・ 1/1を検索すると11/1が、2/1を検索すると12/1がそれぞれヒットしてくれるのです・・。 そりゃ・・完全に一致してますものね・・・ こういう場合、どうすればいいんでしょう? 考えてみたのは、len関数で文字列が何桁か取得し、 Ifを用いて検索対象範囲を設定しようと思ったのです が、普通はどのように書くのでしょうか? この考え方の他に書き方があったらご教授ください。 それと・・検索範囲ってどのように書いたらいいの でしょうか・・?

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

#3 のとおり、Find メソッド自体が文字列検索なので、 「日付をうまく検索できない」 といのは当たり前と言えば、当たり前なのだけれども、、、 もっと何とかできたのでは、MSさん? とか考えてしまいます。まぁ、あきらめるしかないのですが。 Match を使ったサンプルコードをアップしておきます。不正な日付の チェックもしてあります。 Private Sub CommandButton1_Click()   Dim SH       As Worksheet   Dim dblSEARCH_KEY As Double   Dim lngFOUND_ROW  As Long   Dim lngFOUND_COL  As Long   Dim rngC      As Range        Set SH = ActiveSheet      On Error Resume Next   dblSEARCH_KEY = CDate(Me.TextBox1.Text)   If Err.Number > 0 Then     MsgBox "有効な日付ではありません。", vbCritical     With Me.TextBox1       .Text = vbNullString       .SetFocus     End With     Set SH = Nothing     Exit Sub   End If   Err.Clear        For Each rngC In SH.UsedRange.Rows     lngFOUND_COL = Application.WorksheetFunction _       .Match(dblSEARCH_KEY, rngC.EntireRow, 0)     If Err.Number = 0 Then lngFOUND_ROW = rngC.Row     Err.Clear   Next rngC   On Error GoTo 0   If lngFOUND_ROW And lngFOUND_COL Then     SH.Cells(lngFOUND_ROW, lngFOUND_COL).Select   Else     MsgBox "該当データはありません", vbInformation   End If   Set SH = Nothing    End Sub

その他の回答 (3)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

えーと。これは Excel VBA の話ですよね? q=1760880 は日付の検索とは書かれていませんし、文字を入力 して検索する、ですから一連のやり取りには問題はないと思い ます。 TextBox の Text プロパティーで返される値は String 型 で、 つまり文字列です。 一方 Find メソッドでは LookIn:=xlValus としてあっても、 これは Value プロパティーで返される値、、ではなくて、 ・xlValus --> セルの Text プロパティーで返される値 です。引数 LookIn の渡す定数名が紛らわしいのですが。 ですから、シリアル値がセル上で 12/1 と表示されているなら テキストボックスに 12/1 と入力しないと検索できません。 これは、仮にシリアル値がセル上で 12月1日 と表示されている ならテキストボックスに 12/1 としても検索されないことを 意味します。 その意味では、Wendy02 さんのご心配されるとおり、不安定な 方法だと思います。 > 1/1を検索すると11/1が、2/1を検索すると12/1がそれぞれ > ヒットしてくれるのです・・。 セル上の表示が 1/1 となっていて、かつ、テキストボックス に 1/1 と入力し、この結果が得られるなら、#1 papayuka さんご指摘のとおり、 Find メソッドの引数 LookAt を指定 してないからです。恐らく、xlPart で部分一致検索になって いるからでしょう。 別にシート上の日付書式が決まっていて、テキストボックス への入力にさえ気をつければ、検索は可能なのですが、この ようなトラブルがありますので、値、今回はシリアル値で検索 するようにした方が良いと思います。 Wendy02 さんのコメント >...ワークシートのMatch関数で、シリアル値で検索します。 この方法がベターですね。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。Wendy02です。 >普通はどのように書くのでしょうか? >この考え方の他に書き方があったらご教授ください。 私は、ちょっとQNo.1754083 もみて、ちょっと不思議に感じていますし、一連のご質問のやり取りでも、私の方法とはずいぶん違いますね。日付検索で、Findメソッドをみなさんお使いになるのでしょうか? 私は、うまくできるようには思いません。書式が決まっていて、個人で使うならともかく、汎用性のあるコードの場合は使いません。通常、日付というのは、一定の列や行に入れるものですから、私は、以下のCommandButton2 のように、ワークシートのMatch関数で、シリアル値で検索します。まだ、以下のコードは細かなチェックはなされていませんが、私はこのようにして作ります。 それから、「No.1757834 質問:一致しない場合の処理・・ 」の#2で、私の書いたことは、読まれなかったようですが、11/31 を日付だとするなら、何も私は言うことはありません。しかし、現実に、11/31は存在しません。また、2004/2/29 は、日付で、2005/2/29 は、日付ではないというチェックが出来ないと、実務に際しては、ちゃんとできているとは思いません。必ず、CDate として、明示的に年数を入れるようにして処理してあげます。 ただ、練習中でしたら、別に、私の言うようなことは、考えなくて良いです。 '======================================== Private Sub CommandButton1_Click()   Dim strDate As String   Dim dtSearchWord As Long   Dim c As Range   Dim FindFlg As Boolean   strDate = TextBox1.Text   '------日付チェック・ルーチン--------   If CheckDate(strDate) = False Then    MsgBox TextBox1.Text & "は、日付ではありません。", vbCritical    Exit Sub   End If   dtSearchWord = CDate(strDate)   '--------------------------------------   For Each c In ActiveSheet.UsedRange    If c.Value2 = dtSearchWord Then      c.Select      FindFlg = True      MsgBox "見つかりました。"      Exit For    End If   Next c   If FindFlg = False Then    MsgBox TextBox1.Text & "は、見つかりません。", vbCritical   End If End Sub '======================================== Private Sub CommandButton2_Click()   '1行目に日付がある場合   Dim strDate As String   Dim dtSearchWord As Long   Dim Ret As Integer   strDate = TextBox1.Text   '------日付チェック・ルーチン--------   If CheckDate(strDate) = False Then    MsgBox TextBox1.Text & "は、日付ではありません。", vbCritical    Exit Sub   End If   dtSearchWord = CDate(strDate)   '--------------------------------------   On Error Resume Next   Ret = WorksheetFunction.Match(dtSearchWord, ActiveSheet.Rows(1), 0)   On Error GoTo 0   If Ret > 0 Then    ActiveSheet.Cells(1, Ret).Select    MsgBox "見つかりました。"    Ret = 0    Else    MsgBox TextBox1.Text & "は、見つかりませんでした。", vbCritical   End If End Sub '======================================== Private Function CheckDate(ByRef strDate As String) As Boolean '日付チェック関数  If Len(strDate) - Len(Replace(strDate, "/", "")) = 1 Then   strDate = Year(Date) & "/" & strDate  ElseIf Len(strDate) - Len(Replace(strDate, "-", "")) = 1 Then   strDate = Year(Date) & "-" & strDate  End If  If IsDate(strDate) Then   CheckDate = True  Else   CheckDate = False  End If End Function

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

QNo.1754083 で KenKen_SP さんが回答されているように、引数をきちんと設定すればよいのでは? Private Sub CommandButton1_Click() Dim D As String, r As Range  D = UserForm1.TextBox1.Text  Set r = ActiveSheet.Cells.Find(What:=D, LookIn:=xlValues, LookAt:= _        xlWhole, MatchCase:=True)  If Not r Is Nothing Then    r.Activate  Else    MsgBox D & " は見つかりません", vbExclamation + vbOKOnly, "検索結果"  End If End Sub

関連するQ&A

  • Excelで検索結果表示の修正

    下記のマクロでA列だけ検索できるようにしたいのですが、どこを修正したらいいのか教えてください。 Private Sub CommandButton1_Click() AAA End Sub Sub AAA() strMoji$ = UserForm1.TextBox1.Text If UserForm1.TextBox1.Text = "" Then MsgBox "検索条件を入力してください。", 48 Exit Sub End If On Error GoTo Fail Cells.Find(What:=strMoji, After:=ActiveCell, LookIn:=xlValues, LookAt:= _ xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ ).Activate lonNUM& = Selection.Row UserForm1.TextBox2.Text = Cells(lonNUM, 2).Value UserForm1.TextBox3.Text = Cells(lonNUM, 3).Value Exit Sub Fail: MsgBox "該当なし", 48 End Sub Private Sub UserForm_Click() End Sub

  • Excelでセル検索したセルの色をテキストボックスに表示

    セル検索した結果をテキストボックスに表示する時、文字は表示できましたが、セルの色もテキストボックスに表示したいのですが、何処を修正したらいいのか分かりません。 教えてください。 宜しくお願いします。 Sub AAA() strMoji$ = UserForm1.TextBox1.Text If UserForm1.TextBox1.Text = "" Then MsgBox "検索条件を入力してください。", 48 Exit Sub End If On Error GoTo Fail Worksheets("Sheet1").Range("a:a").Find(What:=strMoji, After:=ActiveCell, LookIn:=xlValues, LookAt:= _ xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ ).Activate lonNUM& = Selection.Row UserForm1.TextBox2.Text = Cells(lonNUM, 2).Value UserForm1.TextBox3.Text = Cells(lonNUM, 3).Value UserForm1.TextBox4.Text = Cells(lonNUM, 4).Value UserForm1.TextBox5.Text = Cells(lonNUM, 5).Value UserForm1.TextBox6.Text = Cells(lonNUM, 6).Value UserForm1.TextBox7.Text = Cells(lonNUM, 7).Value UserForm1.TextBox8.Text = Cells(lonNUM, 8).Value Exit Sub Fail: MsgBox "該当なし", 48 End Sub

  • エクセル マクロ 検索

    お世話になります。 範囲が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 本を見たり調べたりでここまでできたんですがこれだと検索件数、検索結果が色付きになるだけで使い勝手がいまいちです。 よろしくお願いします。

  • Excelでセルの検索結果をテキストボックスに表示

    先日、この内容の回答が来たのですが、いろいろテストしていたら、検索ボックスに入力して1回目は検索できるのですが、続けて次の検索をしようテキストボックスに入力してボタンを押しても以前の内容で検索されてしまいます。 どこを修正すれば良いのか教えてください。 UserForm1に、検索条件を入れるTextBox4、 該当した行のB,C,D列表示用の、TextBox1、TextBox2,TextBox3の3つ(計4つ)を設けます。 コマンドボタンを1つ(Captionは「検索・次検索」)設けます。検索・次検索ボタンです。 標準モジュールに Public ac As Range Public startaddr As String 変数の次ステップ(イベント)への受け渡し用です。 UserForm1のコマンドボタンのクリック・イベント・プロに Private Sub CommandButton1_Click() Dim r As Range If ac Is Nothing Then d = Range("A65536").End(xlUp).Row With ActiveSheet.Range(Cells(1, "A"), Cells(d, "A")) Set r = .Find(what:=TextBox4) rr = r.Row TextBox1.Text = Cells(rr, "B") TextBox2.Text = Cells(rr, "C") TextBox3.Text = Cells(rr, "D") Set ac = r r.Activate MsgBox ac.Address startaddr = ac.Address Exit Sub End With Else MsgBox ac.Address d = Range("A65536").End(xlUp).Row MsgBox d With ActiveSheet.Range(Cells(1, "A"), Cells(d, "A")) Set r = .FindNext(ac) rr = r.Row TextBox1.Text = Cells(rr, "B") TextBox2.Text = Cells(rr, "C") TextBox3.Text = Cells(rr, "D") Set ac = r r.Activate If r.Address = startaddr Then TextBox1.Text = "終わり" Exit Sub End With End If End Sub

  • 一致しない場合の処理・・

    エクセル2003です。 Sub 練習()  入力 = UserForm1.TextBox1.Text If 入力 = "" Then     MsgBox"日付を入力してください" End Sub この状況の場合、テキストボックスに何も入力しないと 日付を入力してくださいと出るような状態です。 これを、テキストボックスに ○/△の形式で入力されていない場合は 日付を正しく入力してくださいと表示したいのですが どうしたらいいでしょうか? できれば、AB/CDの形でABCDがとり得る範囲外の場合 に日付を正しく入力してくださいと表示したいです Aのとり得る範囲は0,1 Bは0~9 Cは0~3 Dは0~9です

  • EXCEL VBAでの 文字列検索

    セル内の文字列を部分一致で検索したいのですが、 下記の構文だと、検索対象シートを選択しなくてはならないため、 PGの動きが堅くなってしまいます。何かいい方法をご存知の方、 教えてください。 Selection.Find(What:=key, After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False).Activate Cells.FindNext(After:=ActiveCell).Activate

  • [VBA]型が一致しません

    EXCELWORKSHEET上で下記の処理をすると「型が一致しません」との エラーがでます。どうにも原因と対応策がわからず悩んでいます。 デバッグの良い方法ありませんでしょうか? <現象> *列2上のセルを選択して、DELETEキーを押す。⇒エラーなし。 *しかし、列2上のセルとその他のセルを同時選択した上で、DELETEキーを押すと「型が一致しません。」のエラー。 頭の「If Target.Column Like 2 And Len(Target.Value) > 0 Then 」が悪さしているのはわかるのですが・・・。 Private Sub WORKSHEET_CHANGE(ByVal Target As Range) If Target.Column Like 2 And Len(Target.Value) > 0 Then Range("c" & Target.Row).Value = Now If Target.Column Like 2 And Len(Target.Value) > 0 Then 'B列の場合だけ確認 Dim rng As Range Set rng = ActiveSheet.Range("B:B").Find(What:=Target, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True, MatchByte:=True) If Not rng Is Nothing Then '発見した。 If rng.Address <> Target.Address Then '入力中セル以外で発見 Select Case MsgBox("過去に受け入れたLOTです。再度受入れますか?", vbYesNo) Case vbYes Range("B2").Activate Selection.End(xlDown).Select ActiveCell.Offset(0, 1).Activate ActiveCell.Value = Now ActiveCell.Offset(0, 1).Activate ActiveCell.Value = UserForm2.TextBox2.Value UserForm2.TextBox1.Value = "" UserForm2.TextBox2.Value = "" UserForm2.TextBox1.SetFocus Range("B2").Activate Selection.End(xlDown).Select Selection.Offset(1, 0).Select Case vbNo Range("B2").Activate Selection.End(xlDown).Select ActiveCell.ClearContents ActiveCell.Offset(0, 1).Activate ActiveCell.ClearContents UserForm2.TextBox1.Value = "" UserForm2.TextBox2.Value = "" UserForm2.TextBox1.SetFocus End Select End If End If End If End If End Sub

  • エクセル 検索値と一致する行の検索

    Sheet1に以下のようなデータ(3,000件程度)があり、Sheet2を「検索用シート」として、検査値と一致する(Sheet1の)検査範囲の行データ(各対応範囲)を検索・抽出したいと考えています。 なお、検査値及び検査範囲は20桁の数字であるため、文字列で表示しています。 LOOKUP関数を使用して試みたのですが、検査値を入力したところ、異なる対応範囲のデータが抽出されてしまうケースが発生しました。 原因が分かりません。検査値及び検査範囲に問題があるのでしょうか? 参考になるか分かりませんが、この検査値及び検査範囲の上2桁は「11...」、「12...」、「13...」と1から始る数字となっております。 LOOKUP関数では不可能なのでしょうか? 可能であれば、関数を使用して正しいデータを検索・抽出できる方法を教えてください。 Sheet1    A(日付)  B(氏名)   D(20桁の数字)        1  2/1      ○●    11223344556677889911        2  2/3       △▲    12341234123412341234       3  2/5       □■    11112222333344445555         ↑       ↑        ↑      対応範囲1  対応範囲2   検査範囲 Sheet2(例)     A(検査値)          B(対応範囲1)       C(対応範囲2)      1  12341234123412341234      2/3             △▲                               ↑              ↑       A(検査値)に入力した値と、これに一致するSheet1の各対応範囲を検索・抽出したい。  

  • Excel2010VBA:Find、日付形式の一致

    Excel2010VBAでワークシートのE列 (関数:=IF(AND(A2<>"",B2<>"",C2<>"",D2<>""),DATE(A2,B2,C2)+D2,"")) とマクロの変数「日時1(a)」が一致すると処理を行うプログラムを作りました。(この場合一致するのは「2011/1/2 23:01」です。) E列とマクロの変数「日時1(a)」は両方とも日付形式で、「2011/1/2 23:01」で一致するはずなのですが変数「範囲」が「Nothing」で一致しません。 ■ワークシート ------------------------------------------------------------------------- A    B C D    E 2011  1 2 23:01  =IF(AND(A2<>"",B2<>"",C2<>"",D2<>""),DATE(A2,B2,C2)+D2,"") ------------------------------------------------------------------------- ■コード ------------------------------------------------------------------------- Dim 日時1(1 To 999999) As Date, 範囲 As Range With Workbooks("ブック.xlsm").Worksheets("シート") Do Set 範囲 = .Range(Cells(2, 5), Cells(527041, 5)).Find(What:=日時1(a)) If Not 範囲 Is Nothing Then ~ End If ~ ------------------------------------------------------------------------- これを一致させるためにはどうしたらいいのでしょうか? 回答よろしくお願いします。

  • 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

専門家に質問してみよう