- ベストアンサー
完全一致の検索
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を用いて検索対象範囲を設定しようと思ったのです が、普通はどのように書くのでしょうか? この考え方の他に書き方があったらご教授ください。 それと・・検索範囲ってどのように書いたらいいの でしょうか・・?
- kenken0
- お礼率52% (64/123)
- Visual Basic
- 回答数4
- ありがとう数0
- みんなの回答 (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)
えーと。これは 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)
こんにちは。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)
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
- 締切済み
- Windows XP
- 一致しない場合の処理・・
エクセル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です
- ベストアンサー
- Visual Basic
- 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
- ベストアンサー
- Visual Basic
- エクセル 検索値と一致する行の検索
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 ~ ------------------------------------------------------------------------- これを一致させるためにはどうしたらいいのでしょうか? 回答よろしくお願いします。
- ベストアンサー
- その他MS Office製品
- 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
- ベストアンサー
- Excel(エクセル)