VBA, InStr関数

こんにちは。

駆け出しのエンジニアです。

現在学習してるのはコチラ

excel-ubara.com

都道府県と、県庁所在地を新たなセルに転記する課題。

都道府県と県庁所在地が異なる場合は

北海道(札幌)と書く

 

難しすぎました。

Replace関数を使用するのかと思って色々しましたがうまくいかず。。。

解答を見るとInStr関数を使うみたい

始めて聞いた。。。

 

InStr関数に関してはコチラ

excel-ubara.com

文字の位置を返すみたい、なかったら0を返すとのこと。

 

それがわかっても理解できない。

 

ヤフーでコメント書いていてくれる人がいて

正解のコードとコメントをコメントアウトしたものを張り付けときます。

ふうう、先が思いやられる。。。

Option Explicit

Sub 都道府県名()

    Dim i As Long
    Dim strPref As String
    Dim strCity As String
    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        
        'セルの「i」行目1列目(=列「A」)に「)」が含まれて(存在して)いれば、という意味になります。
        '「InStr()」関数は、含まれていれば、何文字目にあったかを数値で返します
        If InStr(Cells(i, 1), "(") > 0 Then
            
        'InStr("京都府(きょうと)", InStr("京都府(きょうと)", "(") - 1)
        'ですから、後ろの「InStr()」は、「京都府(きょうと)」の中に「(」が何文字目か調べています。
        '「京都府(きょうと)」の中で「(」は、4文字目です。
        'しかし今欲しいのは、「京都府」ですから、「- 1」しているのです。
        'Left("京都府(きょうと)", 4)
        'とすると、「京都府(」が「StrPref」に入ってしまいます。
        '「- 1」することで、「(」を含まない、左から何文字目が得られるのです。
            strPref = Left(Cells(i, 1), InStr(Cells(i, 1), "(") - 1)
        Else
            strPref = Cells(i, 1)
        End If
        If InStr(Cells(i, 2), "(") > 0 Then
            strCity = Left(Cells(i, 2), InStr(Cells(i, 2), "(") - 1)
        Else
            strCity = Cells(i, 2)
        End If
        
        'Left("沖縄県", Len("沖縄県") - 1)から考えましょう。
        '「沖縄県」の文字列長さ(Len()」は、「3」文字です。
        'Left("沖縄県", 3)」とすると、そのままで「沖縄県」ですね。
        '今は、都道府県名と県庁所在地が、同じ場合を知りたいので、「- 1」、すなわち、北海道の「道」、「東京都」の「都」、「京都府大阪府」の「府」、各県の「県」を削除して、2列目の「県庁所在地」と比較しているわけです。
        '「沖縄県」→「沖縄」を作って、「県庁所在地」を見ると「那覇」なので、違います。
        'しかし、「東京都」→「東京」を作って、「県庁所在地」を見ると、「東京」と一致します。
        'この、一致するかどうかの判断のため、「沖縄県」の「県」を削除しているのです。


        If Left(strPref, Len(strPref) - 1) = strCity Then
            Cells(i, 3) = strPref
        Else
            Cells(i, 3) = strPref & "(" & strCity & ")"
        End If
    Next
    
End Sub