データの検索・置換えをする
                                                        玄関へお回り下さい。
検索・置換えダイアログボックスもどきを作る        (059)
VBの「編集」→「置換」のように検索・置換えが簡単にできないかなと思い作ってみたら、結構コードが長くなってしまいました。
検索・置換えの部分は関数化したので状況に応じた移植が簡単にできるかと思います。
VB6.0 からはInstrRev・Replace等の関数が追加されたのでもっと簡単に出来るかと思います。
      フォームを2個用意しておいて下さい。
Form1に記入
(テキストボックスとコマンドボタンを各1個貼り付け)

Option Explicit

Private Sub Command1_Click()
  '検索対象テキストを表示
  frmSearch.txtKeikahyoji.Text = "1234567890" & vbCrLf _
        & "あいうえおABCDEFGH" & vbCrLf _
        & "1234567890亜意卯得尾 Visual Basic" _
        & "あいうえおABCDEFGH"
  frmSearch.Show 0, Me
End Sub

Private Sub Form_Load()
  Text1.Text = "1234567890" & vbCrLf _
        & "あいうえおABCDEFGH" & vbCrLf _
        & "1234567890亜意卯得尾 Visual Basic" _
        & "あいうえおABCDEFGH"
End Sub


もう一方のフォームに記入して下さい。

  
  図のようにコントロールを貼り付けて下さい。

Option Explicit  
'SampleNo=059 WindowsXP VB6.0(SP5) 2002.05.13

Private lngOption As Long


Private Sub Form_Load()
  'フォームの表示位置
  Me.Move 0, 0, 7300, 4860
  'Me.StartUpPosition = 2 にプロパティを設定する
  fraOption.Visible = False
End Sub


Private Sub
cmdSearchStart_Click()
'検索開始
  lngOption = 0
  '検索処理へ結果をフォーム1のテキストボックスに表示
  Form1.Text1.Text = fSearch(txtKeikahyoji.Text, _
              txtKensaku.Text, txtOkikae.Text)
  'フレームを非表示に
  fraOption.Visible = False
End Sub


Private Function fSearch(ByRef Taisyotxt As String, _
            ByVal Searchtxt As String, _
            ByVal Okikaetxt As String) As String

  Dim strTaisyo  As String '検索対象文字列
  Dim strSearch  As String '検索文字列
  Dim strOkikae  As String '置き換える文字列
  Dim lngTaisyoLen As Long  '対象文字数
  Dim lngSearchLen As Long  '検索文字数
  Dim lngOkikaeLen As Long  '置換え文字数
  Dim lngBasyo   As Long  '検索開始文字数
  Dim lngHakken  As Long  '検索文字が見つかった位置
  Dim lngCount   As Long  '検索文字が見つかった数
  Dim strMsgNull  As String 'メッセージ
  Dim strMsgNoFind As String 'メッセージ

  '文字列の代入
  strTaisyo = Taisyotxt
  strSearch = Searchtxt
  strOkikae = Okikaetxt

  '文字数の測定
  lngTaisyoLen = Len(strTaisyo)
  lngSearchLen = Len(strSearch)
  lngOkikaeLen = Len(strOkikae)

  '検索文字や対象文字が入力されていない場合の処理
  If lngTaisyoLen = 0 Or lngSearchLen = 0 Then
    fSearch = strTaisyo
    strMsgNull = "検索・置換文字列を入力して下さい"
    MsgBox strMsgNull
    Exit Function
  End If
  '検索開始文字位置(初期値)
  lngBasyo = 1

  '検索文字がある間繰り返す
  Do While InStr(lngBasyo, strTaisyo, strSearch) <> 0
    '検索開始
    lngHakken = InStr(lngBasyo, strTaisyo, strSearch)
    '見つかったら
    If lngHakken >= 1 Then
      '見つかった場所を選択
      frmSearch.fraOption.Visible = True
      frmSearch.txtKeikahyoji.SetFocus
      frmSearch.txtKeikahyoji.SelStart = lngHakken - 1
      frmSearch.txtKeikahyoji.SelLength = Len(strSearch)
      'コマンドボタンがどれか押されるまで待機
      Do While lngOption = 0
        fraOption.Visible = True
        DoEvents
      Loop

      Select Case lngOption
        Case 1  '次を検索の場合
          lngOption = 0
          lngCount = lngCount + 1
          lngBasyo = lngHakken + lngSearchLen
          frmSearch.txtKeikahyoji.Text = strTaisyo
        Case 2  '置換えの場合
          '置換えが発生した場合文字数を再調査
          lngTaisyoLen = Len(strTaisyo)
          '文字列を発見した場所の前後に置き換え文字をつなぐ
          strTaisyo = Left$(strTaisyo, lngHakken - 1) & _
            strOkikae & Mid$(strTaisyo, lngHakken + _
            lngSearchLen, lngTaisyoLen - lngHakken + _
            lngOkikaeLen)
          '置換えのカウント
          lngCount = lngCount + 1
          'どこまで置き換えたかを記録
          lngBasyo = lngHakken + lngOkikaeLen
          '状況をテキストボックスに表示
          frmSearch.txtKeikahyoji.Text = strTaisyo
          'コマンドボタンの状態を初期値に
          lngOption = 0
        Case 3  'すべて置換えの場合
          lngTaisyoLen = Len(strTaisyo)
          strTaisyo = Left$(strTaisyo, lngHakken - 1) & _
            strOkikae & Mid$(strTaisyo, lngHakken + _
            lngSearchLen, lngTaisyoLen - lngHakken + _
            lngOkikaeLen)
          lngCount = lngCount + 1
          lngBasyo = lngHakken + lngOkikaeLen
          frmSearch.txtKeikahyoji.Text = strTaisyo
          'コマンドボタンの状態は3のままだから処理を繰り返す
        Case Else
          Exit Function
      End Select
      'テキストの選択状態を初期値に
      frmSearch.txtKeikahyoji.SetFocus
      frmSearch.txtKeikahyoji.SelStart = 0
      frmSearch.txtKeikahyoji.SelLength = 0
    End If
  Loop
  lngOption = 0
  '置換え結果を代入
  fSearch = strTaisyo
  '見つからなかった場合のメッセージ
  strMsgNoFind = "検索文字が見つかりませんでした"
  If lngCount = 0 Then
    MsgBox strMsgNoFind
  End If
End Function


Private Sub cmdTugi_Click()
'次を検索
  lngOption = 1
  'クリックしたらフレームを非表示に
  fraOption.Visible = False
End Sub


Private Sub cmdOkikae_Click()
'置き換え
  lngOption = 2
  fraOption.Visible = False
End Sub


Private Sub CmdSubete_Click()
'すべて置き換え
  lngOption = 3
  fraOption.Visible = False
End Sub


Private Sub
txtKeikahyoji_KeyDown _
        (KeyCode As Integer, Shift As Integer)
  txtKensaku.SetFocus
End Sub


Private Sub txtKeikahyoji_KeyPress(KeyAscii As Integer)
  'テキストボックスの内容が変更できないように
  KeyAscii = 0
  txtKensaku.SetFocus
End Sub


Private Sub cmdSearchEnd_Click()
'検索終了
  lngOption = 4 'ループ中の場合中止に
  Unload Me
  Form1.Show
End Sub


Private Sub Form_Unload(Cancel As Integer)
  cmdSearchEnd_Click
End Sub

空白文字も置換えできます。置換え文字を指定しなければ削除になります。
各自の環境・使用状況に応じ改造して使って下さい。




2002/05/13