- 締切済み
フォーム内で抽出されたKeyWordの位置を簡単に表示させる方法
Access2000を使用しています。 あるフォーム内 (frmF01) で、その指定フィールド(Memo)にかなり大量の文章が含まれています。 その為、そのメモ型フィールド内で特定文字を探すのに時間がかかります。 その特定文字のある位置を一見にして発見できるようにその文字を反転させるコードを以前教えて頂きましたが、今回別のDBに応用した際にエラーが出てしまい困っています。 フォーム内の抽出用テキストボックス名:txtKeyW コマンドボタン名:cmdKeyW フィールド名:Memo とした場合の具体的コードとエラーは下記の通りです。 どこを修正したら良いのか教えて頂きますと喜びます。 (エラーメッセージ)実行時エラー’5’ プロシージャの呼び出し、または引数が不正です。デバッグ Do wnPtr = InStr(MN_PTR, Nz(Memo, ""), txtKeyW) If wnPtr = 0 Then If MB_FIND Then wsMsg = "最後まで検索しました" & vbCrLf の wnPtr = InStr(MN_PTR, Nz(Memo, ""), txtKeyW) 部分が黄色ハイライトで問題指摘されます。 wnPtrにマウスを当てると wnPtr=0 MN_PTRにマウスを当てるとMN_PTR = Empty値 が表示されます。 宜しくお願いします。 具体的な全コードは800文字以上になってしまいますので今回は書き切れませんが、ご返事いただけるようでしたらご参考までに別途送付させて頂きます。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
エラーの原因は、質問の通り Instr関数の引数の初期値が設定されていないからです。 が、テキストボックス内の一部を反転させるのに800行のコードが必要か疑問です。 Private Sub Form_Load() Me.テキスト1 = "AAABBBCCCDDDEEEFFFGGGCCC" End Sub Private Sub コマンド0_Click() Dim isOK As Boolean isOK = ReverseStr(Me.テキスト1, "CCC") End Sub 例えば、Me.テキスト1 の'CCC'を検索して反転表示させる ReverseStr() は次のようです。 isOK = ReverseStr(Me.テキスト1, "CCC", 2) は、二つ目の'CCC'を反転します。 Public Function ReverseStr(ByVal txtBox As TextBox, _ ByVal Search As String, _ Optional ByVal N As Integer = 1) As Boolean On Error GoTo Err_ReverseStr Dim I As Integer Dim J As Integer Dim K As Integer Dim L As Integer L = Len(Search) - 1 For I = 1 To N J = K + 1 K = InStr(J, txtBox, Search, vbTextCompare) + L Next I Exit_ReverseStr: If K > L Then txtBox.SetFocus txtBox.SelStart = K - L txtBox.SelLength = L + 1 ReverseStr = True End If Exit Function Err_ReverseStr: K = 1 L = 0 Resume Exit_ReverseStr End Function
補足
早速のご返事有難うございます。 800行のコードではなくて、“教えて!Goo”の800文字という文字制限により一回で送信できなかったものです。 具体的には下記の通りです。 理解できませんのは、他のDBでは上手く作動していたものが、 別のDBにて同じコードが利用できない、という点ですが、 VBA初心者の私には解明できない状態です。 是非宜しくご指導ください。 (使用コード) Option Compare Database Option Explicit Dim MN_PTR As Long Dim MB_FIND As Boolean Private Sub cmdKeyW_Click() Dim wnPtr As Long Dim wsMsg As String If Nz(txtKeyW, "") = "" Then wsMsg = "検索文字列を入力してください" MsgBox wsMsg, vbInformation txtKeyW.SetFocus Exit Sub End If If IsEmpty(MN_PTR) Then MsgBox "MN_PTRはEmpty値です。1をセットします" MN_PTR = 1 Else MsgBox "MN_PTR= " & MN_PTR End If Do wnPtr = InStr(MN_PTR, Nz(Memo, ""), txtKeyW) If wnPtr = 0 Then If MB_FIND Then wsMsg = "最後まで検索しました" & vbCrLf wsMsg = wsMsg & "もう一度最初から検索しますか" If MsgBox(wsMsg, vbQuestion + vbYesNo) = vbNo Then Exit Do End If MB_FIND = False MN_PTR = 1 Else wsMsg = "検索文字列が見つかりません" MsgBox wsMsg, vbInformation Exit Do End If Else Memo.SetFocus Memo.SelStart = wnPtr - 1 Memo.SelLength = Len(Nz(txtKeyW, "")) MB_FIND = True MN_PTR = wnPtr + 1 Exit Do End If Loop End Sub Private Sub txtKeyW_AfterUpdate() MN_PTR = 1 MB_FIND = False End Sub