72本目 色々な形式の”IT”を置換するファンクションの作成

VBA100本ノック

VBA100本ノック 72本目を動画で解説しています。Excelの神髄さんの模範解答はコチラ


問題

#VBA100本ノック72本目
引数の文字列に以下の処理を行い文字列で返すFunctionを作成。
全ての”IT”を”DX”に置換
※大小文字全半角問わず
※直前または直後がアルファベットの場合は対象外
※空白及び’は除いて判定
置換する:”IT”,”と IT”,”itは”,”IT 99″
しない:”GIT”,”site”,”It’s”,”it is”

解答

Sub ノック72本目()
    
    Dim x As Variant
    For Each x In Array("IT", "とIT", "it は", "IT99", "GIT", "site", "It's", "itはITでIt's ITでもITだ")
        Debug.Print ITをDXに変換(x)
    Next

End Sub
Function ITをDXに変換(ByVal str As String) As String
    
    Dim ITが見つかった場所 As Long, i As Long, OK判定 As String
    i = 1
    Do
        ITが見つかった場所 = InStr(i, str, "IT", vbTextCompare)
        If ITが見つかった場所 = 0 Then Exit Do
        
        If i > 1 Then OK判定 = 判定(Mid(str, ITが見つかった場所 - 1, 1))         '前の文字を有効か判定
        If i < Len(str) - 2 Then OK判定 = 判定(Mid(str, ITが見つかった場所 + 2, 1)) '後の文字を有効か判定
        If Len(str) = 2 Then OK判定 = "OK" '文字列が2文字で"IT"の場合
        
        If OK判定 = "OK" Then Mid(str, ITが見つかった場所, 2) = "DX"
        
        ITをDXに変換 = str
        i = i + 1
    Loop
    
    ITをDXに変換 = str
    
End Function
Function 判定(ByVal s As String) As String
    If StrConv(s, vbNarrow + vbUpperCase) Like "[A-Z]" Then Exit Function
    If s = "'" Then Exit Function
    判定 = "OK"
End Function

■考え方・流れ
0:00 冒頭・問題確認
2:26 サンプルデータを全て処理する
3:48 ITを全てDXに置換
5:22 MIDステートメントさんで置換する
6:48 ITが何文字目にあるか求める
8:42 ITが全てなくなるまでループする
10:52 前後の文字での分岐

ITって色々あるよな??itとかSiteとかit’sとか!!
自分で条件を設定して、置換するかしないかを決めてあげよう!

今回は難しいから、①の全角、半角、大文字小文字は問わないだけ条件としてやっていこう!!

新人君
新人君

難しそうな問題ですね!

ブチョ
ブチョ

楽勝だろ?

新人君
新人君

いやいや…

サンプルデータを全て処理する

さて!じゃあまずは…
サンプルデータの中の文字列を、全て処理するコードから書いていくぞ!!
※サンプルデータは神髄さんのサイトにあるぞ!

こいつはFor Eachさんでできるぞ!!
For Each ○○ In Array(△,■,…)

実行結果↓

ITを全てDXに置換

よし!そしたらお次!
一旦は、全てのITをDXに置換しよう!
全角とか小文字とかはムシムシ!!

ファンクションの戻り値、引数は↓に設定!

置換と言えば…
Replace関数さんだ!!!

実行結果↓

MIDステートメントさんで置換する

よし!続いて!
ココからは少し視点を変えるぞ!!

今回みたいに、自分で色々条件を指定して置換したいような場合!
こういう時はReplace関数さんじゃなく…MIDステートメントさんを使っていこう!

参考↓
もし、受け取った文字の1番目の文字から2番目の文字を、
全てDXに置換したい場合!

OnActionの部分も変更してあげよう!

ITが何文字目にあるか求める

よし!じゃあお次!!
特定の文字が、何文字目にあるかを求めていく!!
ノック13本目を思い出してくれ!!!

Instr関数を使うんだけど…
この関数さん!なんと第四引数で、全角半角、大文字小文字を区別しない設定ができます!!

これさえできれば、さっきは1番目から置換していたところを…
“見つかった番目”からスタートでOK!!

変更後↓

ITが全てなくなるまでループする

お次は!!
このままだと…最初の一つのITしか置換できないから…そこを修正するぞ!!
考え方としては単純で、「ITって文字がなくなるまで先頭からループし続ける!」

Do Loopを作って…開始位置を1ずつずらしていくぞ!

ただ…このままだと…無限ループしちゃうから、
条件を設けて、ループを抜けだす必要があるね!!

実行結果↓

前後の文字での分岐

最後!!
前後の文字での分岐を入れるんだけど…
これは、書き終わったコードの紹介だけで許してくれい!!
画像羅列でスマン…

前後にあるかどうか…
これは自分でファンクションを作ったぞ!

とま、こんな感じで…
全てのノックの問題の中で、1,2を争う難しさの問題だったわ…

ブチョ
ブチョ

とりあえずお疲れさま!

新人君
新人君

お疲れさまでした!

あとがたり

おはこんばんちは。uぷ主です。
72本目、いろんなITをDXに置換する問題でした…

いや、今回はマジでむずくて、ホントに解けませんでした。
いつもは模範解答みたりして…何とか形にはしてるんですが…
それすらもかなわない問題でした。

問題文の条件ゆるくして…なんとか形にしたけど…

またいつか…挑戦します…

すまん…今日はもう寝る…zzz

コメント

タイトルとURLをコピーしました