Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
エクセルの神髄 マクロVBA 練習問題13
投稿日時: 21/04/03 21:15:28
投稿者: ぜんだまん
メールを送信

ぜんだまんといいます。よろしくお願いいたします。
エクセルの神髄問題13
https://excel-ubara.com/excel-answer/EXCELVBA613A.html
 
・漢字の都道府県名と、漢字の県庁所在地を使い、
 都道府県名(県庁所在地)を作成し、C列に入力して下さい。
・都道府県名と県庁所在地が同じ場合は、
 都道府県名だけにして下さい。
という問題ですが、回答のプロシージャで意味が理解できない部分があります
 
"("がある場合は"("の1つ手前までの文字(2行目で言う北海道)をstrPrefに代入、まではいいのですが、
"else"そうでなれば、っていうのはどういうことなんでしょうか?
else以下を式のまま訳すと、"("が無ければA2セル"北海道(ほっかいどう)"をstrPrefに代入、になると思うのですが、全てのセルに"("はありますよね?何のためにelseを使っているのでしょう?
 
    

If InStr(Cells(i, 1), "(") > 0 Then
      strPref = Left(Cells(i, 1), InStr(Cells(i, 1), "(") - 1)
    Else
      strPref = Cells(i, 1)


Sub 練習問題13()
  Dim i As Long
  Dim strPref As String
  Dim strCity As String
  For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    If InStr(Cells(i, 1), "(") > 0 Then
      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
    If Left(strPref, Len(strPref) - 1) = strCity Then
      Cells(i, 3) = strPref
    Else
      Cells(i, 3) = strPref & "(" & strCity & ")"
    End If
  Next
End Sub

回答
投稿日時: 21/04/03 21:54:21
投稿者: simple

余りこだわる所ではないと思いますよ。
「さいたま」と同じようなことが今後出てきたら、
または、記載を省略される場合があれば、
という少し広い前提で考えただけでしょう。
 
そういう疑問をお持ちであれば、まったく問題ないと思います。
 
# もし、どうしても疑義があり、許せないということであれば、
# こちらではなく、当該サイトに連絡されたらいかがですか?
 
これだけだと発言する意味も余りないので、

        strPref = Split(Cells(i, 1), "(")(0)
        strCity = Split(Cells(i, 2), "(")(0)
という書き方もありますよ、ということでも書いておきましょう。

回答
投稿日時: 21/04/03 22:12:34
投稿者: WinArrow
投稿者のウェブサイトに移動

参考
 
都道府県名、県庁所在地ともに「()」でフリガナがあるから、
まず、「(」の前までを取り出します。
 
都道府県名の最後の1桁は、「都」「道」「府」「県」ですから
最後の1桁を除いた都道府県名(都道府県名x)と県庁所在地と比較します。
同一ならば、都道府県名をC列セルに代入
同一でない場合は、都道府県名(県庁所在地)という編集してC列セルに代入
 
という筋書きでしょう。
 
 
参考コード

Sub test()
Dim myCELL As Range
Dim Pref As String, myCity As String

    With ActiveSheet
        Set myCELL = Range("A2")
        Pref = Left(myCELL.Value, InStr(myCELL.Value, "(") - 1)
        Set myCELL = myCELL.Offset(, 1)
        myCity = Left(myCELL.Value, InStr(myCELL.Value, "(") - 1)
        
        If Left(Pref, Len(Pref) - 1) = myCity Then
            myCELL.Offset(, 1).Value = Pref
        Else
            myCELL.Offset(, 1).Value = Pref & "(" & myCity & ")"
        End If
    End With
End Sub

投稿日時: 21/04/03 22:21:25
投稿者: ぜんだまん
メールを送信

simple さんの引用:
余りこだわる所ではないと思いますよ。
「さいたま」と同じようなことが今後出てきたら、
または、記載を省略される場合があれば、
という少し広い前提で考えただけでしょう。
 
そういう疑問をお持ちであれば、まったく問題ないと思います。
 
# もし、どうしても疑義があり、許せないということであれば、
# こちらではなく、当該サイトに連絡されたらいかがですか?
 
これだけだと発言する意味も余りないので、
        strPref = Split(Cells(i, 1), "(")(0)
        strCity = Split(Cells(i, 2), "(")(0)
という書き方もありますよ、ということでも書いておきましょう。

 
simpleさんいつもありがとうございます。
こういう書き方もあるんですね
ちょっと問題の意味が分かりずらかったですね

投稿日時: 21/04/03 22:29:25
投稿者: ぜんだまん
メールを送信

WinArrow さんの引用:
参考
 
都道府県名、県庁所在地ともに「()」でフリガナがあるから、
まず、「(」の前までを取り出します。
 
都道府県名の最後の1桁は、「都」「道」「府」「県」ですから
最後の1桁を除いた都道府県名(都道府県名x)と県庁所在地と比較します。
同一ならば、都道府県名をC列セルに代入
同一でない場合は、都道府県名(県庁所在地)という編集してC列セルに代入
 
という筋書きでしょう。
 
 
参考コード
Sub test()
Dim myCELL As Range
Dim Pref As String, myCity As String

    With ActiveSheet
        Set myCELL = Range("A2")
        Pref = Left(myCELL.Value, InStr(myCELL.Value, "(") - 1)
        Set myCELL = myCELL.Offset(, 1)
        myCity = Left(myCELL.Value, InStr(myCELL.Value, "(") - 1)
        
        If Left(Pref, Len(Pref) - 1) = myCity Then
            myCELL.Offset(, 1).Value = Pref
        Else
            myCELL.Offset(, 1).Value = Pref & "(" & myCity & ")"
        End If
    End With
End Sub

 
WinArrowさん回答ありがとうございます
なるほどですね
県庁所在地の下の方みていませんでした。
参考のコードちょっとハードル上がってますが、勉強してみます。