Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
ユーザーフォームでのデータ検索
投稿日時: 18/05/02 11:04:26
投稿者: chibikko

Private Sub kensaku_Click()
 
Dim datarow As Long, datakensaku As Long
datarow = 4 'データの開始位置
Do
If Application.WorksheetFunction.CountIf(Range("CJ" & datarow & ":CJ65535"), TextBox3.Value) = 0 _
Or TextBox3 = "" Then
 
MsgBox "この部屋名はありません", vbExclamation,
Exit Sub
End If
datakensaku = Application.WorksheetFunction.Match(TextBox2.Value, Range("CG" & datarow & ":CG65535"), 0)
'開始位置下いくつ目に名前があるか
TextBox2.Value = Cells(datarow + datakensaku - 1, 87).Value
TextBox3.Value = Cells(datarow + datakensaku - 1, 88).Value
TextBox4.Value = Cells(datarow + datakensaku - 1, 89).Value
TextBox5.Value = Cells(datarow + datakensaku - 1, 90).Value
 
datarow = datarow + datakensaku '次の開始位置を設定
Loop Until MsgBox("この部屋名でいいです?", vbYesNo + vbQuestion, "部屋名で検索") = vbYes '
TextBox3.SetFocus
 
End Sub
 
上記コードでの検索対象は完全一致ですが、「部分一致」で検索出来るようにしたいのですが可能でしょうか。

回答
投稿日時: 18/05/02 11:33:01
投稿者: simple

CountIfもMatchも
"*" & TextBox3.Value & "*"
のような検索値を与えることで部分一致が判別できます。
# インデントをしっかりつけるようにしたほうがいいですね。

投稿日時: 18/05/02 13:52:39
投稿者: chibikko

[quote="simple"]CountIfもMatchも
"*" & TextBox3.Value & "*"
でやってみたのですが、該当データの一部しか検索に引っ掛かりませんでした。
検索にヒットさせたいのは、
○○
△△→○○
○○→○○→××
□□→△△→○○
☆☆→○○→○○
の様な場合で、○○の部分に同じ文字列が入っています。

回答
投稿日時: 18/05/02 15:22:42
投稿者: simple

関数のヘルプにも載っていることなので、
ワイルドカードの使用自体は間違いないと思います。
 
なんらかの確認漏れでしょう。
例えば、テキストボックスの値の前後に半角スペースとか入っていませんか?
どうしてもということなら、再現できるだけの具体的情報をアップして下さい。

投稿日時: 18/05/02 15:53:44
投稿者: chibikko

[quote="simple"]様
 
質問時のコードを下記の様に修正したのですが……。
 
Private Sub kensaku_Click()
 
Dim datarow As Long, datakensaku As Long
datarow = 4 'データの開始位置
Do
If Application.WorksheetFunction.CountIf(Range("CJ" & datarow & ":CJ65535"), "*" & TextBox3.Value & "*") = 0 Or "*" & TextBox3.Value & "*" = "" Then
 
MsgBox "この部屋名はありません", vbExclamation, "部屋名で検索" '開始位置下に検索名があるか
 
Exit Sub
End If
datakensaku = Application.WorksheetFunction.Match("*" & TextBox3.Value & "*", Range("CJ" & datarow & ":CJ65535"), 0)
 
TextBox1.Value = Cells(datarow + datakensaku - 1, 86).Value
TextBox2.Value = Cells(datarow + datakensaku - 1, 87).Value
TextBox3.Value = Cells(datarow + datakensaku - 1, 88).Value
TextBox4.Value = Cells(datarow + datakensaku - 1, 89).Value
TextBox5.Value = Cells(datarow + datakensaku - 1, 90).Value
 
datarow = datarow + datakensaku '次の開始位置を設定
Loop Until MsgBox("この部屋名でいいです?", vbYesNo + vbQuestion, "部屋名で検索") = vbYes
TextBox3.SetFocus
 
End Sub
 

投稿日時: 18/05/02 20:16:20
投稿者: chibikko

[quote="WinArrow"]様
 
「一部しか」というのは、「最初の1件目だけ」ではなく、複数件ある内の数件は表示させる事はできますが、残りは表示出来ないと言う意味です。

回答
投稿日時: 18/05/02 20:40:46
投稿者: simple

(1)
>インデントをしっかりつけるようにしたほうがいいですね。
という指摘は意に介さないようですが、年寄りの言うことは聞いた方がいいですよ。
 
インデントしたほうが自分にとって絶対に分かりやすいはずなんですよ。
他人のためではありません。

Private Sub kensaku_Click()
    Dim datarow As Long, datakensaku As Long
    
    datarow = 4    'データの開始位置
    Do
        If Application.WorksheetFunction.CountIf(Range("CJ" & datarow & ":CJ65535"), _
                  "*" & TextBox3.Value & "*") = 0 Or "*" & TextBox3.Value & "*" = "" Then
            MsgBox "この部屋名はありません", vbExclamation, "部屋名で検索"
            Exit Sub
        End If
        datakensaku = Application.WorksheetFunction.Match("*" & TextBox3.Value & "*", _
                                  Range("CJ" & datarow & ":CJ65535"), 0)

        TextBox1.Value = Cells(datarow + datakensaku - 1, 86).Value
        TextBox2.Value = Cells(datarow + datakensaku - 1, 87).Value
        TextBox3.Value = Cells(datarow + datakensaku - 1, 88).Value
        TextBox4.Value = Cells(datarow + datakensaku - 1, 89).Value
        TextBox5.Value = Cells(datarow + datakensaku - 1, 90).Value

        datarow = datarow + datakensaku     '次の開始位置を設定
    Loop Until MsgBox("この部屋名でいいです?", vbYesNo + vbQuestion, "部屋名で検索") = vbYes
    TextBox3.SetFocus
End Sub

(2)
>例えば、テキストボックスの値の前後に半角スペースとか入っていませんか?
についてはどうですか?
s = "*" & TextBox3.Value & "*"
Debug.Print s
Debug.Print Len(s)
などを途中に挟んで確認するとか、手はあると思うんですよ。
 
コードの問題じゃないような。
データが想定外のものになっている可能性があります。
(もっともコードも、Or "*" & TextBox3.Value & "*" = "" Then なんて無意味ですがね。
  絶対に成立するわけがない)

回答
投稿日時: 18/05/02 21:00:27
投稿者: WinArrow
投稿者のウェブサイトに移動

分かりやすい
Findメソッドを使った検索処理を紹介します。
 
あくまでも参考なので、エッセンスしか書いてありません。
 
参考例
Private Sub CommandButton1_Click()
 
Dim FirstAddress As String, FindCELL As Range
 
    On Error GoTo err_exit
     
    With ActiveSheet.Columns("CJ")
        Set FindCELL = .Find(what:=Me.TextBox3.Text, LookIn:=xlValues)
        FirstAddress = FindCELL.Address
        Do
            Debug.Print FindCELL.Address
            Set FindCELL = .FindNext(FindCELL)
        Loop Until FindCELL.Address = FirstAddress
    End With
    On Error GoTo 0
    Exit Sub
err_exit:
    MsgBox "該当無"
End Sub
 

回答
投稿日時: 18/05/02 21:02:42
投稿者: WinArrow
投稿者のウェブサイトに移動

[quote="chibikko"]

WinArrow さんの引用:

 
「一部しか」というのは、「最初の1件目だけ」ではなく、複数件ある内の数件は表示させる事はできますが、残りは表示出来ないと言う意味です。

 
こちらからは、あなたのPCの画面は見えませんから、
状況は、分かりません。
ステップ実行すれば、原因がわかるかも?
 

回答
投稿日時: 18/05/02 21:05:39
投稿者: WinArrow
投稿者のウェブサイトに移動

原因がわかったかも
 
DO 〜 Loop
の中で
 
>TextBox3.Value = Cells(datarow + datakensaku - 1, 88).Value
このコードで
TextBox3 を変更していますよね?
 
最初のTextBox3の内容と変わっていませんか?

投稿日時: 18/05/05 07:59:52
投稿者: chibikko

<simple>様
1.私だけだと思いますが、インデントなしの方が見やすいんです。
2.テキストボックスの値の前後に半角スペースはありませんでした。
 
<WinArrow>様
ユーザーフォーム中に検索用tetboxを新たに設置し、コード修正後再実行してみたところ、
問題は無事に解決しました。
 
皆様、ありがとうございました。