重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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を用いて検索対象範囲を設定しようと思ったのです
が、普通はどのように書くのでしょうか?
この考え方の他に書き方があったらご教授ください。
それと・・検索範囲ってどのように書いたらいいの
でしょうか・・?

A 回答 (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
    • good
    • 0

えーと。

これは 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関数で、シリアル値で検索します。

この方法がベターですね。
    • good
    • 0

こんにちは。

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
    • good
    • 0

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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!