こんにちは。
駆け出しのエンジニアです。
現在学習してるのはコチラ
都道府県と、県庁所在地を新たなセルに転記する課題。
都道府県と県庁所在地が異なる場合は
北海道(札幌)と書く
難しすぎました。
Replace関数を使用するのかと思って色々しましたがうまくいかず。。。
解答を見るとInStr関数を使うみたい
始めて聞いた。。。
InStr関数に関してはコチラ
文字の位置を返すみたい、なかったら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