
変数の値を初期化(値を0にする)してからループを繰り返すパターン。
[1]出現回数をあらわす変数をたてて出現するたびに1つ増やす仕組み
[2]For Next構文で調べ終わったあとに最後の合計を表示する仕組み
[3]最後の合計を表示したらその変数の値を一度0に戻してから次のループに入る仕組みをよくみてください。
この講座を含む定額コースに参加するか、この講座を購入することで、講座を利用できるようになります。
定額コースに参加すると、そのコースの利用期間中はいつでも講座を利用できます。
講座を購入すると、いつでも講座を利用できます。
学習記録としてメモを残す
質問や感想を投稿する
投稿時に 記号が \ に変換されてしまいますが、気にせず投稿してください。※投稿に必要な権限がありません。
このページへの投稿/コメント
以前は相当理解に苦労した問題でしたが、
今回は完璧に理解できていました。
実務でもカウンタ変数を回して結果を書き出すマクロを作って役立ており、
苦労してマスターしたおかげだと思っています。
ポイントは、F8・ステップインで、1行ずつVBAの動きを確認し、
変数がどこで値を取得し、変化し、クリアされるかを丁寧に追っていく、
これを繰り返すことが、理解の早道だと思いました。
>実務でもカウンタ変数を回して結果を書き出すマクロを作って役立ており、苦労してマスターしたおかげだと思っています。
なによりです。
>以前は相当理解に苦労した問題でしたが、今回は完璧に理解できていました。
乱暴にまるめた言い方をすると、抽象的思考力や空間把握能力、時系列変化把握能力が向上したということかと思います。
今となっては、課題を解くまでのプロセスのすべてが、手を動かさなくてもより明快にイメージできるのではないでしょうか。
>ポイントは、F8・ステップインで、1行ずつVBAの動きを確認し、
>変数がどこで値を取得し、変化し、クリアされるかを丁寧に追っていく、
>これを繰り返すことが、理解の早道だと思いました。
「明快にイメージ」するときは一瞬ですが、一瞬で明快にイメージできるようになるには、全体を見渡しながら検証することも大切ですし、同時に、時間をかけて微細な部分を観察しながら検証することも大切です。
習得には終わりはありません。
ここでの学びを、今後の学びに活かしていただければと思っでいます。
こちらの回のみ、この動画は、再生できませんとなり
再生が出来ません。
ご確認いただけますでしょうか?
宜しくお願い致します。
お世話になります。
この度は、ご迷惑をおかけしました。
動画の再生環境を復旧させました。
youtube側で予期せぬタイミングで設定の自動変更があり、そのため、本動画を含めてかなりの量の動画が非公開になってしまいました。
昨晩ご指摘を受けた段階から調査と対応を行い、現在はほぼ復旧したことを確認のうえ、様子を見ているところです。
おそらくもう同じ理由ではこの現象は再発しないだろうと考えてはおりますが、もしまた何かあった際は遠慮なくお問い合わせください。
ひきつづき、どうぞよろしくお願いいたします。
小川
動画の1分前後あたりからおっしゃられている、「合計点数が100点以上の人だけを抽出して転記する方法」について
どの講座で紹介されていましたでしょうか?
現在、「エクセルマクロ・VBA導入編」「エクセルマクロ・VBA基礎編」を受講し終わった状態です。
もうしわけありません。実は、動画収録のあと、一部の演習の順序を入れ替えてしまっています。
ここで言っている「合計点数が100点以上の人だけを抽出して転記する方法」は、次の演習で解説しています。
(動画の編集もしたほうが良いですね...)
ご了承いただければと存じます。
ひきつづき、よろしくお願いいたします。
学習した記憶がなかったもので自分が見落としてしまったのかと思っておりました。
次の演習で解説してくださっているとのことなので今回の演習と合わせて学習しようと思います。
ひきつづき、よろしくお願いいたします。また、いつでもお気軽にコメント等いただければと思います。
差し替えを行いましたので、改めて視聴いただければと存じます。
不手際でご迷惑をおかけしており、大変恐縮です。
ひきつづきよろしくお願いいたします。
こんにちわ
先生の講義はわかりやくすてすらすら頭に入ってきます。
この調子で進めていきたいと思います。
[2]の回答を復習したとき、最後のfor next構文でお団子のとる範囲を間違えて最後の行を取りこぼしてしまいました。
間違いだということはすぐ理解できたのですが、
その時のマクロの実行結果が私の推測と違っていたので、質問させていただきました。私の推測では、F6に6が表示されると思ったのですが、実際はF7に表示されました。理由をお教えいただけますでしょうか。
復習で書いたマクロは以下のものとなります。
Sub countif_3()
Dim goukei
Dim gyo2
For gyo2 = 4 To 6
goukei = 0
Dim gyo
For gyo = 4 To 18
If Range("c" & gyo).Value = Range("e" & gyo2).Value Then
goukei = goukei + 1
End If
Next
Next
Range("f" & gyo2) = goukei
End Sub
ほとさん:
> 私の推測では、F6に6が表示されると思ったのですが、実際はF7に表示されました。理由をお教えいただけますでしょうか。
言い換えると、ご質問は、「For Next構文で使うカウンター用の変数が、For Next構文を抜けたときにどういう値になっているか?」ということですね。
経験的に、どうも、For Next構文では、
For x = a To b
Next
で、xの値がaからbの範囲にいなくなったタイミングでループを抜けるようですね。
なので、ループを抜けた直後は、 b + 1 になっているようです。
とはいえ、Visual Basicという言語がそれを保証しているわけではありません。
For Next構文のカウンター変数の値は、For Next構文内では利用価値がありますが、For Next構文を抜けたら利用価値はない、と思っておいてください。
この件は話しだすと長くなるので、まずはこのへんで。
ループを抜けた時の挙動は保証されていないということですね。
承知しました。
今後、気をつけるポイントにしたいと思います。
ところで、質問ですが、ドットバリュー(.value)は入力しなくても、
今のところ支障なく作動するようですが、この先 発展編にすすむとまずいことはでてきますか? 書店で購入した本が、range("A1").value等の
入力の場合、ドットバリュー(.value)は打たなくても問題がないという記述があったので、今まで入力していません。
Range("A1") と Range("A1").Value とでは、それが示すものが厳密には異なります。
Range("A1"): 「セルA1」というオブジェクト
Range("A1").Value: 「セルA1の値」というプロパティ
その差は、基礎編レベルのころには意識しなくてもまあ大丈夫かもしれません。
が、「結果的に同じ動きをするから」と、その差に無頓着なままでいると、学習が発展編1レベルまで進んだときに、行き詰まります。
以下の記事も参考にしてください。
そのうえで、追加の質問なり感想なりいただければ、と思います。
○「セルの値」を指定するとき、.Value は省略してよいものか? – Excelマクロ・VBA
https://www.exvba.com/2183/
> 一回目に見たときに感動したのですが、土日だけ復習しているとすぐに忘れてしますので、思い切ってスマホを大型に買い替えて、ゴールデンウィーク明けからは、電車のなかでこの動画を通勤中に見るようにします。
>
> ところで、質問ですが、ドットバリュー(.value)は入力しなくても、
> 今のところ支障なく作動するようですが、この先 発展編にすすむとまずいことはでてきますか? 書店で購入した本が、range("A1").value等の
> 入力の場合、ドットバリュー(.value)は打たなくても問題がないという記述があったので、今まで入力していません。
講義中で行われていたように、変数の値を丁寧に追いかけることで理解につながりました。
お返事、遅れました。
そうですね。
一行一行マクロを実行したとき、どういう状況になるか?しっかりキャッチアップしていくことがとても大切です。
ひきつづき、お楽しみください☆
> マクロの実行に伴って変数の値が推移する。
> 講義中で行われていたように、変数の値を丁寧に追いかけることで理解につながりました。
最初は理解できなかった(for next構文の中にfor next構文)が、復習するにつれだんだんとわかってきた。リアルでの例えがわかりやすくて納得できました!
[質問]
countif関数で=COUNTIF(C$4:C$18,"=" & E4)をなっておりますが、第2引数に"=" & をつけるのはなぜでしょうか(E4だけで動くと思うのですが)?
「複数変数を使う、そのうちひとつの値は自分で変更する」ということで、最初の関門とも言える問題です。
くりかえしましょう!
> 第2引数に"=" & をつけるのはなぜでしょうか(E4だけで動くと思うのですが)?
そうなんですか。
僕はエクセルのワークシート関数詳しくないので。どちらでも動けばよいのではないでしょうか。
こんにちわ
[2]の回答を作ったのですが、このような形でもいいのでしょうか?
Sub mondai2()
Dim siso
Dim kanpyo
Dim nomimono
Dim gyo
For gyo = 4 To 18
If Range("C" & gyo).Value = "しそ巻き無料" Then
siso = siso + 1
ElseIf Range("C" & gyo).Value = "飲みもの無料" Then
nomimono = nomimono + 1
ElseIf Range("C" & gyo).Value = "かんぴょう巻き無料" Then
kanpyo = kanpyo + 1
End If
Next
Range("F4").Value = siso
Range("F5").Value = nomimono
Range("F6").Value = kanpyo
End Sub
こんばんは。
もしも調査対象が「しそ巻き無料」、「飲みもの無料」、「かんぴょう巻き無料」の3つだけなら、ご提案のやり方もありかと思います。
でも、調査対象が100も200もあったら、そうはいかないですね (^^;
動画で示した方法は、調査対象がいくつあっても困らない書き方です。
> 小川先生
> こんにちわ
> [2]の回答を作ったのですが、このような形でもいいのでしょうか?
Sub mondai2()
Dim siso
Dim kanpyo
Dim nomimono
Dim gyo
For gyo = 4 To 18
If Range("C" & gyo).Value = "しそ巻き無料" Then
siso = siso + 1
ElseIf Range("C" & gyo).Value = "飲みもの無料" Then
nomimono = nomimono + 1
ElseIf Range("C" & gyo).Value = "かんぴょう巻き無料" Then
kanpyo = kanpyo + 1
End If
Next
Range("F4").Value = siso
Range("F5").Value = nomimono
Range("F6").Value = kanpyo
End Sub
コメントありがとうございます。
確かに調査対象が数百個あったら私のやり方では限界がありますね。
今一度動画を見返して、小川さんのやり方を頭に入れたいと思います。
小川慶一さん:
> ゲストさん:
>
> こんばんは。
>
> もしも調査対象が「しそ巻き無料」、「飲みもの無料」、「かんぴょう巻き無料」の3つだけなら、ご提案のやり方もありかと思います。
> でも、調査対象が100も200もあったら、そうはいかないですね (^^;
>
> 動画で示した方法は、調査対象がいくつあっても困らない書き方です。
>
>
> > 小川先生
> > こんにちわ
> > [2]の回答を作ったのですが、このような形でもいいのでしょうか?
>
>
Sub mondai2()
> Dim siso
> Dim kanpyo
> Dim nomimono
> Dim gyo
> For gyo = 4 To 18
> If Range("C" & gyo).Value = "しそ巻き無料" Then
> siso = siso + 1
> ElseIf Range("C" & gyo).Value = "飲みもの無料" Then
> nomimono = nomimono + 1
> ElseIf Range("C" & gyo).Value = "かんぴょう巻き無料" Then
> kanpyo = kanpyo + 1
> End If
> Next
> Range("F4").Value = siso
> Range("F5").Value = nomimono
> Range("F6").Value = kanpyo
> End Sub
>お返事ありがとうございます。
このお題は、実は、極めて重要です。「身体が勝手に動いて正解してしまう」というところまで練習されるとよいかと思います。そこまでたぶんもうあと少しです。
ひきつづき、お楽しみください☆
> 小川先生
> コメントありがとうございます。
> 確かに調査対象が数百個あったら私のやり方では限界がありますね。
> 今一度動画を見返して、小川さんのやり方を頭に入れたいと思います。
>
> 小川慶一さん:
>
> > ゲストさん:
> >
> > こんばんは。
> >
> > もしも調査対象が「しそ巻き無料」、「飲みもの無料」、「かんぴょう巻き無料」の3つだけなら、ご提案のやり方もありかと思います。
> > でも、調査対象が100も200もあったら、そうはいかないですね (^^;
> >
> > 動画で示した方法は、調査対象がいくつあっても困らない書き方です。
> >
> >
> > > 小川先生
> > > こんにちわ
> > > [2]の回答を作ったのですが、このような形でもいいのでしょうか?
> >
> >
Sub mondai2()
> > Dim siso
> > Dim kanpyo
> > Dim nomimono
> > Dim gyo
> > For gyo = 4 To 18
> > If Range("C" & gyo).Value = "しそ巻き無料" Then
> > siso = siso + 1
> > ElseIf Range("C" & gyo).Value = "飲みもの無料" Then
> > nomimono = nomimono + 1
> > ElseIf Range("C" & gyo).Value = "かんぴょう巻き無料" Then
> > kanpyo = kanpyo + 1
> > End If
> > Next
> > Range("F4").Value = siso
> > Range("F5").Value = nomimono
> > Range("F6").Value = kanpyo
> > End Sub
> >一気に難易度が上がった感覚があるのですが、
おそらく基礎編の理解が不十分だからなのだと思います。
先生の言葉にあったように、回答を鵜呑みにしてとにかく練習を繰り返そうと思います。フォローアップ講座を進めながら、同時並行で本編の復習を開始します。
工程をまる覚えするのも大切ですが、その前に、より抽象的なところで、ベースになる考え方を腑に落とすことも大切です。
このページにある、解説文「【補足】」は読まれましたか。
「リアルならどう?」という問いをしっかり持って、それがマクロではどう表現されているのか?というところを読み解くつもりで、解説文を読み、完成形のマクロを観察し、変数の値の変化を確認しつつ[F8]でステップイン実行し、そして、工程をまる覚えするいきおいでプログラムを書く練習をしてください。
> 答えを見るまで自力では解くことができませんでした。
> 一気に難易度が上がった感覚があるのですが、
> おそらく基礎編の理解が不十分だからなのだと思います。
>
> 先生の言葉にあったように、回答を鵜呑みにしてとにかく練習を繰り返そうと思います。フォローアップ講座を進めながら、同時並行で本編の復習を開始します。
>
setステートメントは、発展編1で登場します。
発展編1まで学習を進めた方が基礎編演習に戻ってきたときのコメントで出てくることがありますが、今の段階では気にされなくてOKです。
情報過多になるより、手元の道具を組み合わせて目的を達成できる腕力をつけるほうがこの時期には上達と成果への近道です。
とはいえ、「どうしても」ということでしたら解説できないこともないですが...。
ともあれ、ひきつづきお楽しみください☆
> 小川先生、何度も質問すみません。setステートメントと言うのは、どこの講座で出てきますか?ご紹介頂いたところまでまず勉強してから、質問すべきだなと思いました。しかし、時々setの変数が出てくるので、読んで理解したいのです。小川先生の講座のお陰で本当に仕事が捗り、仕事が楽しくなりました。ありがとうございます。
2月に基礎編を申し込んで、やっと基礎編フォローアップになりました。奥が深く大変為になります。すみません、教えて頂きたいのですが、出勤簿の精査をしていますが、人数が5.60にんいて、それを毎回一覧表に転記してから、画面と見比べてチェックしています。それぞれのブックを開いて、一覧表に転記すると言うマクロの講座はありますか?このブックを開く関数や変数の使い方が難しくて、さっぱりわかりません。
マクロの勉強、お楽しみいただけているようでしたらなによりです。
基礎編だと、「基礎編フォローアップ アドバンスド」 https://forum.pc5bai.com/lesson/course/86 の後半がまさにそんな感じかなと思います。
どうでしょう?
> 小川先生、こんにちは。
> 2月に基礎編を申し込んで、やっと基礎編フォローアップになりました。奥が深く大変為になります。すみません、教えて頂きたいのですが、出勤簿の精査をしていますが、人数が5.60にんいて、それを毎回一覧表に転記してから、画面と見比べてチェックしています。それぞれのブックを開いて、一覧表に転記すると言うマクロの講座はありますか?このブックを開く関数や変数の使い方が難しくて、さっぱりわかりません。
goukei=goukei+1 どこにコードを書くかゆっくり考えればできそうです。
だめならどこかに入れてf9で1つ1つどうなるか検証ですね。
ありがとうございます。
ふれあい広場最強ですw
> ふれあい広場の例えはほんとわかりやすい。初期値goukei=0と
> goukei=goukei+1 どこにコードを書くかゆっくり考えればできそうです。
> だめならどこかに入れてf9で1つ1つどうなるか検証ですね。
ここは最初の関門かもしれませんね。
ページ内の解説にある「牧場の子供ふれあい広場」の話もご確認ください。
> 変数が複数出てくると途中で混乱してしまい、なかなかついていくのが難しいですが、ひとつづつ説明いただいているので構造的には理解できそうです!落ち着いて、構造を把握してひとつずつ検証するのと、トライアンドエラーの繰り返しが必要そうです
講義は有難いのに、私が吸収できません。
申し訳ございません。
講義動画、4分26秒の箇所で質問です。
C4から18までの「しそ巻き無料」の回数を数えたかったので
添付ファイルのような式を書きました。
すると、
エクセルシート名:キャンペーン名簿1のセルF4に
「1」という答えが出て、間違えました。
小川先生の回答は、
' If Range("C4").Value = "しそ巻き無料" Then の後が、
'goukei = goukei + 1
になっています。
私が書いた式だと、
どういう意味になってしまうのでしょうか??
もしかして、
goukei = goukei + 1 の部分で、
「しそ巻き無料」の回数を累計させているのでしょうか??
ご指導、お願い致します。
> もしかして、
> goukei = goukei + 1 の部分で、
> 「しそ巻き無料」の回数を累計させているのでしょうか??
そういうことです。
「しそ巻き無料」を見つける都度、左手に持ったカウンターの値を、1ずつ増やしています。
このページに書かれている、
【補足】この問題の解答は、...
以降のたとえ話はもう読まれましたか?
以下、そのたとえ話に沿って説明し直してみます。
>私が書いた式だと、
>どういう意味になってしまうのでしょうか??
受講生さんは書いたマクロは、
【補足】で書いたたとえ話で言うなら、
・左手に持ったカウンターの値は0から一度も変えずに、
・集計用紙に、カウンターの値に1を足した値(つまり、カウンターの値は0のままですから、常に1ですね)を書き込む
ということをくり返している状態です。
まずは以上のとおりです。
「For Next構文用の変数」と「カウンター用の変数」をひとつのプログラムの中で取り扱うのは、確かに(最初は)難しいかもしれませんね (@_@;
ここは、自分でマクロを書いたり、実行したり、解説を聞き直したり、読み直したり、他の人とのやり取りを読んだり、として、飲み込めるまで何度も復習してください。
数日くらい悩んでも構いません。ここで数日じっくり取り組むことは、一生の財産になるでしょう。
またいつでもどうぞ (^_^; ☆彡 (^_^; ☆彡 (^_^; ☆彡 (^_^; ☆彡 (^_^; ☆彡 (^_^; ☆彡 (^_^; ☆彡 (^_^; ☆彡 (^_^; ☆彡
> お世話になります。
>
> 講義は有難いのに、私が吸収できません。
> 申し訳ございません。
>
> 講義動画、4分26秒の箇所で質問です。
>
> C4から18までの「しそ巻き無料」の回数を数えたかったので
> 添付ファイルのような式を書きました。
>
> すると、
> エクセルシート名:キャンペーン名簿1のセルF4に
> 「1」という答えが出て、間違えました。
>
> 小川先生の回答は、
>
> ' If Range("C4").Value = "しそ巻き無料" Then の後が、
> 'goukei = goukei + 1
>
> になっています。
>
> 私が書いた式だと、
> どういう意味になってしまうのでしょうか??
>
> もしかして、
> goukei = goukei + 1 の部分で、
> 「しそ巻き無料」の回数を累計させているのでしょうか??
>
> ご指導、お願い致します。
Sub rensyu1219_001()
'しそ巻きカウント
Dim gokei 'カウント数
Dim migi ' カウント数を記入する場所の行位置の値
Dim hidari ' 項目が書かれているリストの行位置の値
For migi = 4 To 6 'カウント数を記入する行位置範囲の指定
gokei = 0 '一つループが終わったらgokeiを初期化する
For hidari = 4 To 18 '一つの項目について該当したらgokeiに加算する
If Range("c" & hidari).Value = Range("E" & migi).Value Then
gokei = gokei + 1
End If
Range("F" & migi).Value = gokei 'この時点での加算結果を書き込む
Next
Next
End Sub
正解と異なる点は、1項目のカウントが終了した時点で
合計値を書き込むタイミングです。
endIfで個別の行の判別を終えた後、nextで次の行へ移る前に
カウント値を書き込んでいます。
こうすると、1行ごとのカウント値が「見える化」し、
上書きを繰り返すことによって、最終的には正しいカウントが
書き込まれますね。
これは確信犯的にそうしたわけではなく、
「どこでカウント値を書き出すか」のタイミングにまだ迷いがあったため
nextで戻る前に置いてみただけなのです。
どこでgokeiを初期化するかで迷うのと似ていますね。
入れ子のnextから抜けるときにgokeiを記入し、初期化し、
それから次の行の項目に移動する、が正しい流れですね。
でも、1行ごとの結果をそのたびに書き出し、上書きする仕組みは
それ自体面白いし、使える局面があるかもと思ったので、
ご紹介しました。
gooska
おはようございます。
>フォローアップで一番悩み、記憶に刻まれていたのがこの問題です。
複数の変数を扱うの、ここが最初ですからね。
戸惑いもあるかもしれません。
そこを乗り越えると簡単なのですが。
というか、実は、エクセルマクロって、要は、以下の3つがすべてです。
[1] 調査対象を変数を使って指定する
[2] 出力先を変数を使って指定する
[3] 条件に一致するか?を調べる
あとは、[1], [2], [3]それぞれについて引き出しを増やしていくだけです。
> でも、1行ごとの結果をそのたびに書き出し、上書きする仕組みは
> それ自体面白いし、使える局面があるかもと思ったので、
> ご紹介しました。
いただいたプログラムだと、結果の出力回数が見本より多いですね。
「条件に該当するデータが10万行あるデータだったとしたらどうだろか?」とか考えてみてください。
見本で示した書き方だと出力は1回だけです。
都度出力すると、出力は10万回です。
おはようございます。
早朝からご返信ありがとうございます。
確かに、処理行数が10万業務だった場合の事を考えると、無駄な出力が10万回行われることになり、不適切であったことがはっきり分かりました。(実際、次の職場では、10万件以上のデータを扱うことになり、マクロを組まないと手作業では無理な量です。)
同じ結果が得られれば良いのではなく、工程に無駄がなく、負荷のかからないプログラムを書かなくてはいけないことがよく分かりました。
gooska
今回の問題のようなステップで、一旦”しそ巻き無料”のように文字をいれてある程度形にしてからのセルを指定した方が間違いにくいと思いました。
コメントありがとうございます。
以下の2つの変数が登場します。
・調べる対象を指定する変数
・調査結果を保持する変数
この2つを使いこなせるようになれば、実質、マクロ習得の最大の山は越えたも同然です。
この演習では、続けて、「別の表に転記する」という演習に進みます。
そこでは、「調査結果を保持する変数」ではなく、「調査結果の出力先を指定する変数」が登場します。が、その挙動は、「調査結果を保持する変数」とほぼ同じです。
たとえば、goukei=0 を書かなくても、goukei=0+1 ということになり、結果的には同じことにはなると思いますが。
後半では、goukeiを0にしておかないと一旦クリアにならないので必要だというのは分かりました。
よろしくお願いいたします。
> 解説の前半で、goukei=0 ・・・ goukei=goukei+1 とありますが、前半だけの話で完結した場合、最初の「goukei=0」は必要でしょうか?
> たとえば、goukei=0 を書かなくても、goukei=0+1 ということになり、結果的には同じことにはなると思いますが。
鋭いですね。
最初のは不要です。なぜなら、変数生成直後の状態では、変数の値は「Empty値」です。そして、この「Empty値」というものは、「0」みたいなものだからです。そこまでご理解いただいたうえで最初の goukei = 0 を省かれるのは、一向にかまいません。
学びがいがあります。
何度も見て、理解していきます。
どんどんかくぞ!
それぞれの変数を宣言した目的をご自身の中ではっきりさせてください。
そうすると、より整理して理解できるかと思います。
そのうえでもう一度同じ問題を解いてみられるとよいかと思います。
> 変数がたくさん出てきて整理するのが大変だけど
> 学びがいがあります。
>
> 何度も見て、理解していきます。
> どんどんかくぞ!
Dim goukei
Dim gyo
Dim migi
For migi = 4 To 6
goukei = 0
For gyo = 4 To 18
If Range("C" & gyo).Value = Range("E" & migi) Then
goukei = goukei + 1
End If
Next
Range("F" & migi).Value = goukei
Next
End Sub
お世話になります。
Range("F" & migi).Value = goukei
のプログラムを書くときに、
NextとNextの間に書くことが、
自力で書くときに迷います。
homeshift↓↓↓で選択するとき
最初のForNext構文が完成させたときに、
出力先を書くことで、別物と判断している
みたいで、ワンポイントアドバイス
よろしくおねがいします。
動画で言うと、何分何秒あたりの動きのことでしょうか?
Sub nantoka()
Dim goukei
Dim gyo
Dim migi
For migi = 4 To 6
goukei = 0
For gyo = 4 To 18
If Range("C" & gyo).Value = Range("E" & migi) Then
goukei = goukei + 1
End If
Next
Range("F" & migi).Value = goukei
Next
End Sub
> お世話になります。
> Range("F" & migi).Value = goukei
> のプログラムを書くときに、
> NextとNextの間に書くことが、
> 自力で書くときに迷います。
> homeshift↓↓↓で選択するとき
> 最初のForNext構文が完成させたときに、
> 出力先を書くことで、別物と判断している
> みたいで、ワンポイントアドバイス
> よろしくおねがいします。
8149の質問に8151回答がきました。その回答を受けて
動画で言うところの10:00からです。
自力で書くときに、少し迷ってしまい、
出力のプログラムを選択をせずに
次のステップに行って、しまいます。
やはり、慣れるしかないのでようか。
このような、ミスをなくすために
ワンポイントアドバイスよろしくおねがいします。
一歩引いた視点で、部品単位で、「それぞれの部品が、要は何をしようとしているのか?」と考えてみましょう。
for next構文で「ハナコ」する前の状態は、以下ですね。
Sub nantoka()
'変数宣言'[1]
'変数の初期化 '[2]
'数える '[3]
'数えた結果を出力 '[4]
End Sub
いただいたコードで言えば、[2], [3], [4]はそれぞれ以下の箇所です。
[2]
goukei = 0
[3]
For gyo = 4 To 18
....
Next
[4]
Range("F4").Value = goukei
これを「ハナコ」したわけです。ということで、以下。
Sub nantoka()
'変数宣言'[1]
'for文のカウンター用変数を宣言
'for ...
'変数の初期化 '[2]
'数える '[3]
'数えた結果を出力 '[4]
'next
End Sub
すると、以下の形になりますね↓。
Sub nantoka()
Dim goukei
Dim gyo
Dim migi
For migi = 4 To 6
goukei = 0
For gyo = 4 To 18
If Range("C" & gyo).Value = Range("E" & migi) Then
goukei = goukei + 1
End If
Next
Range("F" & migi).Value = goukei
Next
End Sub
まずは、この説明でいかがでしょう?
しそ巻きカウント(と私が名づけました)は、
migiとhidaと2種類のカウント変数が同時に動くあたり、
今までの学習だけでは、なかなか理解しにくい部分だと思います。
記憶がとぎれず連日学習している私でもここが難しかったので、
仕事の合間に間隔をあけながら学習される方ならば、
「あれっ急に講座が難しくなった、どうしよう?」
と感じるヤマではないかと・・・(;´・ω・)
私が自分の理解を深めるために思いついた方法、
それは、時計の2つの針です。
長針choは、分刻みの for cho=1 to 60 のカウンタ変数。
短針tanは、時間刻みの、for tan= 1 to 12 のカウンタ変数。
choのカウンタが60になると、
tan=tan+1となって短針が動き、
next → fun=0 となり、
ふたたび長針が0から分を刻んで行くわけです。
こう考えると、短針が動くと同時に長針のカウンタが初期化される動きも
分かりやすくなります。
こういうイメージでF8を動かし、特に変数の入れ替わりや行の移動などを
1行ずつ目で追いながら、マウスオンで確認する作業が大事だなと。
作業レベルでいえば、ハナコの応用として、
集計行(しそ巻き動画のhida行)の、つまり2個目のnextの箱を作ると
同時に、カウンタ初期化(変数=0 の行を、箱の最初に書き加える)、
という作業も連動させて行うと解釈し、覚えてしまって良いのではないかと
思いました。 いかがでしょうか(n*´ω`*n)
by gooska
「いろいろたとえ話を思いつく」というのは、よく理解されている証拠だと思いますよ。
gooskaさんのこの投稿も、この先この動画を観られる方の力になることでしょう。
>作業レベルでいえば、ハナコの応用として、
>集計行(しそ巻き動画のhida行)の、つまり2個目のnextの箱を作ると
>同時に、カウンタ初期化(変数=0 の行を、箱の最初に書き加える)、
>という作業も連動させて行うと解釈し、覚えてしまって良いのではないかと
>思いました。 いかがでしょうか(n*´ω`*n)
「完成されたアルゴリズムをいったん飲み込んでから、それをどう再解釈するか」はご自身の自由です (^^
そもそもで言うと、プログラミング言語には、変数宣言時に、「初期値」が自動設定されるものと、されないものとがあります。
前者の代表はVBで、後者の代表はC言語やJavaあたりです。
変数の初期値が自動設定されない系のプログラミング言語だったら、 migi=migi+1 のところで「migi は初期化されてないから、 + 1 なんて計算できないよ!」というエラーメッセージが出て終わりです。
後者のようなものからプログラミング言語を学びはじめた方には、「変数の値を『初期化』するなんてのは自分でやるのが当たり前」というメンタリティがあるので、こういう話は通じやすいです。
そういう方は、実務応用レベルの演習以前に、簡単なプログラムを書いて実行してみるといった初歩の初歩の段階で、「変数が初期化されていなかったことで生じるエラー」に出くわす経験を十分にしているからです。慣れた経験の延長の出来事であれば、すぐに理解し、対応できることでしょう。
ですから、もしもこの講座が「Javaを使った集計プログラムの実装練習」みたいな講座だったとしたら、そもそもここでひっかかる人はあまりいなかったかもしれません。
いずれにしても、どの言語を習得するにしても、どこかで多少の困難には出会います。自然言語でもそうですよね。
まして、「この講座でExcel VBAに触れるのがプログラミング言語に本格的に触れるはじめての経験」という方には、「多少」レベルには感じられないような困難があるのは当たり前なので。。
そこをどう乗り越えてもらえるようにするか?てのが、教材作る側のチャレンジでもあり、楽しみでもあります。
そういう「教材を作る側のチャレンジ」をさんざんしていく中で、少しずつ教材を差し替えたり作りなおしたりといった改訂を行ってきて、今に至っています。そして、大きな進歩をさせてくれるのは、熱心に学んで本気の投稿をくださる受講生のみなさんのエネルギーです。そういう熱意は、本当に、僕らにとってもありがたいです。
わかりやすいたとえ話をありがとうございます。
現実にカウンターで計測する時のことを考えると、直前に初期化するのが自然ですね。
私がnextの前に初期化を入れてみたのは、nextが入れ子になっているとステップが複雑なので、
どこで初期化されるのか慣れない私には まだ分かりにくかったからです。
集計表に書き込んだ直後であれば、カウンタ変数の役目はいったん終わるわけですから、そこで0にしてしまおうかと。
メリットは、初心者にわかりやすい場所かなと思えたことです。
通常の、新しいカウントを始める直前での初期化、メリットは通常のFORNEXT構文での位置と同じなので、
時間が経って自分で振り返ったり他人が見た場合、理解しにくい。
同様に、next前の初期化はたぶんあまり他の人がそう書かないので、わかりにくい。
自分が今思いつけるメリッ・トデメリットはこのくらいしかありません。
もっとForNextの経験を積んだら思いつくかも。
by gooska
>現実にカウンターで計測する時のことを考えると、直前に初期化するのが自然ですね。
ですね。
というか、ITものについて学ぶときは、「要は、これはリアルで言えばどういうことなの?」ということを考えてみるとよいです。
最適なプログラムの動作の流れ(アルゴリズム、と言います)を思いつくためにぜひとも持ちたい視点です。
リアルの業務を処理するためにプログラムを書くわけですし、「エクセルに落としこむ」段階で、すでにその視点での活動ははじまっています。
>自分が今思いつけるメリッ・トデメリットはこのくらいしかありません。
>もっとForNextの経験を積んだら思いつくかも。
今はそのくらいで十分かと思いますよ。
経験をつまないとしっくりこないことはいろいろあります。ここまで学ばれた gooska さんでしたら、そのこともご理解いただけることでしょう。
書いても問題ないでしょうか。一応試してみたら同じ数値は得られましたが。
Range("F" & syurui).Value = gokei
gokei = 0
Next
gooskaリアルにたとえて考えてみます。
あなたが牧場の子供ふれあい広場にいると想像してください。
そこには、ヤギと、羊と、うさぎがいます。
あなたは、左手にカウンター、右手に集計用紙とエンピツを持っています。
まずは、ヤギの数を数えようと思いました。
そこで、あなたは、手に持っていたカウンターの値を0に戻してから、ヤギを見かける都度、カチ、カチ、。。。とカウンターを押していきます。
すべてのヤギをチェックし終えたと思ったら、カウンターの値を確認します。そこには「5」と表示されていました。
そこで、あなたは、手元の集計表に「ヤギ→5匹」と記入しました。
次に、あなたは、羊の数を数えようと思いました。
そこで、あなたは、手に持っていたカウンターの値を0に戻してから、羊を見かける都度、カチ、カチ、。。。とカウンターを押していきます。
すべての羊をチェックし終えたと思ったら、カウンターの値を確認します。そこには「7」と表示されていました。
そこで、あなたは、手元の集計表に「羊→7匹」と記入しました。
次に、あなたは、うさぎの数を数えようと思いました。
そこで、あなたは、手に持っていたカウンターの値を0に戻してから、うさぎを見かける都度、カチ、カチ、。。。とカウンターを押していきます。
すべてのうさぎをチェックし終えたと思ったら、カウンターの値を確認します。そこには「4」と表示されていました。
そこで、あなたは、手元の集計表に「うさぎ→4匹」と記入しました。
みたいなことをしているわけです。
そう考えると、「カウンターを0にするタイミングはいつがいいのか?」という問いは、
[1] 新しい動物について数え始める直前がいいのか?
[2] 何かの動物について数え終わった直後がいのか?
という議論と同じですね。あなたなら、どちらを選びますか。
どちらにもメリット、デメリットがあると思います。[1], [2]のやり方それぞれのメリットを挙げてみてください。
ForNextが入れ子になる複数のカウントはもう少し練習します。
やはりカウントを初期化する=0の式をどこで入れるかですよね。
カウント数を記述する行と、初期化の行が大事ですね。
gooska
COUNTIF関数を使い慣れているせいか、今回のマクロは難しく感じました。
次の処理のためにカウント変数を0に戻さないといけないことはよくわかりましたが、
初期化する位置があの行だということが、現段階で理解できていません。
たぶん今このエラーを修正せよと言われたら対処できないと思います。
まず慣れが必要かと思うので、練習してみます。
gooska
コメントありがとうございます。
説明の流れ直しましたからね。
>この出現回数の数え方の説明、めちゃくちゃわかりやすいです!!感動しました!
>
1.動画を見る前に問題を自分で考えてから解いてみて、動画をみる。
2.動画を見てから自分で同じように書いて練習する。
私は、1でやるとまったく想像力がないので。。手が止まってしまいやる気を失ってしまいます。
2の方法でも上達するでしょうか。それともおすすめはやはり1の方法でしょうか。
個人個人で最適な勉強方法は違うと思いますが。。先生のご意見を教えていただけましたら幸いです。
あと、数学や算数がまったく得意でないのですが。。それにマクロの取得は関係ありますか?
得意不得意関係なくある程度のところまではマクロは書けるようになりますか。
動画のおかげで確実に上達しているとは思うのですが、不安な気持ちです。励ましてください!
どうぞよろしくお願いいたします。
>1.動画を見る前に問題を自分で考えてから解いてみて、動画をみる。
>2.動画を見てから自分で同じように書いて練習する。
>私は、1でやるとまったく想像力がないので。。手が止まってしまいやる気を失ってしまいます。
>2の方法でも上達するでしょうか。それともおすすめはやはり1の方法でしょうか。
結論から言うと、「2」の方法でも上達します。
というか、「2」の方法がおすすめです。ただし、実務でマクロを活用できるようになるには、個々の問題を何も見ないで解けるところまで練習する必要があります。
>あと、数学や算数がまったく得意でないのですが。。
ということなので、質問者さんはおそらく、理系科目の上達方法について、誰からも学ばなかったか、ご本人が気付かれないままで来られたのではないかと思います。
なのでアドバイスをします。
理系科目上達のための最速の方法は、基本を学んだら、あとは、以下の流れで問題をどんどん解くことです。
[1] 自分で解けそうに感じられた問題はできるところまでやってみる
[2] 行き詰まったらすぐに模範解答を見る
[3] 模範解答を見たら、そのとおりに問いてみる
[4] さらにくり返し、何も見ないで解けるようになる
[4]は、「その場で連続して解く」でも「時間を置いてなんどもくりかえす」でもかまいません。
数学でも、応用問題を解く力は、どれだけよい問題集に出会えたか?と[4]まで到達した問題がどれだけあるか?によって決まります。
高校数学くらいまでであれば、「数学が得意になる」にはこれで十分です。
マクロ基礎編の内容は高校数学よりよほど簡単ですし、量も少ないので上記のやり方を徹底すれば十分でしょう。
上記[4]について、どれだけくり返さなくてはならないか?という質問をよく受けます。
しかし、それについては、一般的なことは言えません。
どれだけくり返さなくてはならないかは、以下のそれぞれのレベルによって変わるからです。
○あなたが講座本編で何をどれだけ注意深く学んだか?
○そもそもマクロ以前にITとか、理系科目とかにあなたはどれだけ馴染みがあるか?
○理系科目の話を超えて、そもそもあなたは勉強やスキル習得の要領がどれだけよいか?
なお、あなたが実務でマクロをガンガン活用できるようになるかどうかには、上記の[4]まで到達した例題がいくつあるかで50%決まります。
あとの50%は、元の表を整形したり、作成する資料をより単純なものにしたりといった工夫をする力です。
詳しくは以下の動画講座を。(無料です)
エクセル仕事を劇的に楽にする「DPRフレームワーク」
http://www.exvba.com/dpr.php
勉強方法のアドバイスありがとうございます。
以下の方法で引き続きマクロを練習してみます。
とてもよくわかりました!自信を持って続けてみます。
>受講生 さん:
>1.動画を見る前に問題を自分で考えてから解いてみて、動画をみる。
>2.動画を見てから自分で同じように書いて練習する。
>私は、1でやるとまったく想像力がないので。。手が止まってしまいやる気を失ってしまいます。
>2の方法でも上達するでしょうか。それともおすすめはやはり1の方法でしょうか。
結論から言うと、「2」の方法でも上達します。
というか、「2」の方法がおすすめです。ただし、実務でマクロを活用できるようになるには、個々の問題を何も見ないで解けるところまで練習する必要があります。
>あと、数学や算数がまったく得意でないのですが。。
ということなので、質問者さんはおそらく、理系科目の上達方法について、誰からも学ばなかったか、ご本人が気付かれないままで来られたのではないかと思います。
なのでアドバイスをします。
理系科目上達のための最速の方法は、基本を学んだら、あとは、以下の流れで問題をどんどん解くことです。
[1] 自分で解けそうに感じられた問題はできるところまでやってみる
[2] 行き詰まったらすぐに模範解答を見る
[3] 模範解答を見たら、そのとおりに問いてみる
[4] さらにくり返し、何も見ないで解けるようになる
[4]は、「その場で連続して解く」でも「時間を置いてなんどもくりかえす」でもかまいません。
数学でも、応用問題を解く力は、どれだけよい問題集に出会えたか?と[4]まで到達した問題がどれだけあるか?によって決まります。
高校数学くらいまでであれば、「数学が得意になる」にはこれで十分です。
マクロ基礎編の内容は高校数学よりよほど簡単ですし、量も少ないので上記のやり方を徹底すれば十分でしょう。
上記[4]について、どれだけくり返さなくてはならないか?という質問をよく受けます。
しかし、それについては、一般的なことは言えません。
どれだけくり返さなくてはならないかは、以下のそれぞれのレベルによって変わるからです。
○あなたが講座本編で何をどれだけ注意深く学んだか?
○そもそもマクロ以前にITとか、理系科目とかにあなたはどれだけ馴染みがあるか?
○理系科目の話を超えて、そもそもあなたは勉強やスキル習得の要領がどれだけよいか?
なお、あなたが実務でマクロをガンガン活用できるようになるかどうかには、上記の[4]まで到達した例題がいくつあるかで50%決まります。
あとの50%は、元の表を整形したり、作成する資料をより単純なものにしたりといった工夫をする力です。
詳しくは以下の動画講座を。(無料です)
エクセル仕事を劇的に楽にする「DPRフレームワーク」
http://www.exvba.com/dpr.php
>とてもよくわかりました!自信を持って続けてみます。
それがいちばんです。良かったです。楽しんで継続してください。
何かあれば、またいつでもどうぞ (^^
>>小川慶一 さん:
>勉強方法のアドバイスありがとうございます。
>以下の方法で引き続きマクロを練習してみます。
>とてもよくわかりました!自信を持って続けてみます。
>
>>受講生 さん:
>
>>1.動画を見る前に問題を自分で考えてから解いてみて、動画をみる。
>>2.動画を見てから自分で同じように書いて練習する。
>>私は、1でやるとまったく想像力がないので。。手が止まってしまいやる気を失ってしまいます。
>>2の方法でも上達するでしょうか。それともおすすめはやはり1の方法でしょうか。
>
>結論から言うと、「2」の方法でも上達します。
>というか、「2」の方法がおすすめです。ただし、実務でマクロを活用できるようになるには、個々の問題を何も見ないで解けるところまで練習する必要があります。
>
>>あと、数学や算数がまったく得意でないのですが。。
>
>ということなので、質問者さんはおそらく、理系科目の上達方法について、誰からも学ばなかったか、ご本人が気付かれないままで来られたのではないかと思います。
>
>なのでアドバイスをします。
>理系科目上達のための最速の方法は、基本を学んだら、あとは、以下の流れで問題をどんどん解くことです。
>
>[1] 自分で解けそうに感じられた問題はできるところまでやってみる
>[2] 行き詰まったらすぐに模範解答を見る
>[3] 模範解答を見たら、そのとおりに問いてみる
>[4] さらにくり返し、何も見ないで解けるようになる
>
>[4]は、「その場で連続して解く」でも「時間を置いてなんどもくりかえす」でもかまいません。
>
>数学でも、応用問題を解く力は、どれだけよい問題集に出会えたか?と[4]まで到達した問題がどれだけあるか?によって決まります。
>高校数学くらいまでであれば、「数学が得意になる」にはこれで十分です。
>
>マクロ基礎編の内容は高校数学よりよほど簡単ですし、量も少ないので上記のやり方を徹底すれば十分でしょう。
>
>上記[4]について、どれだけくり返さなくてはならないか?という質問をよく受けます。
>しかし、それについては、一般的なことは言えません。
>どれだけくり返さなくてはならないかは、以下のそれぞれのレベルによって変わるからです。
>○あなたが講座本編で何をどれだけ注意深く学んだか?
>○そもそもマクロ以前にITとか、理系科目とかにあなたはどれだけ馴染みがあるか?
>○理系科目の話を超えて、そもそもあなたは勉強やスキル習得の要領がどれだけよいか?
>
>なお、あなたが実務でマクロをガンガン活用できるようになるかどうかには、上記の[4]まで到達した例題がいくつあるかで50%決まります。
>あとの50%は、元の表を整形したり、作成する資料をより単純なものにしたりといった工夫をする力です。
>詳しくは以下の動画講座を。(無料です)
>
>エクセル仕事を劇的に楽にする「DPRフレームワーク」
>http://www.exvba.com/dpr.php
>
>
Sub sisomaki()
Dim siso
Dim nomi
Dim kanpyo
Dim gyo
For gyo = 4 To 33
If Range("C" & gyo).Value = "しそ巻き無料" Then
siso = siso + 1
ElseIf Range("C" & gyo).Value = "飲みもの無料" Then
nomi = nomi + 1
ElseIf Range("C" & gyo).Value = "かんぴょう巻き無料" Then
kanpyo = kanpyo + 1
End If
Next
Range("F4").Value = siso
Range("F5").Value = nomi
Range("F6").Value = kanpyo
End Sub
単純なノウハウの積み重ねですね。
応用力が足りませんね。。。
回答の動画をみて あんなにあっさりできるなんて びっくりでした。
Sub rensyu2()
Dim count1
Dim count2
Dim count3
Dim gyo
For gyo = 4 To 33
If (InStr(Range("C" & gyo).Value, "しそ巻き無料")) > 0 Then
count1 = count1 + 1
ElseIf (InStr(Range("C" & gyo).Value, "飲みもの無料")) > 0 Then
count2 = count2 + 1
ElseIf (InStr(Range("C" & gyo).Value, "かんぴょう巻き無料")) > 0 Then
count3 = count3 + 1
Else
End If
Next
Range("F4").Value = count1
Range("F5").Value = count2
Range("F6").Value = count3
End Sub
そういうところを含めて練習で勘がやしなわれていきます (^^
>自力で書いた時は 直前の問題まで使っていた instrを使っていました(^^ゞ
>応用力が足りませんね。。。
>回答の動画をみて あんなにあっさりできるなんて びっくりでした。
>
>
>Sub rensyu2()
> Dim count1
> Dim count2
> Dim count3
> Dim gyo
> For gyo = 4 To 33
> If (InStr(Range("C" & gyo).Value, "しそ巻き無料")) > 0 Then
> count1 = count1 + 1
> ElseIf (InStr(Range("C" & gyo).Value, "飲みもの無料")) > 0 Then
> count2 = count2 + 1
> ElseIf (InStr(Range("C" & gyo).Value, "かんぴょう巻き無料")) > 0 Then
> count3 = count3 + 1
> Else
>
> End If
>
>
> Next
> Range("F4").Value = count1
> Range("F5").Value = count2
> Range("F6").Value = count3
>
>End Sub
>
最初に自力でやった時は、For~Next構文を1回しか使わずにやりました。
Sub count2()
Dim siso
Dim drink
Dim kanpyo
Dim gyo
For gyo = 4 To 33
If Range("C" & gyo).Value = Range("E4").Value Then
siso = siso + 1
ElseIf Range("C" & gyo).Value = "Range("E5").Value Then
drink = drink + 1
ElseIf Range("C" & gyo).Value = Range("E6").Value Then
kanpyo = kanpyo + 1
End If
Range("F4").Value = siso
Range("F5").Value = drink
Range("F6").Value = kanpyo
Next
End Sub
最初に解説動画を拝見した時は、
「For~Next構文の中に、さらにFor~Next構文が入ると言うことだろか?」
と考えました。
そこで、migiとgyoの値に注目しながら、紙に書いてみて確認しました。
最初は、migi=4、gyo=4からスタートし、gyoの1回目のループが終わった地点では、migi= 4、gyo= 33で、
次にRange("F" & migi).Value = goukeiをした後、migi=5となり、migiの1回目のループが終わり、
2回目のループは、migi=5、gyo=4から始まるのだと確認しました。
何だか、すごく手間のかかることをしていますね(^_^;)
>そこで、migiとgyoの値に注目しながら、紙に書いてみて確認しました。
すばらしい!
>最初に自力でやった時は、For~Next構文を1回しか使わずにやりました。
自力でできたならかなりのものです ヾ(´ー`)ノ
>何だか、すごく手間のかかることをしていますね(^_^;)
そういう努力をしてから見本を見ると、また学びが深まりますよね。
For gyo = 4 To 33
...
...
...
Next
の部分は一回きりで、ということでしたら、もっとエレガントな方法を発展1で学べます。
発展2では、さらにエレガントな方法を学べます。お楽しみに☆
>こんにちは。
>最初に自力でやった時は、For~Next構文を1回しか使わずにやりました。
>
>Sub count2()
>Dim siso
>Dim drink
>Dim kanpyo
>Dim gyo
>
> For gyo = 4 To 33
> If Range("C" & gyo).Value = Range("E4").Value Then
> siso = siso + 1
>
> ElseIf Range("C" & gyo).Value = "Range("E5").Value Then
> drink = drink + 1
>
> ElseIf Range("C" & gyo).Value = Range("E6").Value Then
> kanpyo = kanpyo + 1
>
> End If
>
> Range("F4").Value = siso
> Range("F5").Value = drink
> Range("F6").Value = kanpyo
> Next
>
>End Sub
>
>>最初に解説動画を拝見した時は、
>「For~Next構文の中に、さらにFor~Next構文が入ると言うことだろか?」
>と考えました。
>そこで、migiとgyoの値に注目しながら、紙に書いてみて確認しました。
>最初は、migi=4、gyo=4からスタートし、gyoの1回目のループが終わった地点では、migi= 4、gyo= 33で、
>次にRange("F" & migi).Value = goukeiをした後、migi=5となり、migiの1回目のループが終わり、
>2回目のループは、migi=5、gyo=4から始まるのだと確認しました。
>何だか、すごく手間のかかることをしていますね(^_^;)
3回くらい書いてみるとなんとなく、形が見えてきました。
変数は、使用する数と場所を要注意だと解りました。
このバランスで、いろんな事もシンプルに考えることができました。
シンプル最強です☆
>いつもありがとうございます。
>3回くらい書いてみるとなんとなく、形が見えてきました。
>変数は、使用する数と場所を要注意だと解りました。
>このバランスで、いろんな事もシンプルに考えることができました。
「イチから書く」という身体を使った体験がやはり強力です。
語学でもそうですが、プログラミング言語もやはり言語学習なので、その点共通です。
>前回の動画の知識も使いつつ、簡素にIfThenElseを使って自分で書いてから動画を見るとやはり学ぶところがありました.゚+.(o´∀`o)゚+.゚
Dim siso
Dim count
Dim gyou
Dim kanpyou
Dim nomimono
For gyou = 4 To 33
siso = Range("C" & gyou).Value
If siso = "しそ巻き無料" Then
count = count + 1
End If
Range("F4").Value = count
Next
Dim count1
For gyou = 4 To 33
siso = Range("C" & gyou).Value
If kanpyou = "かんぴょう巻き無料" Then
count1 = count1 + 1
End If
Range("F5").Value = count1
Next
Dim count2
For gyou = 4 To 33
siso = Range("C" & gyou).Value
If nomimono = "飲み物無料" Then
count2 = count2 + 1
End If
Range("F6").Value = count2
Next
End Sub
なぜ変数は、最初のFor~Nextの中でしかカウントされないのでしょうか。
カウントされない理由はなぜですか。?
以下の動画を参考にしてください。
https://www.dropbox.com/s/frvs05wxv8yl82z/kiso_follow10_shitumonkaitou.mp4?dl=0
テストをより丁寧にできるようになるとよいかと思います。
まずは、そのくらいで。
この解説で十分かどうか、またお知らせください。
ひきつづきよろしくお願いいたします。
>Sub hindo() '全く駄目です。単純に変数を3つ作成し、3回ループしてみました。
> Dim siso
> Dim count
> Dim gyou
> Dim kanpyou
> Dim nomimono
> For gyou = 4 To 33
> siso = Range("C" & gyou).Value
> If siso = "しそ巻き無料" Then
> count = count + 1
> End If
> Range("F4").Value = count
> Next
> Dim count1
> For gyou = 4 To 33
> siso = Range("C" & gyou).Value
> If kanpyou = "かんぴょう巻き無料" Then
> count1 = count1 + 1
> End If
> Range("F5").Value = count1
> Next
> Dim count2
> For gyou = 4 To 33
> siso = Range("C" & gyou).Value
> If nomimono = "飲み物無料" Then
> count2 = count2 + 1
> End If
> Range("F6").Value = count2
> Next
>
>End Sub
>なぜ変数は、最初のFor~Nextの中でしかカウントされないのでしょうか。
>カウントされない理由はなぜですか。?
マウスで選択してコピー&ペーストすればそもそもそういうことには悩まないで済みます。
メールも届いていると思います。そのメールにあるURLをクリックしても見られるかと。
>https://www.dropbox.com/s/frvs05wxv8yI82z/kiso_follow10_shitumomkaitou.mp4?dI=0の動画がひらきません。I82でしょうか182でしょうか。I=0のIはLの大文字でしょうか。数字の1でしょうか。ただの|(棒)でしょうか。
>>あと、上級DVDで紹介している「配列」を使うと以下のとおり。
>>出力部分については考えてみてください。
とのことでしたので、一部修正し、出力部分を追加して書いてみました。
修正箇所があれば教えて下さい。
Sub hairetu()
Dim gyo As Long
Dim goukei(2) As Long
goukei(0) = 0
goukei(1) = 0
goukei(2) = 0
For gyo = 4 To 33
Select Case Range("C" & gyo).Value
Case Range("E4").Value
goukei(0) = goukei(0) + 1
Case Range("E5").Value
goukei(1) = goukei(1) + 1
Case Range("E6").Value
goukei(2) = goukei(2) + 1
End Select
Next
For gyo = 4 To 6
Cells(gyo, "F").Value = goukei(gyo - 4)
Next
End Sub
よいかと v(^^
あえて言うなら、select case のところは range、 for next のところは cells で書いているというのはちょっと気になるかな。
ひとつのプログラムの中ではどちらかに統一したほうがメンテナンス性が高いです。
あとは、さらにバージョンアップしたコードにするなら...。
キャンペーンのタイプがいくつあるのかも未知のままだったらどうするか。
その場合は、キャンペーンタイプのリストを自分で作成することになります。(発展編1の動画フォローでそういう課題がでてきます)
>小川先生
>
>>>あと、上級DVDで紹介している「配列」を使うと以下のとおり。
>>>出力部分については考えてみてください。
>とのことでしたので、一部修正し、出力部分を追加して書いてみました。
>修正箇所があれば教えて下さい。
>
>Sub hairetu()
> Dim gyo As Long
> Dim goukei(2) As Long
> goukei(0) = 0
> goukei(1) = 0
> goukei(2) = 0
> For gyo = 4 To 33
> Select Case Range("C" & gyo).Value
> Case Range("E4").Value
> goukei(0) = goukei(0) + 1
> Case Range("E5").Value
> goukei(1) = goukei(1) + 1
> Case Range("E6").Value
> goukei(2) = goukei(2) + 1
> End Select
> Next
> For gyo = 4 To 6
> Cells(gyo, "F").Value = goukei(gyo - 4)
> Next
>End Sub
ご返信ありがとうございます。
>その場合は、キャンペーンタイプのリストを自分で作成することになります。(発展編1の動画フォローでそういう課題がでてきます)
ユニークリストの作成ということでしょうか?
そのあたりも、ぜひマスターしていきたいと思います。
講座を開始した当初は焦る気持ちもありましたが、まずは基礎編(フォローアップ課題やEnshuフォルダ)をしっかりと繰り返し実践し、
スラスラとできるようになってから、発展編に進んでいきたいという気持ちです。
余談ですが、小川先生のさりげないブレークポイントの使い方も大変参考になりました。
また、よろしくお願いいたします。
>匿名 さん:
>
>よいかと v(^^
>
>あえて言うなら、select case のところは range、 for next のところは cells で書いているというのはちょっと気になるかな。
>ひとつのプログラムの中ではどちらかに統一したほうがメンテナンス性が高いです。
>
>あとは、さらにバージョンアップしたコードにするなら...。
>キャンペーンのタイプがいくつあるのかも未知のままだったらどうするか。
>その場合は、キャンペーンタイプのリストを自分で作成することになります。(発展編1の動画フォローでそういう課題がでてきます)
>
>
>>小川先生
>>
>>>>あと、上級DVDで紹介している「配列」を使うと以下のとおり。
>>>>出力部分については考えてみてください。
>>とのことでしたので、一部修正し、出力部分を追加して書いてみました。
>>修正箇所があれば教えて下さい。
>>
>>Sub hairetu()
>> Dim gyo As Long
>> Dim goukei(2) As Long
>> For gyo = 4 To 33
>> Select Case Cells(gyo,3).Value
>> Case Cells(4,5).Value
>> goukei(0) = goukei(0) + 1
>> Case Cells(5,5).Value
>> goukei(1) = goukei(1) + 1
>> Case Cells(6,5).Value
>> goukei(2) = goukei(2) + 1
>> End Select
>> Next
>> For gyo = 4 To 6
>> Cells(gyo, "F").Value = goukei(gyo - 4)
>> Next
>>End Sub
>
>ユニークリストの作成ということでしょうか?
はい、そうです。
ユニークリスト作成自体はアルゴリズムそんなに難しくありません。
(よく考えたら、基礎編フォロー動画でも後半に登場しました (^^; )
基礎編の道具だけでも、相当のことができますよ。
あと、基礎編フォローでは主要なアルゴリズムはほぼ網羅しています。
>余談ですが、小川先生のさりげないブレークポイントの使い方も大変参考になりました。
生収録の魅力ですね。
見ていると分かるとおりけっこう失敗していますが、失敗した状態からどう修正するか?というのも大切なノウハウなので、すべて晒すようにしています。
ひきつづきお楽しみください☆
>小川先生:
>ご返信ありがとうございます。
>
>>その場合は、キャンペーンタイプのリストを自分で作成することになります。(発展編1の動画フォローでそういう課題がでてきます)
>ユニークリストの作成ということでしょうか?
>そのあたりも、ぜひマスターしていきたいと思います。
>
>講座を開始した当初は焦る気持ちもありましたが、まずは基礎編(フォローアップ課題やEnshuフォルダ)をしっかりと繰り返し実践し、
>スラスラとできるようになってから、発展編に進んでいきたいという気持ちです。
>
>余談ですが、小川先生のさりげないブレークポイントの使い方も大変参考になりました。
>また、よろしくお願いいたします。
>
>>匿名 さん:
>>
>>よいかと v(^^
>>
>>あえて言うなら、select case のところは range、 for next のところは cells で書いているというのはちょっと気になるかな。
>>ひとつのプログラムの中ではどちらかに統一したほうがメンテナンス性が高いです。
>>
>>あとは、さらにバージョンアップしたコードにするなら...。
>>キャンペーンのタイプがいくつあるのかも未知のままだったらどうするか。
>>その場合は、キャンペーンタイプのリストを自分で作成することになります。(発展編1の動画フォローでそういう課題がでてきます)
>>
>>
>>>小川先生
>>>
>>>>>あと、上級DVDで紹介している「配列」を使うと以下のとおり。
>>>>>出力部分については考えてみてください。
>>>とのことでしたので、一部修正し、出力部分を追加して書いてみました。
>>>修正箇所があれば教えて下さい。
>>>
>>>Sub hairetu()
>>> Dim gyo As Long
>>> Dim goukei(2) As Long
>>> For gyo = 4 To 33
>>> Select Case Cells(gyo,3).Value
>>> Case Cells(4,5).Value
>>> goukei(0) = goukei(0) + 1
>>> Case Cells(5,5).Value
>>> goukei(1) = goukei(1) + 1
>>> Case Cells(6,5).Value
>>> goukei(2) = goukei(2) + 1
>>> End Select
>>> Next
>>> For gyo = 4 To 6
>>> Cells(gyo, "F").Value = goukei(gyo - 4)
>>> Next
>>>End Sub
>>
>
ユニークリストの作成、AdvancedFilterを使うのは反則かなと思い、アルゴリズムを考えてみました。
試行錯誤の結果、以下のようになりました。修正点がありましたら、教えて下さい。
Sub Sample1()
Dim i As Long, j As Long, cnt As Long, flag As Boolean
cnt = 4
For i = 4 To 33
flag = False
For j = 4 To cnt
If Cells(i, 3).Value = Cells(j, 5).Value Then
flag = True
Exit For
End If
Next j
If Cells(i, 3).Value <> "" And flag = False Then
Cells(cnt, 5).Value = Cells(i, 3).Value
cnt = cnt + 1
End If
Next i
End Sub
基礎編のフォロー動画はまだ第11回までしか終わっていませんが、この週末に少しでも
進めていきたいと思います。
メルマガの「休日は追いつくチャンス」という言葉、結構気に入っています。
>匿名 さん:
>
>>ユニークリストの作成ということでしょうか?
>
>はい、そうです。
>
>ユニークリスト作成自体はアルゴリズムそんなに難しくありません。
>(よく考えたら、基礎編フォロー動画でも後半に登場しました (^^; )
>
>基礎編の道具だけでも、相当のことができますよ。
>あと、基礎編フォローでは主要なアルゴリズムはほぼ網羅しています。
>
>>余談ですが、小川先生のさりげないブレークポイントの使い方も大変参考になりました。
>
>生収録の魅力ですね。
>見ていると分かるとおりけっこう失敗していますが、失敗した状態からどう修正するか?というのも大切なノウハウなので、すべて晒すようにしています。
>
>ひきつづきお楽しみください☆
>
>
>
>>小川先生:
>>ご返信ありがとうございます。
>>
>>>その場合は、キャンペーンタイプのリストを自分で作成することになります。(発展編1の動画フォローでそういう課題がでてきます)
>>ユニークリストの作成ということでしょうか?
>>そのあたりも、ぜひマスターしていきたいと思います。
>>
>>講座を開始した当初は焦る気持ちもありましたが、まずは基礎編(フォローアップ課題やEnshuフォルダ)をしっかりと繰り返し実践し、
>>スラスラとできるようになってから、発展編に進んでいきたいという気持ちです。
>>
>>余談ですが、小川先生のさりげないブレークポイントの使い方も大変参考になりました。
>>また、よろしくお願いいたします。
>>
>>>匿名 さん:
>>>
>>>よいかと v(^^
>>>
>>>あえて言うなら、select case のところは range、 for next のところは cells で書いているというのはちょっと気になるかな。
>>>ひとつのプログラムの中ではどちらかに統一したほうがメンテナンス性が高いです。
>>>
>>>あとは、さらにバージョンアップしたコードにするなら...。
>>>キャンペーンのタイプがいくつあるのかも未知のままだったらどうするか。
>>>その場合は、キャンペーンタイプのリストを自分で作成することになります。(発展編1の動画フォローでそういう課題がでてきます)
>>>
>>>
>>>>小川先生
>>>>
>>>>>>あと、上級DVDで紹介している「配列」を使うと以下のとおり。
>>>>>>出力部分については考えてみてください。
>>>>とのことでしたので、一部修正し、出力部分を追加して書いてみました。
>>>>修正箇所があれば教えて下さい。
>>>>
>>>>Sub hairetu()
>>>> Dim gyo As Long
>>>> Dim goukei(2) As Long
>>>> For gyo = 4 To 33
>>>> Select Case Cells(gyo,3).Value
>>>> Case Cells(4,5).Value
>>>> goukei(0) = goukei(0) + 1
>>>> Case Cells(5,5).Value
>>>> goukei(1) = goukei(1) + 1
>>>> Case Cells(6,5).Value
>>>> goukei(2) = goukei(2) + 1
>>>> End Select
>>>> Next
>>>> For gyo = 4 To 6
>>>> Cells(gyo, "F").Value = goukei(gyo - 4)
>>>> Next
>>>>End Sub
>>>
>>
>
アルゴリズムについては、基礎編フォロー動画後半ででてくるので、そちらにて。
気になるようでしたら、先に18回、17回あたりを観てしまっていただいてOKです。
このアルゴリズムについては、何かあればそれからまた質問してください!
>メルマガの「休日は追いつくチャンス」という言葉、結構気に入っています。
僕も好きです。気に入っています。
>小川先生:
>
>ユニークリストの作成、AdvancedFilterを使うのは反則かなと思い、アルゴリズムを考えてみました。
>試行錯誤の結果、以下のようになりました。修正点がありましたら、教えて下さい。
>
Sub Sample1()
Dim i As Long, j As Long, cnt As Long, flag As Boolean
cnt = 4
For i = 4 To 33
flag = False
For j = 4 To cnt
If Cells(i, 3).Value = Cells(j, 5).Value Then
flag = True
Exit For
End If
Next j
If Cells(i, 3).Value <> "" And flag = False Then
Cells(cnt, 5).Value = Cells(i, 3).Value
cnt = cnt + 1
End If
Next i
End Sub
>>基礎編のフォロー動画はまだ第11回までしか終わっていませんが、この週末に少しでも
>進めていきたいと思います。
>メルマガの「休日は追いつくチャンス」という言葉、結構気に入っています。
>
>
>>匿名 さん:
>>
>>>ユニークリストの作成ということでしょうか?
>>
>>はい、そうです。
>>
>>ユニークリスト作成自体はアルゴリズムそんなに難しくありません。
>>(よく考えたら、基礎編フォロー動画でも後半に登場しました (^^; )
>>
>>基礎編の道具だけでも、相当のことができますよ。
>>あと、基礎編フォローでは主要なアルゴリズムはほぼ網羅しています。
>>
>>>余談ですが、小川先生のさりげないブレークポイントの使い方も大変参考になりました。
>>
>>生収録の魅力ですね。
>>見ていると分かるとおりけっこう失敗していますが、失敗した状態からどう修正するか?というのも大切なノウハウなので、すべて晒すようにしています。
>>
>>ひきつづきお楽しみください☆
>>
>>
>>
>>>小川先生:
>>>ご返信ありがとうございます。
>>>
>>>>その場合は、キャンペーンタイプのリストを自分で作成することになります。(発展編1の動画フォローでそういう課題がでてきます)
>>>ユニークリストの作成ということでしょうか?
>>>そのあたりも、ぜひマスターしていきたいと思います。
>>>
>>>講座を開始した当初は焦る気持ちもありましたが、まずは基礎編(フォローアップ課題やEnshuフォルダ)をしっかりと繰り返し実践し、
>>>スラスラとできるようになってから、発展編に進んでいきたいという気持ちです。
>>>
>>>余談ですが、小川先生のさりげないブレークポイントの使い方も大変参考になりました。
>>>また、よろしくお願いいたします。
>>>
>>>>匿名 さん:
>>>>
>>>>よいかと v(^^
>>>>
>>>>あえて言うなら、select case のところは range、 for next のところは cells で書いているというのはちょっと気になるかな。
>>>>ひとつのプログラムの中ではどちらかに統一したほうがメンテナンス性が高いです。
>>>>
>>>>あとは、さらにバージョンアップしたコードにするなら...。
>>>>キャンペーンのタイプがいくつあるのかも未知のままだったらどうするか。
>>>>その場合は、キャンペーンタイプのリストを自分で作成することになります。(発展編1の動画フォローでそういう課題がでてきます)
>>>>
>>>>
>>>>>小川先生
>>>>>
>>>>>>>あと、上級DVDで紹介している「配列」を使うと以下のとおり。
>>>>>>>出力部分については考えてみてください。
>>>>>とのことでしたので、一部修正し、出力部分を追加して書いてみました。
>>>>>修正箇所があれば教えて下さい。
>>>>>
Sub hairetu()
Dim gyo As Long
Dim goukei(2) As Long
For gyo = 4 To 33
Select Case Cells(gyo,3).Value
Case Cells(4,5).Value
goukei(0) = goukei(0) + 1
Case Cells(5,5).Value
goukei(1) = goukei(1) + 1
Case Cells(6,5).Value
goukei(2) = goukei(2) + 1
End Select
Next
For gyo = 4 To 6
Cells(gyo, "F").Value = goukei(gyo - 4)
Next
End Sub