月刊プログラム!
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分岐とか)
今回はこれで終わりです。
次回もたぶん文字列操作の引き続きです。(たぶん)