
問題3で変数の使い方に慣れてください。
第7回の路線駅名を線と駅名以下にわける方法と基本的には同じことが変数を使えば実現できるというのがわかるかがポイント。基本的には1個を2つにわけるの繰り返し。1個を2つにわけ、わけたうちの1個を2つにわける。このときわけたうちの1個を戻り値とする変数をたてるのがポイントです。あとはInstr関数をつかって区切りの字が何文字目にあるかを調べる変数をたてれば、区切りの字の前か後かは変数-1、変数+1であらわせるというのは第7回と同じ。
問題4、5はInstr関数によって区切りの字の有無もわかるというのがポイント。
Instr関数をつかって区切りの字が何文字目にあるかを調べられると同時に、その字がない場合は値が0となることを利用して、If文を使って区切りの字が1つだけではない場合の処理ができます。またInstr関数はあくまでも区切りの字が何文字目にあるかがわかるだけなので「モノレール」の場合はどうするかよくみて学んでください。
この講座を含む定額コースに参加するか、この講座を購入することで、講座を利用できるようになります。
定額コースに参加すると、そのコースの利用期間中はいつでも講座を利用できます。
講座を購入すると、いつでも講座を利用できます。
学習記録としてメモを残す
質問や感想を投稿する
投稿時に 記号が \ に変換されてしまいますが、気にせず投稿してください。※投稿に必要な権限がありません。
このページへの投稿/コメント
今回のマクロの作成に当たって、まずは何も見ないで作成し、動画を確認しました。"モノレール"の部分でかなり時間が掛かりましたが、なんとか完成しました。
'[5]
'シート「Sheet2」で、E列にある路線駅名の「路線」情報をH列に、駅名以降の情報をI列に書き込むマクロを作れ
Sub test5()
Dim gyo
For gyo = 2 To 51
If InStr(Range("E" & gyo).Value, "駅") <> 0 Then '駅という文字が存在する場合
If InStr(Range("E" & gyo).Value, "モノレール") = 0 Then 'モノレールという文字が存在しない場合
Range("H" & gyo).Value = Left(Range("E" & gyo).Value, InStr(Range("E" & gyo).Value, "線"))
Range("I" & gyo).Value = Mid(Range("E" & gyo).Value, InStr(Range("E" & gyo).Value, "線") + 1)
Else 'モノレールという文字が存在する場合
Range("H" & gyo).Value = Left(Range("E" & gyo).Value, InStr(Range("E" & gyo).Value, "ル"))
Range("I" & gyo).Value = Mid(Range("E" & gyo).Value, InStr(Range("E" & gyo).Value, "ル") + 1)
End If
End If
Next
End Sub
いろんな解法が考えられますね。
TPOに応じて使い分けられるようになると良いかと思います。
たとえば、いただいたものについてあえてコメントすると、「ルール工業地域循環モノレール」等、「モノレール」よりも前に「ル」という文字列が含まれる文字列の場合は正常に動作しないです。
ですが、「モノレール」より前に「ル」という文字列は存在しないという前提であればいただいたマクロで十分です。
ひきつづき、いろいろお楽しみください☆
TPOに合わせて条件を使い分けるようにしたいと思います。
よろしくお願いします。
ここに戻ってくると、そもそもVBAを勉強し始めたのは、何の目的だったのか等、原点に戻れる気がします。「アバウト過ぎて、びっくりする人がいる」けど、マクロ書く時はこんなものです。という言葉に、ハッとしました。(^^)
こうして、また戻って復習できるのは本当に良いですね。
おはようございます。
基礎編演習では、プログラミング初心者向けに、知識だけでなく、プログラムを書き上げる過程で起きるすべてをお伝えしています。
上達してから動画を観ると、また違った感覚があるかもしれませんね (^^
ひきつづき、よろしくお願いいたします。
お久しぶりです。
大げさな表現ですが、VBAの文字列操作関数を一通り覚えるだけで世界が変わり、奇跡が起きたような気がしますね。
どうもお久しぶりです。(^^) 同感です。
vbaの勉強を通して、プログラミングだけではなく
物の見かた・考えた方が変わりました。
言語を学ぶとは、世界の解釈の仕方、表現の仕方の新しい手法を学ぶことです。
僕も、最近はPythonばっかり書いていますが、その過程は、お二人が言われているような体験のくり返しです。
ある程度学習を進めてからより基本的なことを解説する教材で学びなおすと「おお!ここにこんなことが書いてあった!」と思うような体験を何度もします。そのとき、学んでいるスキルそのものについての理解というより、世界への理解が深まるような感じがあります。
こういう体験が好きな方には、プログラミングスキルの学習は楽しいものかと (^^
お世話になっております。こちらの動画の後半で解説されていた路線駅名の処理について質問がございます。私はこのようにプログラムを書いて処理し、設問で指示された回答は出せたので問題ないと思うのですが、小川さんがこの方法を動画で取り上げなかった理由を教えてもらえないでしょうか?
If ku = 0 Then
ku = InStr(roseneki, "ル")
End If
過去のコメントでは、「「手順書としてどうか?」という問いですね。」という回答が小川さんから出されてました。他の人がプログラムをメンテナンスする時に分かりにくいから、という理解でよろしいでしょうか。ご回答宜しくお願い致します。
If と End ifのインデントがずれてしまいましたが、実際の作業ではインデントは揃えて作業していますのでご了承ください
おはようございます。
> 小川さんがこの方法を動画で取り上げなかった理由を
「取り上げなかった理由」というより、Instr関数が検出可能なのは、長さ1文字の文字列だけでない(「モノレール」のような長さ5文字のものでも検出可能)ということはどこかのタイミングでお伝えしたかったので、ここでは、「モノレール」という文字列を検索対象にしてみました。
If ku = 0 Then
ku = InStr(roseneki, "ル")
End If
結果的に正しく動作したなら問題ないとも言えます。
> 過去のコメントでは、「「手順書としてどうか?」という問いですね。」という回答が小川さんから出されてました。
これはまた別の文脈の話です。
このやりとりはここで終わってしまったのでこれ以上書きませんでしたが、たとえば、別の表に、区切り文字候補リストを用意しておき、「そのいずれかと一致したら○○」といった処理のパターンもあります。
本課題と、あと、すでに紹介した「複数の表でマッチングする」というパターンの組み合わせ例です。
試しに、以下の課題を用意してみました。
セルD2:D25には、「北海道旭川市」、「京都府亀岡市」、「東京都稲城市」、「群馬県前橋市」等、「都道府県+それ以下」という文字列が入っています。そして、これらを、「都道府県」と「それ以下」に分割したいとします。
やり方のひとつとして、セルA2:A5には、それぞれ、「都」、「道」、「府」、「県」という長さ1文字の文字列を入れておき、以下のようなプログラムを実行することが考えられます。
Sub split_todofuken()
Dim hida
Dim migi
Dim moto
Dim kugiri
For migi = 2 To 25
moto = Range("D" & migi).Value
For hida = 2 To 5
If InStr(moto, Range("A" & hida).Value) > 0 Then
kugiri = InStr(moto, Range("A" & hida).Value)
Exit For
End If
Next
Range("E" & migi).Value = Left(moto, kugiri)
Range("F" & migi).Value = Mid(moto, kugiri + 1)
Next
End Sub
https://www.dropbox.com/s/phobxg34dza2ls3/todofuken_bunkatsu.xlsm?dl=0
このように、区切り文字候補を入力しておき(あるいは、利用者に自ら入力させ)、その区切り文字をプログラムが見つけて処理をするというパターンはよくあります。
では、そのようなパターンでこのページで紹介した課題のような仕事をするときに、
・線
・ル
と入力させるというルールにするか、
・線
・モノレール
と入力させるというルールにするか、どちらのほうが望ましいかだろうかという議論です。
「どちらのほうが正解」とは一概に言い切れません。
コメントの返信ありがとうございます。いただいた課題を解いてみました。今の実力ではコードの意味を理解して転記し、動作確認するのが精いっぱいだったので、過去動画をやり直して考えずとも手が動くレベルにまで上げていきます。
> ゲストさん:
>
> おはようございます。
>
> > 小川さんがこの方法を動画で取り上げなかった理由を
>
> 「取り上げなかった理由」というより、Instr関数が検出可能なのは、長さ1文字の文字列だけでない(「モノレール」のような長さ5文字のものでも検出可能)ということはどこかのタイミングでお伝えしたかったので、ここでは、「モノレール」という文字列を検索対象にしてみました。
>
>
If ku = 0 Then
> ku = InStr(roseneki, "ル")
> End If
> > 結果的に正しく動作したなら問題ないとも言えます。
>
> > 過去のコメントでは、「「手順書としてどうか?」という問いですね。」という回答が小川さんから出されてました。
>
> これはまた別の文脈の話です。
> このやりとりはここで終わってしまったのでこれ以上書きませんでしたが、たとえば、別の表に、区切り文字候補リストを用意しておき、「そのいずれかと一致したら○○」といった処理のパターンもあります。
> 本課題と、あと、すでに紹介した「複数の表でマッチングする」というパターンの組み合わせ例です。
>
> 試しに、以下の課題を用意してみました。
> セルD2:D25には、「北海道旭川市」、「京都府亀岡市」、「東京都稲城市」、「群馬県前橋市」等、「都道府県+それ以下」という文字列が入っています。そして、これらを、「都道府県」と「それ以下」に分割したいとします。
>
> やり方のひとつとして、セルA2:A5には、それぞれ、「都」、「道」、「府」、「県」という長さ1文字の文字列を入れておき、以下のようなプログラムを実行することが考えられます。
>
>
Sub split_todofuken()
> Dim hida
> Dim migi
> Dim moto
> Dim kugiri
>
> For migi = 2 To 25
> moto = Range("D" & migi).Value
> For hida = 2 To 5
> If InStr(moto, Range("A" & hida).Value) > 0 Then
> kugiri = InStr(moto, Range("A" & hida).Value)
> Exit For
> End If
> Next
> Range("E" & migi).Value = Left(moto, kugiri)
> Range("F" & migi).Value = Mid(moto, kugiri + 1)
> Next
> End Sub
> > https://www.dropbox.com/s/phobxg34dza2ls3/todofuken_bunkatsu.xlsm?dl=0
>
> このように、区切り文字候補を入力しておき(あるいは、利用者に自ら入力させ)、その区切り文字をプログラムが見つけて処理をするというパターンはよくあります。
>
> では、そのようなパターンでこのページで紹介した課題のような仕事をするときに、
> ・線
> ・ル
>
> と入力させるというルールにするか、
>
> ・線
> ・モノレール
>
> と入力させるというルールにするか、どちらのほうが望ましいかだろうかという議論です。
>
> 「どちらのほうが正解」とは一概に言い切れません。
>
講義とは別件で質問をさせていただきたいです。今後、RPAの導入によってExcelマクロをプログラムできる人材の価値が低下するのでは?という疑問が沸いたので、小川さんの考えを聞かせていただきたいです。
決してExcelマクロの勉強を止めようという考えではなく、数年後確実に当社でRPAが導入されることが決まっているので、発生しうる状況に対して心構えを持ち、Excelマクロを勉強していくという思いのもと質問をさせていただきました。
当面の私の課題は、講座でインプットしたことを実務にアウトプットすることであります。
ご回答宜しくお願い致します。
>RPAの導入によってExcelマクロをプログラムできる人材の価値が低下するのでは?という疑問が沸いたので、小川さんの考えを聞かせていただきたいです。
ゲストさん自身は、どう考えますか。
「RPAの導入によってExcelマクロをプログラムできる人材の価値が低下する」という立場で一度考えてみたのでしたら、今度は、逆の立場で試しにその考えに対する意見を作ってみてください。
コメントありがとうございました。
RPAの導入に伴い、Excelマクロをプログラムできる人材の価値が上がるかどうか考えました。
RPAの導入によって、これまでよりも容易にマクロを組むことができますが、RPAでどこまで複雑なマクロが構築できるかは不透明です。そのためマクロを組めても自動記録のような形で終わってしまう例も少なからずあるようです。それから、キントーンのようなシステムを運用する場合、VBAでキントーンとの間でデータの入出力を行う場合もあるため、マクロを書ける人材の価値が落ちることはないと考えられます。
今回は私の思慮が欠けていたため、「価値が上がる」ことについて考えが及びませんでした。
> ゲストさん:
>
> >RPAの導入によってExcelマクロをプログラムできる人材の価値が低下するのでは?という疑問が沸いたので、小川さんの考えを聞かせていただきたいです。
>
> ゲストさん自身は、どう考えますか。
> 「RPAの導入によってExcelマクロをプログラムできる人材の価値が低下する」という立場で一度考えてみたのでしたら、今度は、逆の立場で試しにその考えに対する意見を作ってみてください。
当社ではキントーンの導入に向けての話が進んでいることを確認しました。ガラパゴスタディーではキントーンのような外部プラットフォームとのマクロを構築する講座はございますでしょうか?現在は基礎講座を受講しておりますが、将来的に発展的な講座を受講させていただきたいと考えています。
> ゲストさん:
>
> >RPAの導入によってExcelマクロをプログラムできる人材の価値が低下するのでは?という疑問が沸いたので、小川さんの考えを聞かせていただきたいです。
>
> ゲストさん自身は、どう考えますか。
> 「RPAの導入によってExcelマクロをプログラムできる人材の価値が低下する」という立場で一度考えてみたのでしたら、今度は、逆の立場で試しにその考えに対する意見を作ってみてください。
こんにちは。
RPAのおかげで今の事務仕事での定形作業が激減したとして、価値が下がるのは、従来それらの作業を手作業でしていた人たちです。
一方、「今の事務仕事での定形作業が激減」することで、それまでできなかった仕事まで手が届くようになります。その中にもRPAでなんとかなるものもあるでしょうが、なんとかならないものに対しては、それらを効率的に行えるようにRPA以外の方法で仕組み化したいというニーズが生じます。
2000年代くらいのIT化が一気に促進されたときと同じです。
当時は紙の仕事が電子化されて、手作業をこなすだけの事務員は不要になるのではないかと言われました。
実際には、従来無理だったところまで情報の収集・交換が可能になったことで、彼らには別の仕事が与えられるようになりました。その一方、ITのスキルを有する人の価値は(求められる要求水準も上がり続けてはいますが)向上し続けています。
RPAは、所詮「RからR」の作業を自動化するためのツールです。できることは限られていますし、作業対象側のRの仕様が変わる都度ツールの中身にも変更が発生します。その変更を担えるのはどういう人かというとそれは自動化、効率化の視点があり、プログラミングのスキルがある人間です。
RPA自体、市場では売上は立つかもしれませんが、前述のとおりできることは限られていますので、ビジネス上ではたいしたインパクトはないだろうと考えています。
>RPAの導入によってExcelマクロをプログラムできる人材の価値が低下するのでは?という疑問が沸いたので、小川さんの考えを聞かせていただきたいです。
> 今回は私の思慮が欠けていたため、「価値が上がる」ことについて考えが及びませんでした。
考察の結果はどうでもよいです。
「いったん自分で意見をまとめる」というプロセスを経て、それを示すことで、他者から出てくる言葉も変わりますし、それを受け取るときの入り方も変わります。
エクセルマクロの演習も、「演習を自分なりにやってみてから解答解説を観る」というほうが、軽い興味だけで動画を観るよりも深く入ります。
それと同じです。
> ガラパゴスタディーではキントーンのような外部プラットフォームとのマクロを構築する講座はございますでしょうか?
Web連携講座が近いですね。
https://www.exvba.com/webr.php
キントーンのAPIが提供するようなjsonを取り扱うところまでは解説していません。
(jsonを扱う講座は、先に、Pythonでやりたいと思っていました)
もっとも、キントーンと連携するためのプログラムを開発して公開されている方もいろいろいらっしゃるようです。
記事を読む限り、「発展編2」および「Web連携」を受講済の方であれば活用は難しくはなさそうです。
https://caryncolabo.com/kintonedatareaderforvba/
https://kimama-vba.com/2019/12/15/kintone_excel/
私はオンライン受講生です。「発展編2」と「Web連携」を受講済の立場からの意見です。
RPA導入により、RPAが得意とするWebアプリや会社内の業務システムの自動操作は画期的に見えますが、担当業務の一部が省力化されるだけなのでインパクトは小さいです。実際の業務において、VBAが得意とするExcel内でのデータ操作や集計を組合せが想定できる場合、プログラミングスキルを身につけることが有益と考えます。
貴重なご意見ありがとうございました。
仮にVBAの知識ゼロでRPAを活用しても、活用の結果は大きくないということですね。しかも知識のない作業者そのままではシステムに置き換えられる恐れも考えられます。システムを単に使用することに終わるのではなく、システムを作る側の立場に回り、会社にインパクトを残せる人材になりたいです。
> ゲストさん:
>
> 私はオンライン受講生です。「発展編2」と「Web連携」を受講済の立場からの意見です。
>
> RPA導入により、RPAが得意とするWebアプリや会社内の業務システムの自動操作は画期的に見えますが、担当業務の一部が省力化されるだけなのでインパクトは小さいです。実際の業務において、VBAが得意とするExcel内でのデータ操作や集計を組合せが想定できる場合、プログラミングスキルを身につけることが有益と考えます。
コメントありがとうございます。
web連係講座の内容に興味を持ちました。ネット上の情報をスクリーニングして以下のような情報を集めて解析し、実務で活用することが可能であるという理解で正しいでしょうか?
●業界の最新技術の抽出
●他業界の技術や知識が当業界・当社でも活用できるか否かの判断
●現在から過去20年スパンで発生した業界の製品回収事例
●情報収集から活用ができるマクロを作成し、マクロの知識が皆無の人にもやさしい仕様のマクロが用意できる
> ゲストさん:
>
> > ガラパゴスタディーではキントーンのような外部プラットフォームとのマクロを構築する講座はございますでしょうか?
>
> Web連携講座が近いですね。
> https://www.exvba.com/webr.php
>
> キントーンのAPIが提供するようなjsonを取り扱うところまでは解説していません。
> (jsonを扱う講座は、先に、Pythonでやりたいと思っていました)
>
> もっとも、キントーンと連携するためのプログラムを開発して公開されている方もいろいろいらっしゃるようです。
> 記事を読む限り、「発展編2」および「Web連携」を受講済の方であれば活用は難しくはなさそうです。
> https://caryncolabo.com/kintonedatareaderforvba/
> https://kimama-vba.com/2019/12/15/kintone_excel/
>
>
コメントありがとうございます。
RPAの効果は限定的であり、その中でRPAを活用し業務全体に波及する効果を最大限に引き出せるのはプログラミングの知識があり効率化(自動化)のスキルや経験を持った人間だけということですね。考える機会を与えてくださりありがとうございます。
世の中には情報が溢れているので、自分・会社にとって最も精度の高い仮説を出すことが難しいです。オンライン講座を通して仮説を出す判断力を磨きたいと思います。
> ゲストさん:
>
> こんにちは。
>
> RPAのおかげで今の事務仕事での定形作業が激減したとして、価値が下がるのは、従来それらの作業を手作業でしていた人たちです。
> 一方、「今の事務仕事での定形作業が激減」することで、それまでできなかった仕事まで手が届くようになります。その中にもRPAでなんとかなるものもあるでしょうが、なんとかならないものに対しては、それらを効率的に行えるようにRPA以外の方法で仕組み化したいというニーズが生じます。
>
> 2000年代くらいのIT化が一気に促進されたときと同じです。
> 当時は紙の仕事が電子化されて、手作業をこなすだけの事務員は不要になるのではないかと言われました。
> 実際には、従来無理だったところまで情報の収集・交換が可能になったことで、彼らには別の仕事が与えられるようになりました。その一方、ITのスキルを有する人の価値は(求められる要求水準も上がり続けてはいますが)向上し続けています。
>
> RPAは、所詮「RからR」の作業を自動化するためのツールです。できることは限られていますし、作業対象側のRの仕様が変わる都度ツールの中身にも変更が発生します。その変更を担えるのはどういう人かというとそれは自動化、効率化の視点があり、プログラミングのスキルがある人間です。
>
> RPA自体、市場では売上は立つかもしれませんが、前述のとおりできることは限られていますので、ビジネス上ではたいしたインパクトはないだろうと考えています。
>
> >RPAの導入によってExcelマクロをプログラムできる人材の価値が低下するのでは?という疑問が沸いたので、小川さんの考えを聞かせていただきたいです。
> > 今回は私の思慮が欠けていたため、「価値が上がる」ことについて考えが及びませんでした。
>
> 考察の結果はどうでもよいです。
> 「いったん自分で意見をまとめる」というプロセスを経て、それを示すことで、他者から出てくる言葉も変わりますし、それを受け取るときの入り方も変わります。
>
> エクセルマクロの演習も、「演習を自分なりにやってみてから解答解説を観る」というほうが、軽い興味だけで動画を観るよりも深く入ります。
> それと同じです。
>
お返事ありがとうございます。
> 仮にVBAの知識ゼロでRPAを活用しても、活用の結果は大きくないということですね。
私の会社の事例ですが、会社システムを動かすためのRPA入力データフォーマット用にデータ作成や変換が必要で、そのためのExcel作業に苦労しているようでした。一つでも不備のあるデータが入力されているとRPA動作が途中止まるため、PRA実行中も定期的に動作状況を監視する仕事も発生していました。
このようなケースでは、フォーマット作成・変換をエラーチェックも含めてExcelVBAで事前に処理しておくと効率が良くなりますね。
> …会社にインパクトを残せる人材になりたいです。
私も会社員(ノンプログラマー)です。お互いに頑張りましょう。
よろしければ以下記事もご覧ください。
https://www.chishikinosoukonoseiri.com/entry/2017/11/04/2026
こんばんは。
> web連係講座の内容に興味を持ちました。ネット上の情報をスクリーニングして以下のような情報を集めて解析し、実務で活用することが可能であるという理解で正しいでしょうか?
リストされた内容は抽象的すぎます。具体的な工程が見えないので、なんとも言えません。
こんばんは。
いろいろ努力してください。
プログラミングを学ぶことは、物事をシンプルに考え、シンプルに表現することの練習にもなります。
> 私の会社の事例ですが、会社システムを動かすためのRPA入力データフォーマット用にデータ作成や変換が必要で、そのためのExcel作業に苦労しているようでした。一つでも不備のあるデータが入力されているとRPA動作が途中止まるため、PRA実行中も定期的に動作状況を監視する仕事も発生していました。
> このようなケースでは、フォーマット作成・変換をエラーチェックも含めてExcelVBAで事前に処理しておくと効率が良くなりますね。
事例共有、ありがとうございます。
RからRの仕事は大変ですね。
なお、「RPA実行中の監視」も、DPRで言うところのPに相当します。手順が複雑な割に実入りが少ないのがRからRの仕事の痛いところです。心身ともに消耗するのでがんばった気分にはなれますが、生産性では、きちんと設計されたDからRの仕事にはかないません。
抽象的な質問で申し訳ございません。
基礎講座フォローアップと基礎講座アドバンスドが終了したらまた改めて具体的に質問させていただきます。
> ゲストさん:
>
> こんばんは。
>
> > web連係講座の内容に興味を持ちました。ネット上の情報をスクリーニングして以下のような情報を集めて解析し、実務で活用することが可能であるという理解で正しいでしょうか?
>
> リストされた内容は抽象的すぎます。具体的な工程が見えないので、なんとも言えません。
>
コメントありがとうございます。
講座で学んだことを実務にアウトプットし、その上で実務能力を向上させ、会社にインパクトを与えられる人材になります。
> ゲストさん:
>
> こんばんは。
>
> いろいろ努力してください。
> プログラミングを学ぶことは、物事をシンプルに考え、シンプルに表現することの練習にもなります。
プログラミングを学ぶことは、実現したい状態を機能に分解して実装する、思考と行動の訓練です。
ある程度努力すれば、自分が実現したいことは何か、それを機能に分割するとどうなるか、プログラミング技術はそのうちのどの部分を担うものかということも自分で判断がつくようになるでしょう。
コメントありがとうございます。勉強の励みになります。
講座を受講して2か月弱になりますが、以前よりも周囲とのコミュニケーションが円滑に進められ、実務においても作業の改善が見えるようになりました。学習を継続します。
> ゲストさん:
>
> プログラミングを学ぶことは、実現したい状態を機能に分解して実装する、思考と行動の訓練です。
> ある程度努力すれば、自分が実現したいことは何か、それを機能に分割するとどうなるか、プログラミング技術はそのうちのどの部分を担うものかということも自分で判断がつくようになるでしょう。
>
以下、再読されることをおすすめします。
この2ヶ月の成果についての再整理、この先何を心がけてどう学んでいくかという指針作りに役立つことと思います、
https://www.exvba.com/4skills.php
コメントありがとうございます。
お送りいただいたリンクは折に触れて見直しております。
小川さんのプロフィールについても拝見させていただきました。
こちらのページもなかなか重要なポイントが詰まっていると感じました。
https://www.exvba.com/taosu.php
マクロを活用し、実務で成果を出すために重要な各項目を実際に確認できたので良かったと思います。
> ゲストさん:
>
> 以下、再読されることをおすすめします。
> この2ヶ月の成果についての再整理、この先何を心がけてどう学んでいくかという指針作りに役立つことと思います、
> https://www.exvba.com/4skills.php
>
> こちらのページもなかなか重要なポイントが詰まっていると感じました。
> https://www.exvba.com/taosu.php
↑
これ、すごい大事です。
よいスキルアップにつながればと思っています。ひきつづきよろしくお願いいたします。
お世話になっております。解説見る前に過去の動画を見ながら作成していますが、模範解答のようにきれいにならないこともあります泣
問題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
「区」と「市」くらいしかないし、いただいたコードでも良いかと思いますよ。
> マクロを書くときに、シンプルに考える工夫などありますか。よく物事を複雑に考えすぎると言われてしまうので…
普段からシンプルに考え、表現することです。
以前言語の言語能力とプログラミング言語の言語もあるとには高い相関があります。
○エクセルマクロ習得に関係する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
> エディッタ画面を当然開いてやりますから、周りから「何してんねん」と声がかかり始めてまあ変なことしてるな~と見られ始めました。
> どこかの講座でこのようなことになるよってあったような、、、ほんとですね。
「仕事での成果につながる、そして、そのやり方は自分にマネできない」となれば、周囲からの信頼がますます増します。
ちょうど、先日、とある受講生の方から以下のような声をいただきました。
morimotoさんの将来の姿と重ね合わせて読んでください。
○ガラパゴスタディ―で学ぶ前どのような事に悩んでいましたか?
・仕事が片付かない。
・ITに弱い。
・VBAがわからない。
○ガラパゴスタディ―の有料講座で学んだ感想をお書きください。
・仕事の改善効果は、自動化、手順書化して部下に任せて、自分はよりマネジメントに時間とエネルギーを投資できています。
○ガラパゴスタディ―で学んだことはあなたのお仕事にどのように活かされていますか。
・思考の整理整頓、スピードが早くなり、問題解決の質、スピードも格段に上がった。
・その結果、今の会社の部署で「任せられるのは、お前しかいない!」と言われるようになった。
・また、5歳と8歳の子供たちにも、小川先生に指導していただいた本質的な学習方法、教育方法を子どもたちに指導出来ているので、8歳の長男は学年で1、2位の成績で、次男も成績を残している。
○今後ガラパゴスタディーに求めることは何ですか
・今のままで、十分満足していますが、より高次元で多岐にわたる講座を作って欲しいです。
> 会社で時間があればフォロアップの演習してます。
> エディッタ画面を当然開いてやりますから、周りから「何してんねん」と声がかかり始めてまあ変なことしてるな~と見られ始めました。
> どこかの講座でこのようなことになるよってあったような、、、ほんとですね。
質問に対するご指導、
ありがとうございました。
[a] Dim ... , Dim ... という変数宣言を、
Subプロシージャ先頭のほうで固めた方が良さそうな気がするけど、
[c] 変数が登場する順序と、それらの変数を使う順序は
一致していた方が良いのかな?
と思っていましたが、正確に表現できていませんでした。
宣言してから、値を格納するという点、
動画を復習します。
今後ともよろしくお願い致します。
またお気軽にどうぞ!
> 小川 様
>
> 質問に対するご指導、
> ありがとうございました。
>
> [a] Dim ... , Dim ... という変数宣言を、
> Subプロシージャ先頭のほうで固めた方が良さそうな気がするけど、
> [c] 変数が登場する順序と、それらの変数を使う順序は
> 一致していた方が良いのかな?
>
> と思っていましたが、正確に表現できていませんでした。
>
> 宣言してから、値を格納するという点、
> 動画を復習します。
>
> 今後ともよろしくお願い致します。
実際に変数を記述した式の順番、
これについて教えて頂けますでしょうか。
変数を、「必要だ」と自分が気付いた順番で記載すると、
'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 ばかりにはならず、きれいに揃いません。
それを整理しようとした時に、
どういう順番で整理するのが正しいのかをご指導願います。
> 「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://forum.pc5bai.com/lesson/page/104/
基礎講座第1章9 - 変数を活用するときの注意点
https://forum.pc5bai.com/lesson/page/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
ありがとうございます。
はじめに見ていただいたマクロと比較するとInstr関数の引数の指定のない部分がちがっていますね、、、。
惜しかったと思わずに、しっかり復習してできるだけたくさんのマクロをかいてスキルアップしていきたいと思います。
これからもよろしくお願いします。
慣れるとさくさく書けるようになりますよ。
書けば書くほど上手になります。むしろ、最初からここまでできたならなかなかすごいです。
ひきつづき、お楽しみください☆
> 小川様
>
> ありがとうございます。
> はじめに見ていただいたマクロと比較するとInstr関数の引数の指定のない部分がちがっていますね、、、。
> 惜しかったと思わずに、しっかり復習してできるだけたくさんのマクロをかいてスキルアップしていきたいと思います。
> これからもよろしくお願いします。
問題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
アドバイスお願いいたします。
これですと、たとえば、「大渓谷線歩みが原駅歩11」みたいな文字列をキレイに分解できませんね。
「『線』より前に『駅』はない。『駅』より先に『歩』はない」という前提でしたら、これでもOKです。
お返事ありがとうございます。
ご指摘いただいた「大渓谷線歩みが腹駅歩11」の場合ですが
toho = InStr(6, jyusyo, "歩")
とすることで解決するのですが、この場合のみの限定マクロになってしまいます。より一般化するには、先に進まないと難しいのでしょうか?
今まで学んだ発想でも可能でしょうか?
おはようございます。
> とすることで解決するのですが、この場合のみの限定マクロになってしまいます。
> より一般化するには、先に進まないと難しいのでしょうか?
> 今まで学んだ発想でも可能でしょうか?
ですので、この動画の3分ぐらいのところから示している通り、
・「駅」という文字の場所を探し
・その結果を変数に格納し
・Instr関数の第1引数にその変数の値+1を格納して「歩」という文字の場所を探す
という流れになります。
そういう視点で、この動画でもう一度学び直し見てください。
考え直しました。
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
どうでしょうか?
> どうでしょうか?
まずは、ゲストさんご自身が(見本と比べて)どう思うか?考えてみてください。
そして、考えたことをここに書いてみてください。
見本と比べて考察を深めるには、もう一度動画を見直して、動画で示したやり方で(何も見ないで)イチから同じマクロを自力で書いてみると良いです。
考察に当たっては、最低でも以下のことくらいは十分に検討する必要があるでしょう。
[1] 見本のやり方と比べてのメリットは?
[2] 見本のやり方と比べてのデメリットは?
[3] [1], [2]をふまえたうえで、あえてご自身で考えた方法を採用したいと思う相当な理由は?
よろしく、お願いします。
[1] 見本のやり方と比べてのメリットは?
駅名に歩がある場合に対応できる。
[2] 見本のやり方と比べてのデメリットは?
変数が2つ増えてややこしくなった。
[3] [1], [2]をふまえたうえで、あえてご自身で考えた方法を採用したいと思う相当な理由は?
変数はふえたものの、駅名に歩がある場合に対応できるので、私のマクロを採用する。
こう考えました。よろしくお願いします。
なるほど。
すっきり書くなら、こんな感じ↓ですかね。
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] 書き出しセクション
と、分けて書いたほうが可読性も高いし、シンプルです。
「『線』以外に『モノレール』もある」等のバリエーションよりもしっかり解説すべきなような気がしてきました。
おもしろいテーマですので、いずれ、演習問題としてもこれを追加したいと思います。
ありがとうございます。
ここがとても勉強になりました。
コメントありがとうございます。
これは頻出パターンなんで、ぜひこの機会にモノにしてください!
> 「instr関数:該当しない場合は、0を返す」
> ここがとても勉強になりました。
書いたあとだと、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
> 書いたあとだと、Instr(range(~)など、同じようなものが出てくるし、変数を使った方がすっきりするな、と思うんですが、書いている途中だと変数の使い方がピンときませんでした。
順調ですよ (^^*
最初のうちは、書き終わってからも気づきません。
慣れてくると、書き終わってから気づくようになります。
さらに慣れてくると、書いている途中に気づくようになります。
さらに慣れてくると、書く前から気づくようになります。
さらに慣れてくると、「気づく」レベルを超えて、瞬間的に正解が思い浮かぶようになります。
ですね。
instr関数の結果を用いて条件分岐するというのは、とてもよくあるパターンです☆
> 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ケースバイケースですよ。
「路線名のリストを作ってそれらだったら例外処理をする」とかもありですし、「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日々の継続、大切ですね。
ひきつづきお楽しみを!
>前回から間をあけてしまったら、かなり忘れてしまいました。やっぱり間をあけずに継続してやるのが一番と痛感しました。