1つだけ過去を変えられるとしたら?

お世話になります。

Word, Excel, PowerPointのデータ(ファイル)にある2バイト文字を検索し、順番にハイライト表示(選択状態)にしていく処理をVBAで作りたいと考えています。
当方はC言語やPHPのプログラミングの経験はあるのですが、VBやVBAは初めてでして中々思うように作成が出来ません。

現在はとりあえず試験的に以下のようなプロシージャを作成し、メッセージボックスで表示するところまでは作成出来ています。

Sub check_2byte_stirngs(text As Object)
    moji_len = Len(text)
    byte_len = LenB(StrConv(text, vbFromUnicode))
    If (moji_len <> byte_len) Then
      '2バイト文字発見
      For i = 1 To Len(text)
        one_char = Mid(text, i, 1)
        If LenB(StrConv(one_char, vbFromUnicode)) <> Len(one_char) Then
          MsgBox one_char
        End If
      Next
    End If
End Sub

これに以下のような機能を追加したいと思っています。
・「次へ」を表示するダイアログを付ける(その場で編集可能にしたいのでMsgBoxは使わない)
・見つかった文字の場所までカーソルを移動させて選択状態にする

どちらか一方でもお分りの方がいらっしゃいましたら、ご教示願いますでしょうか。
以上、宜しくお願い致します。

A 回答 (3件)

UserForm1を追加。


TextBox1とCommandButton1を貼り付ける。
CommandButton1のCapntionを「次へ」に変更。

そして、UserForm1のコードに以下を書きます。

'-------------------------------
'ユーザーフォーム (UserForm1)
'-------------------------------
'次へボタン(CommandButton1の処理)
Private Sub CommandButton1_Click()
Unload Me
End Sub

'ユーザフォームの外部からTextBoxに文字を表示するメソッド
Public Sub DspText(Text As String)
TextBox1.Text = Text
End Sub

次に標準モジュールを追加して、コードに以下を書きます。

'-------------------------------
'標準モジュール
'-------------------------------
Sub check_2byte_stirngs(Text As String)
Dim moji_len As Integer
Dim byte_len As Integer
Dim i As Integer
Dim one_char As String

moji_len = Len(Text)
byte_len = LenB(StrConv(Text, vbFromUnicode))
If (moji_len <> byte_len) Then
'2バイト文字発見
For i = 1 To Len(Text)
one_char = Mid(Text, i, 1)
If LenB(StrConv(one_char, vbFromUnicode)) <> Len(one_char) Then
DspText one_char
End If
Next
End If
End Sub

'MsgBoxの代わりに編集可能なダイアログを表示する
Private Sub DspText(Text As String)
Load UserForm1
With UserForm1
.DspText Text
.Show vbModal
End With
End Sub

そして、必要なところで
check_2byte_stirngsを使えばお望みの1つ目
>「次へ」を表示するダイアログを付ける(その場で編集可能にしたいのでMsgBoxは使わない)
ができたかと思うのですがこういうことですか?
    • good
    • 0
この回答へのお礼

早速のご説明ありがとうございます。
詳細のコードまで書いて頂きまして大変恐縮です。
教えて頂きましたコードでそのまま一つ目の問題は解決しました。

今更ですが、VBAの本も買ってきたので、なんとか二つ目の問題も解決できると良いのですが…。

お礼日時:2005/03/15 12:33

とりあえずテキストボックス上で。


次のサンプルは
次へボタンを押す度にダイアログ上のテキストボックスの2バイト文字を順番に選択していきます。

UserFormを追加して、TextBox1とCommandButton1を追加。
CommandButton1のCapntionは「次へ」。

UserFormのコードに次のソースを貼り付けてください。
'-------------------------------
'ユーザーフォーム
'-------------------------------
'次へボタン(CommandButton1の処理)
Private Sub CommandButton1_Click()
Static SP As Integer
Dim pos As Integer

'検索開始位置を初期化
If SP = 0 Then SP = 1

'2Byte文字の位置を取得
pos = InStr2Byte(SP, TextBox1.Text)
If pos = 0 Then
SP = 0
Else
'2Byte文字が見つかったので選択状態に。
With TextBox1
.SelStart = pos - 1
.SelLength = 1
.SetFocus
End With
SP = pos + 1
End If
End Sub

'-------------------------------
'文字が2Byte文字かどうかを判定
'-------------------------------
Private Function Is2Byte(char As String) As Boolean
Is2Byte = (Len(char) <> LenB(StrConv(char, vbFromUnicode)))
End Function

'-------------------------------
'2Byte文字の位置を返す
'-------------------------------
Private Function InStr2Byte(Start As Integer, StringA As String) As Integer
Dim i As Integer

'初期化
InStr2Byte = 0

'2Byte文字位置を検索
For i = Start To Len(StringA)
If Is2Byte(Mid(StringA, i, 1)) Then
InStr2Byte = i
Exit Function
End If
Next
End Function
    • good
    • 0
この回答へのお礼

さらに詳しいご回答を頂き有難うございます。
大変勉強になりました。

これで、なんとかなりそうです。
有難うございました。

お礼日時:2005/03/17 04:02

>・見つかった文字の場所までカーソルを移動させて選択状態にする


これって、TextBox上での話でしょうか?
それとも例えばEXCELのセルの上での話しょうか?
TextBox上の話ならできると思いますけど・・?
セルかな~って思ってさらっと見たけどやる方法が見つからなくて・・。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!