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を用いて検索対象範囲を設定しようと思ったのです
が、普通はどのように書くのでしょうか?
この考え方の他に書き方があったらご教授ください。
それと・・検索範囲ってどのように書いたらいいの
でしょうか・・?
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
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関数で、シリアル値で検索します。
この方法がベターですね。
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
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Access(アクセス) Access 複数条件検索の設定が上手く行きません 1 2022/07/22 20:37
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) VBA初心者です 検索した数字の行に色をつける 5 2023/02/13 14:22
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Visual Basic(VBA) VBAで日付入力しているのですが 4 2023/03/02 11:25
- Visual Basic(VBA) ユーザーフォームの表示を追加したい 2 2023/03/26 23:18
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- Excel(エクセル) 【Excel】指定のセル内容を基に別シートのセルを検索して選択する【VBA】 1 2022/06/16 16:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Eclipseの対応する括弧の強調表...
-
VisualBasic6.0のFormat関数で...
-
エクセルのVBAで日付を検索し転...
-
DataGridViewでyyyy/MM/dd
-
VB6.0 のformat関数について
-
3人のじゃんけんのプログラム
-
週間カレンダー vbscript
-
指定した日付が、その月の第何...
-
【Excel VBA】条件に合った行の...
-
Laravelクエリビルダにてウィン...
-
今日より前の書き方 マクロ
-
htmlで日付表示。三日後の日付...
-
VB.NET 日付設定
-
該当の日付以外を消去するプロ...
-
SqlCommandBuilder 使用時のサ...
-
excelのVBAについて、以下のコ...
-
ユーザーフォームのラベルに日...
-
完全一致の検索
-
C++で日付判定を行いたい!!
-
JSPからYYYYMMDDで日付入力する
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Eclipseの対応する括弧の強調表...
-
人をはめた人は 自分に返ってく...
-
DataGridViewでyyyy/MM/dd
-
エクセルのVBAで日付を検索し転...
-
ユーザーフォームのラベルに日...
-
VisualBasic6.0のFormat関数で...
-
コンボボックスに日付を表示する
-
テキストボックスにカレンダー...
-
1本あたり○円と表示する時どの...
-
指定した日付が、その月の第何...
-
VBAで当月の1日を表示するには...
-
VBA 日付・時刻の判別 時刻を認...
-
今日より前の書き方 マクロ
-
システム日付とは?
-
テキストボックスに今日の日付...
-
DateTimePickerを西暦表示にす...
-
JSPからYYYYMMDDで日付入力する
-
C++で日付判定を行いたい!!
-
ExcelVBAでSQLサーバの日付時刻...
-
【Excel VBA】条件に合った行の...
おすすめ情報
