文字列を加工してデータ転記する(その2)

この講座は有料講座です。
講座の購入後ご覧になれます。

ログインアカウントの新規作成

解説

演習問題テーマ:文字列を加工してデータ転記する(その2)

問題3で変数の使い方に慣れてください。

第7回の路線駅名を線と駅名以下にわける方法と基本的には同じことが変数を使えば実現できるというのがわかるかがポイント。基本的には1個を2つにわけるの繰り返し。1個を2つにわけ、わけたうちの1個を2つにわける。このときわけたうちの1個を戻り値とする変数をたてるのがポイントです。あとはInstr関数をつかって区切りの字が何文字目にあるかを調べる変数をたてれば、区切りの字の前か後かは変数-1、変数+1であらわせるというのは第7回と同じ。

問題4、5はInstr関数によって区切りの字の有無もわかるというのがポイント。

Instr関数をつかって区切りの字が何文字目にあるかを調べられると同時に、その字がない場合は値が0となることを利用して、If文を使って区切りの字が1つだけではない場合の処理ができます。またInstr関数はあくまでも区切りの字が何文字目にあるかがわかるだけなので「モノレール」の場合はどうするかよくみて学んでください。

この教材についての過去の質問・感想

10641 : 小川慶一の回答 (2018-10-10 11:26:11)

シドニーさん:

「区」と「市」くらいしかないし、いただいたコードでも良いかと思いますよ。

> マクロを書くときに、シンプルに考える工夫などありますか。よく物事を複雑に考えすぎると言われてしまうので…

普段からシンプルに考え、表現することです。

以前言語の言語能力とプログラミング言語の言語もあるとには高い相関があります。

○エクセルマクロ習得に関係する4つの能力-言語能力
https://www.exvba.com/4skills.php#language

自然言語を運用するときに普段からシンプルに考え表現することが、プログラミング言語を運用するときの能力にもなります。
プログラミング言語を運用するときに普段からシンプルに考え表現することが、自然言語を運用するときの能力にもなります。



> 小川先生 
> お世話になっております。解説見る前に過去の動画を見ながら作成していますが、模範解答のようにきれいにならないこともあります泣
> 問題4で下記のように作成しましたが、無駄が多いように感じています。(マクロ自体は、問題無く動きましたが…)
> マクロを書くときに、シンプルに考える工夫などありますか。よく物事を複雑に考えすぎると言われてしまうので…

Sub mondai4()
    Dim jusyo
    Dim ku
    Dim si
    Dim gyo
    
    For gyo = 2 To 11
        jusyo = Range("C" & gyo).Value
        ku = InStr(jusyo, "区")
        si = InStr(jusyo, "市")
        If ku > 0 Then
            Range("F" & gyo).Value = Left(jusyo, ku)
            Range("G" & gyo).Value = Mid(jusyo, ku + 1)
        Else
            Range("F" & gyo).Value = Left(jusyo, si)
            Range("G" & gyo).Value = Mid(jusyo, si + 1)
        End If
    Next       
End Sub


10632 : シドニーさんのコメント (2018-10-06 12:20:47)

小川先生 
お世話になっております。解説見る前に過去の動画を見ながら作成していますが、模範解答のようにきれいにならないこともあります泣
問題4で下記のように作成しましたが、無駄が多いように感じています。(マクロ自体は、問題無く動きましたが…)
マクロを書くときに、シンプルに考える工夫などありますか。よく物事を複雑に考えすぎると言われてしまうので…

Sub mondai4()
    Dim jusyo
    Dim ku
    Dim si
    Dim gyo
    
    For gyo = 2 To 11
        jusyo = Range("C" & gyo).Value
        ku = InStr(jusyo, "区")
        si = InStr(jusyo, "市")
        If ku > 0 Then
            Range("F" & gyo).Value = Left(jusyo, ku)
            Range("G" & gyo).Value = Mid(jusyo, ku + 1)
        Else
            Range("F" & gyo).Value = Left(jusyo, si)
            Range("G" & gyo).Value = Mid(jusyo, si + 1)
        End If
    Next       
End Sub


10134 : 小川慶一の回答 (2018-06-19 13:58:39)

morimotoさん:

> エディッタ画面を当然開いてやりますから、周りから「何してんねん」と声がかかり始めてまあ変なことしてるな~と見られ始めました。
> どこかの講座でこのようなことになるよってあったような、、、ほんとですね。

「仕事での成果につながる、そして、そのやり方は自分にマネできない」となれば、周囲からの信頼がますます増します。


ちょうど、先日、とある受講生の方から以下のような声をいただきました。
morimotoさんの将来の姿と重ね合わせて読んでください。

○ガラパゴスタディ―で学ぶ前どのような事に悩んでいましたか?
・仕事が片付かない。
・ITに弱い。
・VBAがわからない。

○ガラパゴスタディ―の有料講座で学んだ感想をお書きください。
・仕事の改善効果は、自動化、手順書化して部下に任せて、自分はよりマネジメントに時間とエネルギーを投資できています。

○ガラパゴスタディ―で学んだことはあなたのお仕事にどのように活かされていますか。
・思考の整理整頓、スピードが早くなり、問題解決の質、スピードも格段に上がった。
・その結果、今の会社の部署で「任せられるのは、お前しかいない!」と言われるようになった。
・また、5歳と8歳の子供たちにも、小川先生に指導していただいた本質的な学習方法、教育方法を子どもたちに指導出来ているので、8歳の長男は学年で1、2位の成績で、次男も成績を残している。

○今後ガラパゴスタディーに求めることは何ですか
・今のままで、十分満足していますが、より高次元で多岐にわたる講座を作って欲しいです。


> 会社で時間があればフォロアップの演習してます。
> エディッタ画面を当然開いてやりますから、周りから「何してんねん」と声がかかり始めてまあ変なことしてるな~と見られ始めました。
> どこかの講座でこのようなことになるよってあったような、、、ほんとですね。


10125 : morimotoさんのコメント (2018-06-17 02:20:43)

会社で時間があればフォロアップの演習してます。エディッタ画面を当然開いてやりますから、周りから「何してんねん」と声がかかり始めてまあ変なことしてるな~と見られ始めました。どこかの講座でこのようなことになるよってあったような、、、ほんとですね。


9988 : 小川慶一の回答 (2018-05-16 08:09:37)

ゲストさん:

またお気軽にどうぞ!


> 小川 様
>
> 質問に対するご指導、
> ありがとうございました。
>
> [a] Dim ... , Dim ... という変数宣言を、
> Subプロシージャ先頭のほうで固めた方が良さそうな気がするけど、
> [c] 変数が登場する順序と、それらの変数を使う順序は
> 一致していた方が良いのかな?
>
> と思っていましたが、正確に表現できていませんでした。
>
> 宣言してから、値を格納するという点、
> 動画を復習します。
>
> 今後ともよろしくお願い致します。


9975 : ゲストさんのコメント (2018-05-14 23:40:39)

小川 様

質問に対するご指導、
ありがとうございました。

[a] Dim ... , Dim ... という変数宣言を、
Subプロシージャ先頭のほうで固めた方が良さそうな気がするけど、
[c] 変数が登場する順序と、それらの変数を使う順序は
一致していた方が良いのかな?

と思っていましたが、正確に表現できていませんでした。

宣言してから、値を格納するという点、
動画を復習します。

今後ともよろしくお願い致します。


9971 : 小川慶一の回答 (2018-05-14 19:40:38)

ゲストさん:

> 「gyoという変数を宣言する前の行の記述にさかのぼって
> "C2"の箇所にgyoを当てはめて使ってはダメだよ」
> という意味だと思うのですが、

そのとおりです。
いただいた画像キャプチャでは、

Sub sityo()
	Dim ku
	Dim jusho
	jusho = Range("C" & gyo).Value
	Dim gyo
	...


となっています。
これは、 Dim gyo よりも前の行で(1行前)で変数 gyo に値を格納しようとしているのでNGです。


> 変数を宣言する(dim)記述と、
> 変数を定義する記述は、どの順番で書くのが正しいのでしょうか。

変数については、以下の動画で復習を。

基礎講座第1章8 - 変数を使ったプログラム、変数を使う意義
https://online.pc5bai.com/movie/index/25/104/

基礎講座第1章9 - 変数を活用するときの注意点
https://online.pc5bai.com/movie/index/25/105/

「注意点」でもお話しているとおり、変数を使うときの流れは、以下のとおりです。

[1] 変数を作る(宣言する、と言います)
[2] 変数に値を格納する
[3] 変数に格納された値を利用する

> 2つ以上の変数が必要になった場合、
> 必要だと判明した順番で書くと、
> 上から順に、'dim ばかりにはならず、きれいに揃いません。
> それを整理しようとした時に、
> どういう順番で整理するのが正しいのかをご指導願います。

質問の意味が分かりません。
以下の[a]-[c]どれかの趣旨のご質問でしょうか?

[a] Dim ... , Dim ... という変数宣言を、Subプロシージャ先頭のほうで固めて行いたい
[b] 特に意識しないでも上記[1]→[2]→[3]の流れで変数を使えるようになりたい
[c] 変数が登場する順序とそれらの変数を使う順序は一致しているべきか?
[d] それ以外(詳細に再度説明願います)

[a] であれば、話は簡単です。
「Dim ... とかは、 Sub ... の直後に書く」と自分でルールを決めることです。

[b] も、話は簡単です。
「あ、ここの固定値を変数で扱えるようにしよう」と思ったら、その直前(か、もっと前)の行に、 Dim ... という一行を書く。あとは、流れで。

[c] は、どうでもよいです。

[a], [b], [c] は、以下の違いがあるだけです。(変数宣言が、だいぶ前か、直前か?の違いだけ)
[a], [b], [c] について、「どちらのほうが優れている」とは、これだけでは言えません。

Sub before()
    Dim a
    Dim b
    Dim c

    具体的な処理1行目
    具体的な処理2行目 '←ここを変数で表現したいとする。
    具体的な処理3行目

End Sub

'パターン[a]
Sub pattern_a()
    Dim a
    Dim b
    Dim c

    具体的な処理1行目
    Dim d             '←ここで変数宣言
    具体的な処理2行目 (変数dを使って表現)
    具体的な処理3行目

End Sub

'パターン[b]
Sub pattern_b()
    Dim a
    Dim b
    Dim c
    Dim d             '←ここで変数宣言

    具体的な処理1行目
    具体的な処理2行目 (変数dを使って表現)
    具体的な処理3行目

End Sub

'パターン[c]
Sub pattern_c()
    Dim a
    Dim d             '←ここで変数宣言
    Dim b
    Dim c

    具体的な処理1行目
    具体的な処理2行目 (変数dを使って表現)
    具体的な処理3行目

End Sub


9957 : ゲストさんのコメント (2018-05-13 00:14:14)

'dim で変数を宣言する記述と、
実際に変数を記述した式の順番、
これについて教えて頂けますでしょうか。

変数を、「必要だ」と自分が気付いた順番で記載すると、
'dim jusho
'jusho=range("C2").value
'dim ku
'ku = instr(range("C2").value,"区")
'dim gyo
'for gyo = 2 to 11

の順番になりました。

その後、'jusho=range("C2").value の("C2")の箇所を
'"(C & gyo)"に変更すると、
添付のようなエラーが出てしまいました。

これはおそらく、
「gyoという変数を宣言する前の行の記述にさかのぼって
"C2"の箇所にgyoを当てはめて使ってはダメだよ」
という意味だと思うのですが、

変数を宣言する(dim)記述と、
変数を定義する記述は、どの順番で書くのが正しいのでしょうか。

2つ以上の変数が必要になった場合、
必要だと判明した順番で書くと、
上から順に、'dim ばかりにはならず、きれいに揃いません。
それを整理しようとした時に、
どういう順番で整理するのが正しいのかをご指導願います。


9707 : 小川慶一の回答 (2018-04-11 17:31:55)

わかやまさん:

慣れるとさくさく書けるようになりますよ。
書けば書くほど上手になります。むしろ、最初からここまでできたならなかなかすごいです。

ひきつづき、お楽しみください☆


> 小川様
>
> ありがとうございます。
> はじめに見ていただいたマクロと比較するとInstr関数の引数の指定のない部分がちがっていますね、、、。
> 惜しかったと思わずに、しっかり復習してできるだけたくさんのマクロをかいてスキルアップしていきたいと思います。
> これからもよろしくお願いします。


9696 : わかやまさんのコメント (2018-04-10 18:34:06)

小川様

ありがとうございます。
はじめに見ていただいたマクロと比較するとInstr関数の引数の指定のない部分がちがっていますね、、、。
惜しかったと思わずに、しっかり復習してできるだけたくさんのマクロをかいてスキルアップしていきたいと思います。
これからもよろしくお願いします。


9684 : 小川慶一の回答 (2018-04-09 08:02:18)

ゲストさん:

なるほど。

すっきり書くなら、こんな感じ↓ですかね。

Sub Line12()
    Dim zenbu '文字列全体
    Dim sen   '「線」の所在?
    Dim eki   '「駅」の所在?
    Dim ayu   '「歩」の所在?
    zenbu = Range("E12").Value
    sen = InStr(zenbu, "線")
    eki = InStr(sen + 1, zenbu, "駅")
    ayu = InStr(eki + 1, zenbu, "歩")
    
    Range("H12").Value = Left(zenbu, sen)
    Range("I12").Value = Mid(zenbu, sen + 1, eki - sen) '「駅」と「歩」ではさみうち。
    Range("J12").Value = Mid(zenbu, ayu + 1)            '「歩」の次以降すべて。
End Sub

Sub Hanko_Line12()
    Dim zenbu
    Dim sen
    Dim eki
    Dim ayu
    
    Dim gyo
    For gyo = 2 To 12
        zenbu = Range("E" & gyo).Value
        sen = InStr(zenbu, "線")
        eki = InStr(sen + 1, zenbu, "駅")
        ayu = InStr(eki + 1, zenbu, "歩")
        
        Range("H" & gyo).Value = Left(zenbu, sen)
        Range("I" & gyo).Value = Mid(zenbu, sen + 1, eki - sen)
        Range("J" & gyo).Value = Mid(zenbu, ayu + 1)
    Next
End Sub


上の見本のように、
[a] 区切り文字を見出すセクション
[b] 書き出しセクション
と、分けて書いたほうが可読性も高いし、シンプルです。

「『線』以外に『モノレール』もある」等のバリエーションよりもしっかり解説すべきなような気がしてきました。
おもしろいテーマですので、いずれ、演習問題としてもこれを追加したいと思います。

ありがとうございます。


9683 : ゲストさんのコメント (2018-04-09 05:59:35)

小川様

[1] 見本のやり方と比べてのメリットは?
駅名に歩がある場合に対応できる。
[2] 見本のやり方と比べてのデメリットは?
変数が2つ増えてややこしくなった。
[3] [1], [2]をふまえたうえで、あえてご自身で考えた方法を採用したいと思う相当な理由は?
変数はふえたものの、駅名に歩がある場合に対応できるので、私のマクロを採用する。

こう考えました。よろしくお願いします。


9676 : 小川慶一の回答 (2018-04-08 18:37:19)

ゲストさん:

> どうでしょうか?

まずは、ゲストさんご自身が(見本と比べて)どう思うか?考えてみてください。
そして、考えたことをここに書いてみてください。

見本と比べて考察を深めるには、もう一度動画を見直して、動画で示したやり方で(何も見ないで)イチから同じマクロを自力で書いてみると良いです。

考察に当たっては、最低でも以下のことくらいは十分に検討する必要があるでしょう。
[1] 見本のやり方と比べてのメリットは?
[2] 見本のやり方と比べてのデメリットは?
[3] [1], [2]をふまえたうえで、あえてご自身で考えた方法を採用したいと思う相当な理由は?

よろしく、お願いします。


9670 : ゲストさんのコメント (2018-04-08 10:36:28)

小川様

考え直しました。

 
Sub again33()
    Dim sen
    Dim eki
    Dim densya
    Dim aruku
    Dim ekitoho
    Dim toho
    Dim hensu
        For hensu = 2 To 51
            densya = Range("E" & hensu).Value
            sen = InStr(densya, "線")
            eki = InStr(densya, "駅")
            aruku = InStr(eki + 1, densya, "歩")
            ekitoho = Mid(densya, sen + 1)
            toho = InStr(ekitoho, "駅")
            Range("H" & hensu).Value = Left(densya, sen)
            Range("I" & hensu).Value = Left(ekitoho, toho)
            Range("J" & hensu).Value = Mid(densya, aruku + 1)
        Next
End Sub


どうでしょうか?


9666 : 小川慶一の回答 (2018-04-07 06:27:48)

ゲストさん:

おはようございます。

> とすることで解決するのですが、この場合のみの限定マクロになってしまいます。
> より一般化するには、先に進まないと難しいのでしょうか?
> 今まで学んだ発想でも可能でしょうか?

ですので、この動画の3分ぐらいのところから示している通り、
・「駅」という文字の場所を探し
・その結果を変数に格納し
・Instr関数の第1引数にその変数の値+1を格納して「歩」という文字の場所を探す
という流れになります。

そういう視点で、この動画でもう一度学び直し見てください。


9665 : ゲストさんのコメント (2018-04-07 05:14:45)

小川様

お返事ありがとうございます。

ご指摘いただいた「大渓谷線歩みが腹駅歩11」の場合ですが

 
toho = InStr(6, jyusyo, "歩")

とすることで解決するのですが、この場合のみの限定マクロになってしまいます。
より一般化するには、先に進まないと難しいのでしょうか?
今まで学んだ発想でも可能でしょうか?


9660 : 小川慶一の回答 (2018-04-06 11:04:08)

ゲストさん:

これですと、たとえば、「大渓谷線歩みが原駅歩11」みたいな文字列をキレイに分解できませんね。
「『線』より前に『駅』はない。『駅』より先に『歩』はない」という前提でしたら、これでもOKです。


9658 : わかやまさんのコメント (2018-04-05 06:04:05)

小川様

問題3を以下のように解きましたが、どうでしょうか?

Sub again3()
    Dim sen
    Dim eki
    Dim toho
    Dim kuri
    Dim jyusyo
    For kuri = 1 To 51
        jyusyo = Range("E" & kuri).Value
        sen = InStr(jyusyo, "線")
        eki = InStr(jyusyo, "駅")
        toho = InStr(jyusyo, "歩")
        Range("H" & kuri).Value = Left(jyusyo, sen)
        Range("I" & kuri).Value = Mid(jyusyo, sen + 1, eki - sen)
        Range("J" & kuri).Value = Mid(jyusyo, toho + 1)
    Next

End Sub


アドバイスお願いいたします。


9240 : 小川慶一の回答 (2017-12-18 19:41:08)

吉川 裕子さん:

コメントありがとうございます。
これは頻出パターンなんで、ぜひこの機会にモノにしてください!


> 「instr関数:該当しない場合は、0を返す」
> ここがとても勉強になりました。


9238 : ガラパゴスタディー吉川の回答 (2017-12-18 17:18:28)

「instr関数:該当しない場合は、0を返す」
ここがとても勉強になりました。


9111 : 小川慶一の回答 (2017-11-05 19:26:03)

受講生 さん:

> 書いたあとだと、Instr(range(~)など、同じようなものが出てくるし、変数を使った方がすっきりするな、と思うんですが、書いている途中だと変数の使い方がピンときませんでした。

順調ですよ (^^*

最初のうちは、書き終わってからも気づきません。
慣れてくると、書き終わってから気づくようになります。
さらに慣れてくると、書いている途中に気づくようになります。
さらに慣れてくると、書く前から気づくようになります。
さらに慣れてくると、「気づく」レベルを超えて、瞬間的に正解が思い浮かぶようになります。


9106 : 受講生さんのコメント (2017-11-04 11:47:02)

その前の問題もそうですが、先生の動画を見る前に一度自分で書いてみると以下のようになってしまい、変数を効果的に使っていないことに気付きます。

書いたあとだと、Instr(range(~)など、同じようなものが出てくるし、変数を使った方がすっきりするな、と思うんですが、書いている途中だと変数の使い方がピンときませんでした。

慣れるしかないのかなと思いますが、最初のうちは、以下のように書いてしまってから、あとから、ここはこういう風に変数を使った方がいいな、とか考えていってもいいのでしょうか?よろしくお願いします。

「問題4」シート「Sheet2」で、C列にある住所の「区」または「市」までをF列に、それ以降をG列に書き込むマクロを作れ

Sub ren()

Dim gyo
For gyo = 2 To 11
If InStr(Range("c" & gyo).Value, "区") = 0 Then
    Range("f" & gyo).Value = Left(Range("c" & gyo).Value, InStr(Range("c" & gyo).Value, "市"))
Else
    Range("f" & gyo).Value = Left(Range("c" & gyo).Value, InStr(Range("c" & gyo).Value, "区"))
End If

Next

End Sub


8875 : 小川慶一の回答 (2017-09-14 10:51:17)

受講生 さん:

ですね。
instr関数の結果を用いて条件分岐するというのは、とてもよくあるパターンです☆

> Instr関数を使って、見つけたい文字列がなければ”0”を返すのがポイント!


8871 : 受講生さんのコメント (2017-09-12 21:23:30)

Instr関数を使って、見つけたい文字列がなければ”0”を返すのがポイント!


8723 : 小川慶一の回答 (2017-08-15 18:57:34)

受講生 さん:

良いかと思います。


6116 : 小川慶一の回答 (2016-03-25 07:35:27)

受講生 さん:

ケースバイケースですよ。
「路線名のリストを作ってそれらだったら例外処理をする」とかもありですし、「Select Caseで条件分岐する」というのもありです。

>基礎本編動画で初めてinstr関数が出てきた時、instrはif instr・・・・>0 のような使い方をよくすると
>一言紹介がありました。
>文字位置だけでなく、文字列のあるなしの判別で分岐処理をするという点が印象に残っていたらしく
>それを思い出して解くことができていました。(*^▽^*)
>
>ただ、instrで返された数値を変数にし忘れたので、あまりスマートなコードではありませんでした。
>東京モノレール、どんなふうに処理したのか楽しみに見ました。
>1か所だけの例外値だったので、私も単純な処理をしてしまいました。
>instrを変数にしていなかったので、こんな風です:(笑)
>IF文で例外処理を分岐するロジックは理解できたと思います。
>

> If Left(rosen, 7) = "東京モノレール" Then
>            Range("H" & gyo).Value = Left(rosen, 7)
>            Range("I" & gyo).Value = Mid(rosen, 7 + 1)
>        Else
>

>by gooska


6110 : 受講生さんのコメント (2016-03-24 20:20:33)

基礎本編動画で初めてinstr関数が出てきた時、instrはif instr・・・・>0 のような使い方をよくすると
一言紹介がありました。
文字位置だけでなく、文字列のあるなしの判別で分岐処理をするという点が印象に残っていたらしく
それを思い出して解くことができていました。(*^▽^*)

ただ、instrで返された数値を変数にし忘れたので、あまりスマートなコードではありませんでした。
東京モノレール、どんなふうに処理したのか楽しみに見ました。
1か所だけの例外値だったので、私も単純な処理をしてしまいました。
instrを変数にしていなかったので、こんな風です:(笑)
IF文で例外処理を分岐するロジックは理解できたと思います。

 If Left(rosen, 7) = "東京モノレール" Then
            Range("H" & gyo).Value = Left(rosen, 7)
            Range("I" & gyo).Value = Mid(rosen, 7 + 1)
        Else

by gooska


1849 : 小川慶一の回答 (2014-08-04 07:06:11)

匿名 さん:

日々の継続、大切ですね。
ひきつづきお楽しみを!

>前回から間をあけてしまったら、かなり忘れてしまいました。やっぱり間をあけずに継続してやるのが一番と痛感しました。


1846 : 受講生さんのコメント (2014-08-03 22:03:02)

前回から間をあけてしまったら、かなり忘れてしまいました。やっぱり間をあけずに継続してやるのが一番と痛感しました。


241 : ガラパゴスタディー事務局の回答 (2013-09-09 00:00:00)

小俣さん:

> 今回は、とにかく試行錯誤でやっつけることの大切さを学びました。
> スマートに洗練された完璧な答えが最初からあると思ってちゃダメですね。

モノづくりてのは、ベタなもんです。

> ユーザーに「ル」って入力させるのはないよな~って一人で突っ込んでました。
> そもそも「路線名の最後の文字」っていう表現も意味がわかりづらいし、間違って入力しちゃうこともあるだろうし。

「手順書としてどうか?」という問いですね。

Dim moji は、For Next構文がはじまる前にもってきたほうがよいです。
(どうしてだかは、小俣さんならおわかりかと思いますが。。もし分からなければ、遠慮無くその旨コメントください)


240 : 小俣卓生さんのコメント (2013-09-07 00:00:00)

今回は、とにかく試行錯誤でやっつけることの大切さを学びました。
スマートに洗練された完璧な答えが最初からあると思ってちゃダメですね。

こんなんでよかったんですね。
sen = InStr(densya, "モノレール") + 4


遊びも兼ねて最後は人間に判断させようと思ってこんな風にしてみました。
でも、ユーザーに「ル」って入力させるのはないよな~って一人で突っ込んでました。
そもそも「路線名の最後の文字」っていう表現も意味がわかりづらいし、間違って入力しちゃうこともあるだろうし。

いろいろと考えてしまいました。

Sub test5()
    Dim densya
    Dim sen
    Dim gyo
    For gyo = 2 To 11
        densya = Range("E" & gyo).Value
        sen = InStr(densya, "線")
        If sen = 0 Then
            Dim moji
            moji = InputBox(densya & "の路線名の最後の文字を入力してください")
            sen = InStr(densya, moji)
        End If
        Range("H" & gyo).Value = Left(densya, sen)
        Range("I" & gyo).Value = Mid(densya, sen + 1)
    Next
End Sub


239 : ガラパゴスタディー事務局の回答 (2013-09-05 00:00:00)

北嶋さん:

そうですね。いただいた例だと、元データにミスがあって「線」という文字が落ちていたらとか、そういうケースに対応できてないので。

もっとも、どこまでやるかは、元データがどれだけ整形されているかにもよりますが。


238 : 北嶋浩行さんのコメント (2013-09-02 00:00:00)

問題5で↓のように少しストレートすぎる書き方になってしまいました。

 densya()
    Dim roseneki
    Dim sen
    Dim gyo
    For gyo = 2 To 11
        roseneki = Range("e" & gyo).Value
        sen = InStr(roseneki, "線")
        If sen = 0 Then
            sen = 7
        End If
        Range("h" & gyo).Value = Left(roseneki, sen)
        Range("i" & gyo).Value = Mid(roseneki, sen + 1)
         
    Next
End Sub


せめて、sen = len("東京モノレール")くらいにはしておきたかったです。


237 : ガラパゴスタディー事務局の回答 (2013-05-13 00:01:00)

土田さん:

> 解説にあるように「とにかくやってみる」ことですね。
> 考えてもわからないことは、いくら考えてもわからないですからね。

ホント。それそれ。詰め将棋じゃないんだから。駒を動かしながら考えてください。


236 : 土田 信行さんのコメント (2013-05-13 00:00:00)

問題[1][2]がkiso007で[3][4][5]がkiso008だったんですね。

解説にあるように「とにかくやってみる」ことですね。
考えてもわからないことは、いくら考えてもわからないですからね。
この辺が自分の弱いところです。(とにかく行動だ!)

今回の回答で変数の使い方を工夫する事でわかりやすくなり、頭の中も整理されると思いました。

以下、自力でやってみたマクロです。

Sub mondai5()
    Dim rosen
    Dim ro
    Dim sen
    Dim hen
    For hen = 2 To 11
        rosen = Range("E" & hen).Value
        ro = InStr(rosen, "ル")
        sen = InStr(rosen, "線")
        If sen > 0 Then
            Range("H" & hen).Value = Left(rosen, sen)
            Range("I" & hen).Value = Mid(rosen, sen + 1)
        Else
            Range("H" & hen).Value = Left(rosen, ro)
            Range("I" & hen).Value = Mid(rosen, ro + 1)
        End If
    Next
End Sub


"If文"の中身がもう少し工夫できれば良かったです。


235 : ガラパゴスタディー事務局の回答 (2013-04-13 00:01:00)

栗原さん:

まずは、何はともあれインデントを。

If senzero Then    eki = 7End If


とかの

eki = 7


は、

eki = Len("東京モノレール")


のほうがもうちょいかっこいいかな。可読性という意味で。


234 : 栗原宏明さんのコメント (2013-04-13 00:00:00)

市と区が混じった課題が難しく自力で出来ませんでしたが、動画を見た後に反復練習にて自力で書けるようになりました。しかしこの課題を終わらせるのに3日掛かってしまった。
さて、今日明日の土日で3日分は消化できるようにがんばります!
自力で書いたのが下記のとおりですが、修正したほうが良い点などはありますか?


Sub test03()
 
Dim sen
Dim gyo
Dim egyo
     
    For gyo = 2 To 11
    egyo = Range("e" & gyo).Value
    sen = InStr(egyo, "線")
         
       If sen = 0 Then
       sen = 7
              
       End If
         
        Range("h" & gyo).Value = Left(egyo, sen)
    
    Next
 
End Sub


Sub test04()
 
Dim eki
Dim gyo
Dim senzero
Dim egyo
     
For gyo = 2 To 11
    egyo = Range("e" & gyo).Value
    eki = InStr(egyo, "線")
    senzero = InStr(egyo, "東京モノレール")
         
    If senzero Then
    eki = 7
    End If
     
    Range("i" & gyo).Value = Mid(egyo, eki + 1)
Next
 
End Sub


233 : ガラパゴスタディー事務局の回答 (2013-04-09 00:00:00)

池本さん:

さすが、いいセンスですねー。

[a] 一度分割した段階で、 Mid(densha, sen + 1) に入っているのは「代々木八幡駅歩4」みたいな感じ。
[b] これを「代々木八幡駅」と「歩4」に分割するだけなら、やることはこれまでと同じ
[c] ついては、 Mid(densha, sen + 1) の戻り値を受け取る変数を用意しておけば、あとはこれまでと同じ

ということだ、と腑に落ちるかどうかがポイント。それが分かれば、あとは難しくありません。
3分5秒くらいからは、その実装作業。やっていることはNo.7のときとほぼ同じです。


> わかるところからやりなおして、1個ずつ区切っていけばわかるようになったのは、
> 小さな仕事にわけてしまえば難しいことではないということの体験だったなと思います。

まさに、それ。
問題を細分化して、ひとつひとつ片付けること。


232 : 池本利恵さんのコメント (2013-04-06 00:00:00)

こんにちは!

昨日動画を2回見てもわからずギブアップしましたが、5回目でようやく理解できました~^^;

混乱した原因はいきなり変数のオンパレードだったところなので、わかりやすかった動画No.7をもう一度復習して、動画No.8も一回ずつとめて、自分でわかるマクロをかいてみました。何回も自分でマクロをかいているうちに、自分でも最初から変数を使ったほうがやりやすいぞと実感できたことが昨日から今日にかけて一番得たもののように思います。そうなってから動画No.8をみたら、変数のオンパレードもなぜそうするのかよく理解できて話についていくことができました。

あとは、□□線△駅歩☆分の3分割は、いきなり3分割するのではなく、まず□□線と、△駅歩☆分に2分割し、△駅歩☆分を変数におきかえて、2分割するという2ステップになることがポイントと理解しました。

市区分割では、
instr関数で指示したものがみつからないときは0になるということを利用して、if構文が使えるということ、
モノレールの問題では、
instr関数があくまでも何番目に値があるかを教えてくれるものということ、
がわかりました。

No.7まではわかりやすかったのでNo.8は急に難しく感じましたが、わかるところからやりなおして、1個ずつ区切っていけばわかるようになったのは、小さな仕事にわけてしまえば難しいことではないということの体験だったなと思います。

今日のday9の問題にすすめます~☆


231 : ガラパゴスタディー事務局の回答 (2013-02-19 00:01:00)

豊島さん:

いい線、行っていると思いますよ。もう少しでした!
次は、今回よりいいマクロを書けそうですね。


230 : 豊島 久博さんのコメント (2013-02-19 00:00:00)

問題5で、以下のようにしてしまいました。

まずは、"線"がないとき、instr関数で"0"を返してくれることは気が付きましたが、引数だけでなく、left関係などで分割する作業も、条件分岐の中に入れてしまったため、無駄に長いプログラムになりました。

あと、"東京モノレール"を沿線名に掲載するために、"ル"が何文字目か?を探すようにしました。


229 : ガラパゴスタディー事務局の回答 (2013-01-28 00:00:00)

山根さん:

> 書いて・実行して・修正する
> 一つの問題にこれを10回以上やってるような気がします。

いいですね。メチャクチャ力つきますよ!

キレイな模範解答に至るまでの過程、いろいろ学んでください (^^


228 : 山根信行さんのコメント (2013-01-27 00:00:00)

他の方も書いてますが、"モノレール"+4でしたか。
私は"ル"でした。これはさすがに適当すぎるなと反省です。

書いて・実行して・修正する
一つの問題にこれを10回以上やってるような気がします。

模範解答、きれいですねー。


227 : ガラパゴスタディー事務局の回答 (2012-11-22 00:01:00)

おー、力ありますねー!

↓以下、とてもよいと思います。ほとんど、模範解答レベル (^^

Sub rosen()
    Dim ensen
    For ensen = 2 To 51
        Dim densya
        Dim sen
        Dim eki
        Dim ho
        densya = Range("E" & ensen).Value
        sen = InStr(densya, "線")
        eki = InStr(densya, "駅")
        ho = InStr(densya, "歩")
        Range("H" & ensen).Value = Left(densya, sen)
        Range("I" & ensen).Value = Mid(densya, sen + 1, eki - sen)
        Range("J" & ensen).Value = Mid(densya, ho + 1)
    Next
End Sub


以下だと、なおよいかな。

Sub rosen()
    Dim ensen
    Dim densya
    Dim sen
    Dim eki
    Dim ho
    For ensen = 2 To 51
        densya = Range("E" & ensen).Value
        sen = InStr(densya, "線")
        eki = InStr(densya, "駅")
        ho = InStr(densya, "歩")
        Range("H" & ensen).Value = Left(densya, sen)
        Range("I" & ensen).Value = Mid(densya, sen + 1, eki - sen)
        Range("J" & ensen).Value = Mid(densya, ho + 1)
    Next
End Sub


変数は、使う直前までに宣言しておけば、どこでもOKです。
でも、ループの中で宣言すると、くり返しその変数を宣言し直す(その結果、いちいち中身がカラになる)ことになります。
そういうやり方にしたとしても、小人ちゃん的視点で見ると、手間が増えるだけなので。


226 : 佐藤 尚子さんのコメント (2012-11-22 00:00:00)

皆さんいろんな書き方されていますね~
私は問題3を次のように書きました。
Sub rosen()
Dim ensen
For ensen = 2 To 51
Dim densya
Dim sen
Dim eki
Dim ho
densya = Range("E" & ensen).Value
sen = InStr(densya, "線")
eki = InStr(densya, "駅")
ho = InStr(densya, "歩")
Range("H" & ensen).Value = Left(densya, sen)
Range("I" & ensen).Value = Mid(densya, sen + 1, eki - sen)
Range("J" & ensen).Value = Mid(densya, ho + 1)
Next

End Sub

動画とは違ったのですが動いたのでとても嬉しかったです。
また、他の方も質問されていましたが、変数が増えるときは、dimは上から並べていくほうが良いのでしょうか?


225 : 長江秀展さんのコメント (2012-10-30 00:00:00)

なるほど~反復します。


224 : 加藤美智子さんのコメント (2012-10-28 00:01:00)

No.007(問題1,2)まではすぐ出来ましたが問題3で躓きました。「駅名」が入れられず、ずっと苦労していました。
No.008の動画で目から鱗でした。
難しく考えすぎていた(&自分の頭が固いなぁ~)と思いました。


223 : 竹端博希さんのコメント (2012-10-28 00:00:00)

前回の問題は、1と2までだったんですね。昨日の段階で全部解いてしまいましたが・・・

今回の問題では、いろいろ変数を作って、構文を単純化、簡素化することが必要であると感じました。あとは、いろいろ悩まないことかなぁ~。


222 : 久武 美香さんのコメント (2012-10-17 00:00:00)

問題3についてですが、I列は無理やりひねり出して

下記のように書きました(^_^;)
力技という感じで全然スマートじゃないですよね…。

でも問題5でおっしゃてたように、これはこれでありですか?



Sub mondai3()
Dim roseneki
Dim ensen
Dim eki
Dim toho
Dim gyo
For gyo = 2 To 51
roseneki = Range("E" & gyo).Value
ensen = InStr(roseneki, "線") 4
eki = InStr(roseneki, "駅") 10
toho = InStr(roseneki, "歩") 11
Range("H" & gyo).Value = Left(roseneki, ensen)
Range("I" & gyo).Value = Mid(roseneki, ensen + 1, eki - ensen) 無理やり!!
Range("J" & gyo).Value = Mid(roseneki, toho+1)
Next
End Sub

問題5の"モノレール"は全然思いつかなかったです…


221 : 有家 健司さんのコメント (2012-10-14 00:01:00)

昨日のSub act1()では「歩」という字がsheet1のJ列に入ってしまいました。

Sub act1()
Dim cnt
For cnt = 2 To 51
Dim siku
Dim rosen
siku = Range("C" & cnt).Value
rosen = Range("E" & cnt).Value

Range("F" & cnt).Value = Left(siku, InStr(siku, "区"))
Range("G" & cnt).Value = Mid(siku, InStr(siku, "区") + 1)
Range("H" & cnt).Value = Left(rosen, InStr(rosen, "線"))
Range("I" & cnt).Value = Mid(rosen, InStr(rosen, "線") + 1, InStr(rosen, "歩") - InStr(rosen, "線") - 1)
Range("J" & cnt).Value = Mid(rosen, InStr(rosen, "歩") + 1)

Next
End Sub

Sub act2()
Dim cnt
For cnt = 2 To 11

Dim siku
Dim rosen
siku = Range("C" & cnt).Value
rosen = Range("E" & cnt).Value

If InStr(siku, "市") = 0 Then
Range("F" & cnt).Value = Left(siku, InStr(siku, "区"))
Range("G" & cnt).Value = Mid(siku, InStr(siku, "区") + 1)
Else
Range("F" & cnt).Value = Left(siku, InStr(siku, "市"))
Range("G" & cnt).Value = Mid(siku, InStr(siku, "市") + 1)
End If

If InStr(rosen, "ル") = 0 Then
Range("H" & cnt).Value = Left(rosen, InStr(rosen, "線"))
Range("I" & cnt).Value = Mid(rosen, InStr(rosen, "線") + 1)
Else
Range("H" & cnt).Value = Left(rosen, InStr(rosen, "ル"))
Range("I" & cnt).Value = Mid(rosen, InStr(rosen, "ル") + 1)
End If
Next

End Sub


220 : 大椛輝志さんのコメント (2012-10-14 00:00:00)

問題5
"モノレール"、"+4"でよかったんですね。難しく考え過ぎて見事にはまってしまいました。
「マクロなんて、そんなもんですよ!」「とにかく書いてみること」がよくわかる問題、動画でした。

あと、変数がどんどん増えていくときは、
dim=
dim=
dim=
と、dimを上から並べておくほうがいいのでしょうか。
解答を観ながら、そう思ったので、自分のプログラムは修正、今後もそうしようと思いました。


1253 : 小川慶一の回答 (2012-09-03 10:39:00)

達人養成塾 小川です。こんにちは。

毎日、楽しんでいますね (^^


マクロ、ざっと拝見しました。いただいたモノでも悪くないですよ。
というか、自力で考え抜いて、部品を組み合わせてなんとかできることが
いちばん重要です。


表の中にある例外的なデータがどういう状態かによって、
ロジック(IT用語でアルゴリズムと言います)もまた変わってきます。

同じゴールに到達するにしても、やり方はいろいろあってよいですし、
いろいろ思いつく人のほうが上達は早いです。


世間でプログラミング(というか、クリエイティブを発揮して
自力で仕組みを作り上げること)のセンスがいまいち無い人は、
どうしても、「ひとつの正解があって、それに到達すること」だけを
追い求めちゃう傾向があります。

ですが、同じデータは二度とありませんし、
同じ仕事は二度とありません。

そういうひとつひとつのケースで、
ロジックを考えて、ひとつひとつの部品を確実に
作って組み立てられるスキルが必要です。

しかし逆に言えば、そういうすべてが揃っていれば、
あとはどうにでもなる、とも言えます。


余談ですが。。そういう工夫をする気概のない人に限って、
「マクロは私の仕事には使い道がありませんでした」
とか言い出すんですよね。。ちょっと手直しすれば
すぐ使えそうな状況だったりもするんですが (^^;



また、何でもメールください。この数ヶ月の間にどこまでスキルアップできるか
楽しみですね☆



1252 : 受講生さんのコメント (2012-09-03 10:10:00)

パッと出来た割には、

見本で示されたマクロの短さとの違いに、またもや驚きました。

やり方は本当に色々と考えられるのですね。



一応、僕の考えたモノを載せておきます。



'[3]

Sub test()

Dim cel

Dim eki

Dim sen

Dim gyo

For gyo = 2 To 51

cel = Range("E" & gyo).Value

sen = InStr(cel, "線")

eki = InStr(cel, "駅")



Range("H" & gyo).Value = Left(cel, sen)

Range("I" & gyo).Value = Mid(cel, sen + 1, eki - sen)

Range("J" & gyo).Value = Mid(cel, eki + 2)

Next

End Sub



'[4]

Sub test1()

Dim ku

Dim shi

Dim cel

Dim gyo

For gyo = 2 To 11

cel = Range("C" & gyo).Value

ku = InStr(cel, "区")

shi = InStr(cel, "市")

If ku > 0 Then

Range("F" & gyo).Value = Left(cel, ku)

Range("G" & gyo).Value = Mid(cel, ku + 1)

Else

Range("F" & gyo).Value = Left(cel, shi)

Range("G" & gyo).Value = Mid(cel, shi + 1)

End If

Next

End Sub



'[5]

Sub test2()

Dim sen

Dim cel

Dim mono

Dim gyo

For gyo = 2 To 11

cel = Range("E" & gyo).Value

mono = InStr(cel, "ル")

If mono > 0 Then

Range("H" & gyo).Value = Left(cel, mono)

Range("I" & gyo).Value = Mid(cel, mono + 1)

Else

sen = InStr(cel, "線")

Range("H" & gyo).Value = Left(cel, sen)

Range("I" & gyo).Value = Mid(cel, sen + 1)

End If

Next

End Sub


1255 : 小川慶一の回答 (2012-09-02 23:33:00)

達人養成塾 小川です。

手持ちの道具を組み合わせてどんなことができるか?と
いろいろ考えるのは楽しいですね。

> このifの使い方は実務で使えそうですね。

↑この話も、そんなところの延長です。


> また、モノレールの大雑把な使い方も、初心者のうちは目的を達成できるなら、それでいいのかと思えました。もっと洗練された方法を知ったら書き換えればいいだけのことですからね。

まさに、です。
発展編や、さらにハイレベルの上級編に行くと、
基礎編レベルでは大変だったことがあっさり片付くようになります。

そういうところは、エクセル手作業していた人がマクロに感動するのと
構図的には同じですね。


また、いつでも何でもご相談、ご質問ください。




達人養成塾 小川


1254 : 受講生さんのコメント (2012-09-02 22:36:00)

ku = instr(jusho, "区")

if ku = 0 then

ku = instr(jusho, "市")

end if

このifの使い方は実務で使えそうですね。



また、モノレールの大雑把な使い方も、初心者のうちは目的を達成できるなら、それでいいのかと思えました。もっと洗練された方法を知ったら書き換えればいいだけのことですからね。


3日がかりのその仕事、3分で終わらせる方法教えます。ガラパゴスタディーオンライン講座 ユーザー登録

本講座の動画一覧

  1. 【動画1】 If文とForNext構文を組み合わせる
    【動画1】 If文とForNext構文を組み合わせる 未習得
  2. 【動画2】 複数条件を組み合わせた条件分岐
    【動画2】 複数条件を組み合わせた条件分岐 未習得
  3. 【動画3】 ElseIfを使った条件分岐
    【動画3】 ElseIfを使った条件分岐 未習得
  4. 【動画4】 出現回数を数える。CountIf関数がやっていることをマクロで書くと?
    【動画4】 出現回数を数える。CountIf関数がやっていることをマクロで書くと? 未習得
  5. 【動画5】 条件に一致するデータを別表に転記する。AutoFilterより便利な条件抽出マクロ。
    【動画5】 条件に一致するデータを別表に転記する。AutoFilterより便利な条件抽出マクロ。 未習得
  6. 【動画6】 条件に一致するデータを別シートに転記する
    【動画6】 条件に一致するデータを別シートに転記する 未習得
  7. 【動画7】 とびとびに存在するデータを拾って加工する
    【動画7】 とびとびに存在するデータを拾って加工する 未習得
  8. 【動画8】 文字列を加工してデータ転記する(その1)
    【動画8】 文字列を加工してデータ転記する(その1) 未習得
  9. 【動画9】 文字列を加工してデータ転記する(その2)
    【動画9】 文字列を加工してデータ転記する(その2) 未習得
  10. 【動画10】 文字列を加工してデータ転記する(その3)
    【動画10】 文字列を加工してデータ転記する(その3) 未習得
  11. 【動画11】 勘定項目ごとに合計額を算出する。SumIf関数がやっていることをマクロで書くと?
    【動画11】 勘定項目ごとに合計額を算出する。SumIf関数がやっていることをマクロで書くと? 未習得
  12. 【動画12】 残業時間がいちばん多い従業員の情報を出力する。Max関数、Min関数より便利なマクロ
    【動画12】 残業時間がいちばん多い従業員の情報を出力する。Max関数、Min関数より便利なマクロ 未習得
  13. 【動画13】 複数の表の間でのマッチング。VLookUp関数がやっていることをマクロで書くと?
    【動画13】 複数の表の間でのマッチング。VLookUp関数がやっていることをマクロで書くと? 未習得
  14. 【動画14】 文字列を様々に解析して条件分岐
    【動画14】 文字列を様々に解析して条件分岐 未習得
  15. 【動画15】 複数の記号に挟まれた文字列を取り出す
    【動画15】 複数の記号に挟まれた文字列を取り出す 未習得
  16. 【動画16】 各資料ごとに1番からの番号を割り振る。AutoFill機能より便利なマクロ
    【動画16】 各資料ごとに1番からの番号を割り振る。AutoFill機能より便利なマクロ 未習得
  17. 【動画17】 表を解析して1行のリストを作る、1行のリストを解析して表にする(その1)
    【動画17】 表を解析して1行のリストを作る、1行のリストを解析して表にする(その1) 未習得
  18. 【動画18】 表を解析して1行のリストを作る、1行のリストを解析して表にする(その2)
    【動画18】 表を解析して1行のリストを作る、1行のリストを解析して表にする(その2) 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ