データの検索・置換えをする |
検索・置換えダイアログボックスもどきを作る (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