月刊プログラム!
Visual Basic For Excel

Vol_16
2001.Sep.18

Presented by kouta_y
感想等は掲示板、苦情はメールへ。

にこちゃん
だ〜いぶ久しぶりの更新。
なんだか私生活がやたら忙しかったので、全然更新出来なかった・・・。
APIは更新してたけどね・・・。


今回は「文字列」について。
前にこっちとかこっちで「文字コード」について触れましたが、それはまた今度にします。
あんまり掘り下げてくと、なかなか難しいのが文字列なんですが、今回はそんな事気にしないで進めます。

まず、文字列の結合ですが、今更言うまでもなく、

"たろ" & "の部屋"
"たろ" + "の部屋"

文字列の間に「&」もしくは「+」を入れれば結合出来ます。
では、逆に「切り出し」たい時です。
例えば、
"たろの部屋"
という文字列から、"たろ"だけ抜き取る方法です。
これは簡単。

Left("たろの部屋", 2)

「Left」関数を使います。
2番目の引数には、抜き取る文字数を指定します。
結果は「たろ」が返ります。
Left関数は、そのまんま「左から何文字」という意味ですが、逆の意味で「Right」関数というのもあります。
便利ですね。
えーっと、では、真ん中ら辺にある文字を抜き取る方法です。

Mid("たろの部屋", 3, 1)

「Mid」関数を使います。
上の例だと、
「左3文字目から、1文字抜き取る」
という意味になり、結果は「の」が返ります。

「なんだか基本的な事ばっかやなぁ〜」
という声が聞こえてきそうです。
もう少ししたら今回の本番に入りますので、もう少し我慢してください。
あーっとそうだ。
これは知ってる人も、そう多くないと思うんですが、、、

Left$("たろの部屋", 2)
Right$("たろの部屋", 2)
Mid$("たろの部屋", 3, 1)

上のように関数名のすぐ後に「$」を入れると、ループ処理する場合など、かなり処理が速くなります。
実はこれら関数の戻り値は、文字列型ではなく、「バリアント」型が返ってきます。
「$」を指定する事によって、戻り値を「文字列型」と指定できるんですね。
(バリアント型は処理が遅いのです)

ではそろそろ本番です。
文字列の「置き換え」というのをやってみましょう。
例えば、
"たろのすばらしい部屋"
から"すばらしい"の部分を"タメになる"に置き換えるようなコードです。
こういうのを「自作関数」にすると、後々も使えて、大変便利です。

ではまず、「元となる文字列」「検索する文字列」「置き換えたい文字列」の3つが必需品となります。
これらを「引数」にするような関数の方が使い勝手が良いですね。
「そんな関数はイヤだっ」
なんて駄々をこねず、とりあえずいきなり完成コードをみてください。

'=======================
' 文字列置き換え関数
' ば〜い たろ
'=======================

Function StrRep(ByVal Moto As String, ByVal Find As String, ByVal Rep As String) As String
Dim
i   As Long    '文字数カウント
Dim tmp As String  '一時記憶変数

If Len(Moto) < Len(Find) Then
'   検索する文字数以下だった場合
    StrRep = Moto
    Exit Function
End If


i = 1
Do
'   DoEvents
    If
Mid$(Moto, i, Len(Find)) = Find Then 'Find変数の文字数分比較している
'       一致した時

        tmp = tmp & Rep
        i = i + Len(Find)
    Else

'       違う時
        tmp = tmp & Mid$(Moto, i, 1)
        i = i + 1
   End If
   If i > Len(Moto) Then Exit Do '抜ける
Loop

StrRep = tmp
End Function


StrRepという自作関数です。
簡単な仕様としては、
大文字小文字は区別します。
元文字列に一致する文字が複数個ある場合、全て置き換えます。
こんな感じです。
関係ないですが、RepというのはReplace(置き換え)の略です。


コードの流れですが、上手い文章が書けなかったのでフローチャートにしてみました。



StrRep関数の動作をフローチャートにするとこんな感じです。
はしょってる所もありますが、分岐のタイミングは合ってます。

もっと簡単な方法もあると思いますが、二日酔いの筆者にはこれが限界です。平常でもこれが限界。

実行結果:


↓引数に渡した文字列達
1 たろのカッコイイ部屋
2 カッコイイ
3 すばらしい

ちゃんと置き換え出来てますね。
複数置き換えも可能なので、そのまま汎用として使えそうです。
1個1個確認とりたい人は、一致した時にMsgBox関数を使えばOKです。(vbYesNo分岐とか)


今回はこれで終わりです。
次回もたぶん文字列操作の引き続きです。(たぶん)