出現回数を数える。CountIf関数がやっていることをマクロで書くと?

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

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

解説

演習問題テーマ:出現回数を数える。CountIf関数がやっていることをマクロで書くと?

変数の値を初期化(値を0にする)してからループを繰り返すパターン。
[1]出現回数をあらわす変数をたてて出現するたびに1つ増やす仕組み
[2]For Next構文で調べ終わったあとに最後の合計を表示する仕組み
[3]最後の合計を表示したらその変数の値を一度0に戻してから次のループに入る仕組みをよくみてください。

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

11399 : 藤村英夫さんのコメント (2019-05-12 19:39:42)

なるほど。リンクの説明を読んで納得しました。ドットバリューも将来の為に入力するようにします。


11388 : 小川慶一の回答 (2019-05-06 10:34:32)

藤村英夫さん:

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)は打たなくても問題がないという記述があったので、今まで入力していません。


11386 : 藤村英夫さんのコメント (2019-05-05 10:01:47)

一回目に見たときに感動したのですが、土日だけ復習しているとすぐに忘れてしますので、思い切ってスマホを大型に買い替えて、ゴールデンウィーク明けからは、電車のなかでこの動画を通勤中に見るようにします。

ところで、質問ですが、ドットバリュー(.value)は入力しなくても、
今のところ支障なく作動するようですが、この先 発展編にすすむとまずいことはでてきますか? 書店で購入した本が、range("A1").value等の
入力の場合、ドットバリュー(.value)は打たなくても問題がないという記述があったので、今まで入力していません。


11242 : 小川慶一の回答 (2019-03-11 11:31:11)

ジュリアンさん:

お返事、遅れました。

そうですね。
一行一行マクロを実行したとき、どういう状況になるか?しっかりキャッチアップしていくことがとても大切です。

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


> マクロの実行に伴って変数の値が推移する。
> 講義中で行われていたように、変数の値を丁寧に追いかけることで理解につながりました。


11228 : マサラさんのコメント (2019-03-07 19:37:18)

マクロの実行に伴って変数の値が推移する。
講義中で行われていたように、変数の値を丁寧に追いかけることで理解につながりました。


11194 : 小川慶一の回答 (2019-02-22 21:31:13)

jinoseさん:

「複数変数を使う、そのうちひとつの値は自分で変更する」ということで、最初の関門とも言える問題です。
くりかえしましょう!

> 第2引数に"=" & をつけるのはなぜでしょうか(E4だけで動くと思うのですが)?

そうなんですか。
僕はエクセルのワークシート関数詳しくないので。どちらでも動けばよいのではないでしょうか。


11180 : jinoseさんのコメント (2019-02-17 21:36:21)

[感想]
最初は理解できなかった(for next構文の中にfor next構文)が、復習するにつれだんだんとわかってきた。リアルでの例えがわかりやすくて納得できました!

[質問]
countif関数で=COUNTIF(C$4:C$18,"=" & E4)をなっておりますが、第2引数に"=" & をつけるのはなぜでしょうか(E4だけで動くと思うのですが)?


10834 : 小川慶一の回答 (2018-12-23 13:35:29)

受講生 さん:

お返事ありがとうございます。
このお題は、実は、極めて重要です。「身体が勝手に動いて正解してしまう」というところまで練習されるとよいかと思います。そこまでたぶんもうあと少しです。

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



> 小川先生
> コメントありがとうございます。
> 確かに調査対象が数百個あったら私のやり方では限界がありますね。
> 今一度動画を見返して、小川さんのやり方を頭に入れたいと思います。
>
> 小川慶一さん:
>
> > ゲストさん:
> >
> > こんばんは。
> >
> > もしも調査対象が「しそ巻き無料」、「飲みもの無料」、「かんぴょう巻き無料」の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

> >


10833 : 受講生さんのコメント (2018-12-23 12:13:13)

小川先生
コメントありがとうございます。
確かに調査対象が数百個あったら私のやり方では限界がありますね。
今一度動画を見返して、小川さんのやり方を頭に入れたいと思います。

小川慶一さん:

> ゲストさん:
>
> こんばんは。
>
> もしも調査対象が「しそ巻き無料」、「飲みもの無料」、「かんぴょう巻き無料」の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

>


10828 : 小川慶一の回答 (2018-12-22 17:49:09)

ゲストさん:

こんばんは。

もしも調査対象が「しそ巻き無料」、「飲みもの無料」、「かんぴょう巻き無料」の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


10826 : ゲストさんのコメント (2018-12-22 15:32:30)

小川先生
こんにちわ
[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


10543 : 小川慶一の回答 (2018-09-03 13:49:03)

Matsumotoさん:

工程をまる覚えするのも大切ですが、その前に、より抽象的なところで、ベースになる考え方を腑に落とすことも大切です。

このページにある、解説文「【補足】」は読まれましたか。
「リアルならどう?」という問いをしっかり持って、それがマクロではどう表現されているのか?というところを読み解くつもりで、解説文を読み、完成形のマクロを観察し、変数の値の変化を確認しつつ[F8]でステップイン実行し、そして、工程をまる覚えするいきおいでプログラムを書く練習をしてください。


> 答えを見るまで自力では解くことができませんでした。
> 一気に難易度が上がった感覚があるのですが、
> おそらく基礎編の理解が不十分だからなのだと思います。
>
> 先生の言葉にあったように、回答を鵜呑みにしてとにかく練習を繰り返そうと思います。フォローアップ講座を進めながら、同時並行で本編の復習を開始します。
>


10541 : Matsumotoさんのコメント (2018-09-02 14:38:52)

答えを見るまで自力では解くことができませんでした。
一気に難易度が上がった感覚があるのですが、
おそらく基礎編の理解が不十分だからなのだと思います。

先生の言葉にあったように、回答を鵜呑みにしてとにかく練習を繰り返そうと思います。フォローアップ講座を進めながら、同時並行で本編の復習を開始します。


10218 : 小川慶一の回答 (2018-07-05 01:24:24)

あおちゃんさん:

setステートメントは、発展編1で登場します。

発展編1まで学習を進めた方が基礎編演習に戻ってきたときのコメントで出てくることがありますが、今の段階では気にされなくてOKです。
情報過多になるより、手元の道具を組み合わせて目的を達成できる腕力をつけるほうがこの時期には上達と成果への近道です。

とはいえ、「どうしても」ということでしたら解説できないこともないですが...。

ともあれ、ひきつづきお楽しみください☆


> 小川先生、何度も質問すみません。setステートメントと言うのは、どこの講座で出てきますか?ご紹介頂いたところまでまず勉強してから、質問すべきだなと思いました。しかし、時々setの変数が出てくるので、読んで理解したいのです。小川先生の講座のお陰で本当に仕事が捗り、仕事が楽しくなりました。ありがとうございます。


10216 : あおちゃんさんのコメント (2018-07-04 23:28:10)

小川先生、何度も質問すみません。setステートメントと言うのは、どこの講座で出てきますか?ご紹介頂いたところまでまず勉強してから、質問すべきだなと思いました。しかし、時々setの変数が出てくるので、読んで理解したいのです。小川先生の講座のお陰で本当に仕事が捗り、仕事が楽しくなりました。ありがとうございます。


10209 : 小川慶一の回答 (2018-07-04 11:34:33)

あおちゃんさん:

マクロの勉強、お楽しみいただけているようでしたらなによりです。

基礎編だと、「基礎編フォローアップ アドバンスド」 https://online.pc5bai.com/package/index/86 の後半がまさにそんな感じかなと思います。
どうでしょう?

> 小川先生、こんにちは。
> 2月に基礎編を申し込んで、やっと基礎編フォローアップになりました。奥が深く大変為になります。すみません、教えて頂きたいのですが、出勤簿の精査をしていますが、人数が5.60にんいて、それを毎回一覧表に転記してから、画面と見比べてチェックしています。それぞれのブックを開いて、一覧表に転記すると言うマクロの講座はありますか?このブックを開く関数や変数の使い方が難しくて、さっぱりわかりません。


10205 : あおちゃんさんのコメント (2018-07-02 19:47:15)

小川先生、こんにちは。
2月に基礎編を申し込んで、やっと基礎編フォローアップになりました。奥が深く大変為になります。すみません、教えて頂きたいのですが、出勤簿の精査をしていますが、人数が5.60にんいて、それを毎回一覧表に転記してから、画面と見比べてチェックしています。それぞれのブックを開いて、一覧表に転記すると言うマクロの講座はありますか?このブックを開く関数や変数の使い方が難しくて、さっぱりわかりません。


9991 : 小川慶一の回答 (2018-05-16 08:13:39)

morimotoさん:

ありがとうございます。
ふれあい広場最強ですw

> ふれあい広場の例えはほんとわかりやすい。初期値goukei=0と
> goukei=goukei+1 どこにコードを書くかゆっくり考えればできそうです。
> だめならどこかに入れてf9で1つ1つどうなるか検証ですね。


9984 : 小川慶一の回答 (2018-05-16 07:56:55)

ゲストさん:

ここは最初の関門かもしれませんね。
ページ内の解説にある「牧場の子供ふれあい広場」の話もご確認ください。


> 変数が複数出てくると途中で混乱してしまい、なかなかついていくのが難しいですが、ひとつづつ説明いただいているので構造的には理解できそうです!落ち着いて、構造を把握してひとつずつ検証するのと、トライアンドエラーの繰り返しが必要そうです


9979 : morimotoさんのコメント (2018-05-16 02:05:06)

ふれあい広場の例えはほんとわかりやすい。初期値goukei=0と
goukei=goukei+1 どこにコードを書くかゆっくり考えればできそうです。
だめならどこかに入れてf9で1つ1つどうなるか検証ですね。


9965 : ゲストさんのコメント (2018-05-13 17:07:05)

変数が複数出てくると途中で混乱してしまい、なかなかついていくのが難しいですが、ひとつづつ説明いただいているので構造的には理解できそうです!落ち着いて、構造を把握してひとつずつ検証するのと、トライアンドエラーの繰り返しが必要そうです


9932 : 小川慶一の回答 (2018-05-06 22:40:09)

ゲストさん:

> もしかして、
> 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 の部分で、
> 「しそ巻き無料」の回数を累計させているのでしょうか??
>
> ご指導、お願い致します。


9931 : ゲストさんのコメント (2018-05-06 21:38:56)

お世話になります。

講義は有難いのに、私が吸収できません。
申し訳ございません。

講義動画、4分26秒の箇所で質問です。

C4から18までの「しそ巻き無料」の回数を数えたかったので
添付ファイルのような式を書きました。

すると、
エクセルシート名:キャンペーン名簿1のセルF4に
「1」という答えが出て、間違えました。

小川先生の回答は、

' If Range("C4").Value = "しそ巻き無料" Then の後が、
'goukei = goukei + 1

になっています。

私が書いた式だと、
どういう意味になってしまうのでしょうか??

もしかして、
goukei = goukei + 1 の部分で、
「しそ巻き無料」の回数を累計させているのでしょうか??

ご指導、お願い致します。


9251 : 受講生さんのコメント (2017-12-20 08:44:12)

小川先生

おはようございます。
早朝からご返信ありがとうございます。

確かに、処理行数が10万業務だった場合の事を考えると、無駄な出力が10万回行われることになり、不適切であったことがはっきり分かりました。(実際、次の職場では、10万件以上のデータを扱うことになり、マクロを組まないと手作業では無理な量です。)
同じ結果が得られれば良いのではなく、工程に無駄がなく、負荷のかからないプログラムを書かなくてはいけないことがよく分かりました。
gooska


9250 : 小川慶一の回答 (2017-12-20 06:23:29)

受講生 さん:

おはようございます。

>フォローアップで一番悩み、記憶に刻まれていたのがこの問題です。

複数の変数を扱うの、ここが最初ですからね。
戸惑いもあるかもしれません。

そこを乗り越えると簡単なのですが。
というか、実は、エクセルマクロって、要は、以下の3つがすべてです。

[1] 調査対象を変数を使って指定する
[2] 出力先を変数を使って指定する
[3] 条件に一致するか?を調べる

あとは、[1], [2], [3]それぞれについて引き出しを増やしていくだけです。

> でも、1行ごとの結果をそのたびに書き出し、上書きする仕組みは
> それ自体面白いし、使える局面があるかもと思ったので、
> ご紹介しました。

いただいたプログラムだと、結果の出力回数が見本より多いですね。
「条件に該当するデータが10万行あるデータだったとしたらどうだろか?」とか考えてみてください。

見本で示した書き方だと出力は1回だけです。
都度出力すると、出力は10万回です。


9249 : 受講生さんのコメント (2017-12-19 23:04:53)

しそ巻きカウントの問題に、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



9188 : 小川慶一の回答 (2017-12-08 09:51:22)

吉川 裕子さん:

コメントありがとうございます。

以下の2つの変数が登場します。
・調べる対象を指定する変数
・調査結果を保持する変数

この2つを使いこなせるようになれば、実質、マクロ習得の最大の山は越えたも同然です。

この演習では、続けて、「別の表に転記する」という演習に進みます。
そこでは、「調査結果を保持する変数」ではなく、「調査結果の出力先を指定する変数」が登場します。が、その挙動は、「調査結果を保持する変数」とほぼ同じです。


9185 : ガラパゴスタディー吉川の回答 (2017-12-07 16:41:34)

変数が増えると、何を入れたいのかがわかりづらくなってくるので、
今回の問題のようなステップで、一旦”しそ巻き無料”のように文字をいれてある程度形にしてからのセルを指定した方が間違いにくいと思いました。



9079 : 小川慶一の回答 (2017-10-19 23:18:37)

受講生 さん:

> 解説の前半で、goukei=0 ・・・ goukei=goukei+1 とありますが、前半だけの話で完結した場合、最初の「goukei=0」は必要でしょうか?
> たとえば、goukei=0 を書かなくても、goukei=0+1 ということになり、結果的には同じことにはなると思いますが。

鋭いですね。
最初のは不要です。なぜなら、変数生成直後の状態では、変数の値は「Empty値」です。そして、この「Empty値」というものは、「0」みたいなものだからです。そこまでご理解いただいたうえで最初の goukei = 0 を省かれるのは、一向にかまいません。


9074 : 受講生さんのコメント (2017-10-18 00:35:52)

解説の前半で、goukei=0 ・・・ goukei=goukei+1 とありますが、前半だけの話で完結した場合、最初の「goukei=0」は必要でしょうか?
たとえば、goukei=0 を書かなくても、goukei=0+1 ということになり、結果的には同じことにはなると思いますが。

後半では、goukeiを0にしておかないと一旦クリアにならないので必要だというのは分かりました。

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


8834 : 小川慶一の回答 (2017-09-06 00:14:20)

受講生 さん:

それぞれの変数を宣言した目的をご自身の中ではっきりさせてください。
そうすると、より整理して理解できるかと思います。
そのうえでもう一度同じ問題を解いてみられるとよいかと思います。

> 変数がたくさん出てきて整理するのが大変だけど
> 学びがいがあります。
>
> 何度も見て、理解していきます。
> どんどんかくぞ!


8829 : 受講生さんのコメント (2017-09-05 21:20:18)

変数がたくさん出てきて整理するのが大変だけど
学びがいがあります。

何度も見て、理解していきます。
どんどんかくぞ!


8153 : 小川慶一の回答 (2017-05-22 21:09:35)

受講生 さん:

一歩引いた視点で、部品単位で、「それぞれの部品が、要は何をしようとしているのか?」と考えてみましょう。

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


まずは、この説明でいかがでしょう?


8152 : 受講生さんのコメント (2017-05-22 19:03:38)

お世話になります。
8149の質問に8151回答がきました。その回答を受けて
動画で言うところの10:00からです。
自力で書くときに、少し迷ってしまい、
出力のプログラムを選択をせずに
次のステップに行って、しまいます。
やはり、慣れるしかないのでようか。
このような、ミスをなくすために
ワンポイントアドバイスよろしくおねがいします。


8151 : 小川慶一の回答 (2017-05-22 18:27:35)

受講生 さん:

動画で言うと、何分何秒あたりの動きのことでしょうか?

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 : 受講生さんのコメント (2017-05-22 13:37:42)

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構文が完成させたときに、
出力先を書くことで、別物と判断している
みたいで、ワンポイントアドバイス
よろしくおねがいします。


6138 : 小川慶一の回答 (2016-03-26 21:12:09)

受講生 さん:

「いろいろたとえ話を思いつく」というのは、よく理解されている証拠だと思いますよ。
gooskaさんのこの投稿も、この先この動画を観られる方の力になることでしょう。

>作業レベルでいえば、ハナコの応用として、
>集計行(しそ巻き動画のhida行)の、つまり2個目のnextの箱を作ると
>同時に、カウンタ初期化(変数=0 の行を、箱の最初に書き加える)、
>という作業も連動させて行うと解釈し、覚えてしまって良いのではないかと
>思いました。 いかがでしょうか(n*´ω`*n)

「完成されたアルゴリズムをいったん飲み込んでから、それをどう再解釈するか」はご自身の自由です (^^

そもそもで言うと、プログラミング言語には、変数宣言時に、「初期値」が自動設定されるものと、されないものとがあります。
前者の代表はVBで、後者の代表はC言語やJavaあたりです。

変数の初期値が自動設定されない系のプログラミング言語だったら、 migi=migi+1 のところで「migi は初期化されてないから、 + 1 なんて計算できないよ!」というエラーメッセージが出て終わりです。

後者のようなものからプログラミング言語を学びはじめた方には、「変数の値を『初期化』するなんてのは自分でやるのが当たり前」というメンタリティがあるので、こういう話は通じやすいです。
そういう方は、実務応用レベルの演習以前に、簡単なプログラムを書いて実行してみるといった初歩の初歩の段階で、「変数が初期化されていなかったことで生じるエラー」に出くわす経験を十分にしているからです。慣れた経験の延長の出来事であれば、すぐに理解し、対応できることでしょう。

ですから、もしもこの講座が「Javaを使った集計プログラムの実装練習」みたいな講座だったとしたら、そもそもここでひっかかる人はあまりいなかったかもしれません。

いずれにしても、どの言語を習得するにしても、どこかで多少の困難には出会います。自然言語でもそうですよね。
まして、「この講座でExcel VBAに触れるのがプログラミング言語に本格的に触れるはじめての経験」という方には、「多少」レベルには感じられないような困難があるのは当たり前なので。。

そこをどう乗り越えてもらえるようにするか?てのが、教材作る側のチャレンジでもあり、楽しみでもあります。
そういう「教材を作る側のチャレンジ」をさんざんしていく中で、少しずつ教材を差し替えたり作りなおしたりといった改訂を行ってきて、今に至っています。そして、大きな進歩をさせてくれるのは、熱心に学んで本気の投稿をくださる受講生のみなさんのエネルギーです。そういう熱意は、本当に、僕らにとってもありがたいです。


6137 : 受講生さんのコメント (2016-03-26 20:53:37)

ちょっと振り返りました。
しそ巻きカウント(と私が名づけました)は、
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 goosk


6117 : 小川慶一の回答 (2016-03-25 07:40:21)

受講生 さん:

>現実にカウンターで計測する時のことを考えると、直前に初期化するのが自然ですね。

ですね。
というか、ITものについて学ぶときは、「要は、これはリアルで言えばどういうことなの?」ということを考えてみるとよいです。

最適なプログラムの動作の流れ(アルゴリズム、と言います)を思いつくためにぜひとも持ちたい視点です。
リアルの業務を処理するためにプログラムを書くわけですし、「エクセルに落としこむ」段階で、すでにその視点での活動ははじまっています。

>自分が今思いつけるメリッ・トデメリットはこのくらいしかありません。
>もっとForNextの経験を積んだら思いつくかも。

今はそのくらいで十分かと思いますよ。
経験をつまないとしっくりこないことはいろいろあります。ここまで学ばれた gooska さんでしたら、そのこともご理解いただけることでしょう。


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

小川先生、
わかりやすいたとえ話をありがとうございます。

現実にカウンターで計測する時のことを考えると、直前に初期化するのが自然ですね。

私がnextの前に初期化を入れてみたのは、nextが入れ子になっているとステップが複雑なので、
どこで初期化されるのか慣れない私には まだ分かりにくかったからです。
集計表に書き込んだ直後であれば、カウンタ変数の役目はいったん終わるわけですから、そこで0にしてしまおうかと。
メリットは、初心者にわかりやすい場所かなと思えたことです。

通常の、新しいカウントを始める直前での初期化、メリットは通常のFORNEXT構文での位置と同じなので、
時間が経って自分で振り返ったり他人が見た場合、理解しにくい。
同様に、next前の初期化はたぶんあまり他の人がそう書かないので、わかりにくい。

自分が今思いつけるメリッ・トデメリットはこのくらいしかありません。
もっとForNextの経験を積んだら思いつくかも。
by goosk


6095 : 小川慶一の回答 (2016-03-24 13:00:42)

受講生 さん:

リアルにたとえて考えてみます。

あなたが牧場の子供ふれあい広場にいると想像してください。
そこには、ヤギと、羊と、うさぎがいます。
あなたは、左手にカウンター、右手に集計用紙とエンピツを持っています。

まずは、ヤギの数を数えようと思いました。
そこで、あなたは、手に持っていたカウンターの値を0に戻してから、ヤギを見かける都度、カチ、カチ、。。。とカウンターを押していきます。
すべてのヤギをチェックし終えたと思ったら、カウンターの値を確認します。そこには「5」と表示されていました。
そこで、あなたは、手元の集計表に「ヤギ→5匹」と記入しました。

次に、あなたは、羊の数を数えようと思いました。
そこで、あなたは、手に持っていたカウンターの値を0に戻してから、羊を見かける都度、カチ、カチ、。。。とカウンターを押していきます。
すべての羊をチェックし終えたと思ったら、カウンターの値を確認します。そこには「7」と表示されていました。
そこで、あなたは、手元の集計表に「羊→7匹」と記入しました。

次に、あなたは、うさぎの数を数えようと思いました。
そこで、あなたは、手に持っていたカウンターの値を0に戻してから、うさぎを見かける都度、カチ、カチ、。。。とカウンターを押していきます。
すべてのうさぎをチェックし終えたと思ったら、カウンターの値を確認します。そこには「4」と表示されていました。
そこで、あなたは、手元の集計表に「うさぎ→4匹」と記入しました。

みたいなことをしているわけです。


そう考えると、「カウンターを0にするタイミングはいつがいいのか?」という問いは、

[1] 新しい動物について数え始める直前がいいのか?
[2] 何かの動物について数え終わった直後がいのか?

という議論と同じですね。あなたなら、どちらを選びますか。
どちらにもメリット、デメリットがあると思います。[1], [2]のやり方それぞれのメリットを挙げてみてください。


6048 : 受講生さんのコメント (2016-03-23 15:01:56)

カウントの初期化についてですが、合計数を記述した後に初期化してから次のNextに行くように
書いても問題ないでしょうか。一応試してみたら同じ数値は得られましたが。

     Range("F" & syurui).Value = gokei
        gokei = 0
    Next

gooska


6047 : 受講生さんのコメント (2016-03-23 14:36:48)

何度も見たり作成したりして、1種類のカウントはマスタ―しました。
ForNextが入れ子になる複数のカウントはもう少し練習します。
やはりカウントを初期化する=0の式をどこで入れるかですよね。
カウント数を記述する行と、初期化の行が大事ですね。
goosk


6042 : 海上 美弥子さんのコメント (2016-03-22 16:55:26)

1回視聴しただけでまだ自分で試していません。COUNTIF関数がマクロで書けることに感動しました。
COUNTIF関数を使い慣れているせいか、今回のマクロは難しく感じました。
次の処理のためにカウント変数を0に戻さないといけないことはよくわかりましたが、
初期化する位置があの行だということが、現段階で理解できていません。
たぶん今このエラーを修正せよと言われたら対処できないと思います。
まず慣れが必要かと思うので、練習してみます。
goosk


5502 : 小川慶一の回答 (2015-12-26 18:25:45)

古川智之 さん:

コメントありがとうございます。
説明の流れ直しましたからね。

>この出現回数の数え方の説明、めちゃくちゃわかりやすいです!!感動しました!
>


5496 : 古川智之さんのコメント (2015-12-23 18:40:35)

この出現回数の数え方の説明、めちゃくちゃわかりやすいです!!感動しました!


5422 : 小川慶一の回答 (2015-12-12 09:41:31)

受講生 さん:

>とてもよくわかりました!自信を持って続けてみます。

それがいちばんです。良かったです。楽しんで継続してください。
何かあれば、またいつでもどうぞ (^^



>>小川慶一 さん:
>勉強方法のアドバイスありがとうございます。
>以下の方法で引き続きマクロを練習してみます。
>とてもよくわかりました!自信を持って続けてみます。
>
>>受講生 さん:
>
>>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
>
>


5417 : 受講生さんのコメント (2015-12-11 11:31:29)

>小川慶一 さん:
勉強方法のアドバイスありがとうございます。
以下の方法で引き続きマクロを練習してみます。
とてもよくわかりました!自信を持って続けてみます。

>受講生 さん:

>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


5415 : 小川慶一の回答 (2015-12-10 10:10:24)

受講生 さん:

>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


5411 : 受講生さんのコメント (2015-12-09 22:19:48)

小川様 お世話になっております。勉強方法について質問させてください。
1.動画を見る前に問題を自分で考えてから解いてみて、動画をみる。
2.動画を見てから自分で同じように書いて練習する。
私は、1でやるとまったく想像力がないので。。手が止まってしまいやる気を失ってしまいます。
2の方法でも上達するでしょうか。それともおすすめはやはり1の方法でしょうか。
個人個人で最適な勉強方法は違うと思いますが。。先生のご意見を教えていただけましたら幸いです。
あと、数学や算数がまったく得意でないのですが。。それにマクロの取得は関係ありますか?
得意不得意関係なくある程度のところまではマクロは書けるようになりますか。
動画のおかげで確実に上達しているとは思うのですが、不安な気持ちです。励ましてください!

どうぞよろしくお願いいたします。


5010 : 小川慶一の回答 (2015-09-04 09:16:39)

仲村 修治 さん:

単純なノウハウの積み重ねですね。


4996 : 仲村 修治さんのコメント (2015-09-03 00:06:36)

多くの方が書いていますが、シンプルな書き方が参考になりました。

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


4686 : 小川慶一の回答 (2015-07-15 13:01:51)

鈴木優子 さん:

そういうところを含めて練習で勘がやしなわれていきます (^^


>自力で書いた時は 直前の問題まで使っていた 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
>


4672 : 鈴木優子さんのコメント (2015-07-11 23:51:24)

自力で書いた時は 直前の問題まで使っていた 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


3779 : 小川慶一の回答 (2015-02-08 23:58:48)

匿名 さん:

>そこで、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から始まるのだと確認しました。
>何だか、すごく手間のかかることをしていますね(^_^;)


3772 : 受講生さんのコメント (2015-02-08 11:13:15)

こんにちは。
最初に自力でやった時は、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から始まるのだと確認しました。
何だか、すごく手間のかかることをしていますね(^_^;)


3733 : 小川慶一の回答 (2015-02-03 22:49:24)

watanbe daichi さん:

シンプル最強です☆

>いつもありがとうございます。
>3回くらい書いてみるとなんとなく、形が見えてきました。
>変数は、使用する数と場所を要注意だと解りました。
>このバランスで、いろんな事もシンプルに考えることができました。


3732 : 小川慶一の回答 (2015-02-03 22:48:56)

ゲスト さん:

「イチから書く」という身体を使った体験がやはり強力です。
語学でもそうですが、プログラミング言語もやはり言語学習なので、その点共通です。


>前回の動画の知識も使いつつ、簡素にIfThenElseを使って自分で書いてから動画を見るとやはり学ぶところがありました.゚+.(o´∀`o)゚+.゚


3721 : watanbe daichiさんのコメント (2015-02-01 19:02:42)

いつもありがとうございます。
3回くらい書いてみるとなんとなく、形が見えてきました。
変数は、使用する数と場所を要注意だと解りました。
このバランスで、いろんな事もシンプルに考えることができました。


3720 : 佐藤 あゆむさんのコメント (2015-02-01 09:35:54)

前回の動画の知識も使いつつ、簡素にIfThenElseを使って自分で書いてから動画を見るとやはり学ぶところがありました.゚+.(o´∀`o)゚+.゚


3413 : 小川慶一の回答 (2014-12-07 17:14:26)

井上 聡 さん:

マウスで選択してコピー&ペーストすればそもそもそういうことには悩まないで済みます。
メールも届いていると思います。そのメールにあるURLをクリックしても見られるかと。

>https://www.dropbox.com/s/frvs05wxv8yI82z/kiso_follow10_shitumomkaitou.mp4?dI=0の動画がひらきません。I82でしょうか182でしょうか。I=0のIはLの大文字でしょうか。数字の1でしょうか。ただの|(棒)でしょうか。


3408 : 井上 聡さんのコメント (2014-12-05 19:47:06)

tes


3384 : 小川慶一の回答 (2014-12-03 17:03:11)

井上 聡 さん:

以下の動画を参考にしてください。
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の中でしかカウントされないのでしょうか。
>カウントされない理由はなぜですか。?


3383 : 井上 聡さんのコメント (2014-12-03 15:58:20)

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の中でしかカウントされないのでしょうか。
カウントされない理由はなぜですか。?


2565 : 小川慶一の回答 (2014-09-27 09:31:24)

匿名 さん:

アルゴリズムについては、基礎編フォロー動画後半ででてくるので、そちらにて。
気になるようでしたら、先に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


2563 : 受講生さんのコメント (2014-09-26 20:05:39)

小川先生:

ユニークリストの作成、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
>>>
>>
>


2560 : 小川慶一の回答 (2014-09-26 07:11:37)

匿名 さん:

>ユニークリストの作成ということでしょうか?

はい、そうです。

ユニークリスト作成自体はアルゴリズムそんなに難しくありません。
(よく考えたら、基礎編フォロー動画でも後半に登場しました (^^; )

基礎編の道具だけでも、相当のことができますよ。
あと、基礎編フォローでは主要なアルゴリズムはほぼ網羅しています。

>余談ですが、小川先生のさりげないブレークポイントの使い方も大変参考になりました。

生収録の魅力ですね。
見ていると分かるとおりけっこう失敗していますが、失敗した状態からどう修正するか?というのも大切なノウハウなので、すべて晒すようにしています。

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



>小川先生:
>ご返信ありがとうございます。
>
>>その場合は、キャンペーンタイプのリストを自分で作成することになります。(発展編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
>>
>


2557 : 受講生さんのコメント (2014-09-25 20:27:49)

小川先生:
ご返信ありがとうございます。

>その場合は、キャンペーンタイプのリストを自分で作成することになります。(発展編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
>


2553 : 小川慶一の回答 (2014-09-25 06:43:03)

匿名 さん:

よいかと 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


2551 : 受講生さんのコメント (2014-09-24 21:32:26)

小川先生

>>あと、上級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 Su


1190 : 小川慶一の回答 (2014-05-10 13:48:16)

薄木洋祐 さん:

いいですね!

僕なら、 dim goukei は dim goukei1 にするかな。

Sub count_ogawa1()
    Dim gyo As Long
    Dim goukei1 As Long
    Dim goukei2 As Long
    Dim goukei3 As Long
    goukei1 = 1
    goukei2 = 1
    goukei3 = 1
    For gyo = 4 To 33
        Select Case Range("c" & gyo).Value
            Case Is = Range("e4").Value
                Range("f4").Value = goukei1
                goukei1 = goukei1 + 1
            Case Is = Range("e5").Value
                Range("f5").Value = goukei2
                goukei2 = goukei2 + 1
            Case Is = Range("e6").Value
                Range("f6").Value = goukei3
                goukei3 = goukei3 + 1
        End Select
    Next
End Sub


あと、上級DVDで紹介している「配列」を使うと以下のとおり。
出力部分については考えてみてください。

Sub count_ogawa2()
    Dim gyo As Long
    Dim goukei(2) As Long
    goukei(0) = 1
    goukei(1) = 1
    goukei(2) = 1
    For gyo = 4 To 33
        Select Case Range("c" & gyo).Value
            Case Is = Range("e4").Value
                Range("f4").Value = goukei(0)
                goukei(0) = goukei(0) + 1
            Case Is = Range("e5").Value
                Range("f5").Value = goukei(1)
                goukei(1) = goukei(1) + 1
            Case Is = Range("e6").Value
                Range("f6").Value = goukei(2)
                goukei(2) = goukei(2) + 1
        End Select
    Next
End Sub



1181 : 薄木洋祐さんのコメント (2014-05-08 12:54:34)

Sub count()    Dim gyo As Long    Dim goukei As Long    Dim goukei2 As Long    Dim goukei3 As Long    goukei = 1    goukei2 = 1    goukei3 = 1    For gyo = 4 To 33        Select Case Range("c" & gyo).Value        Case Is = Range("e4").Value            Range("f4").Value = goukei            goukei = goukei + 1        Case Is = Range("e5").Value            Range("f5").Value = goukei2            goukei2 = goukei2 + 1        Case Is = Range("e6").Value            Range("f6").Value = goukei3            goukei3 = goukei3 + 1        End Select    Next            End Sub


こんな感じでできました


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

小俣さん:

この動画のポイントは、「初期化を自分でする」ということです。
これまで小人ちゃんが勝手にやってくれていたことを、自分でしています。

そのとき、自力で制御できることがひとつ増えています。

自力で制御できることが増えるとやれることの幅も広がります。


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

初見で書いたコードです。
結果はうまく行ったのですが、スッキリしたコードにならなくてもやもやしながら解説動画を見ました。

Sub test2()
    Dim siso
    Dim kanpyo
    Dim nomimono
    Dim hida
    Dim migi
    migi = 4
    siso = 0
    kanpyo = 0
    nomimono = 0
    For hida = 4 To 33
        If Range("C" & hida).Value = Range("E4").Value Then
            siso = siso + 1
        End If
        Range("F" & migi).Value = siso
    Next
    migi = migi + 1
    For hida = 4 To 33
        If Range("C" & hida).Value = Range("E5").Value Then
            nomimono = nomimono + 1
        End If
        Range("F" & migi).Value = nomimono
    Next
    migi = migi + 1
    For hida = 4 To 33
        If Range("C" & hida).Value = Range("E6").Value Then
                kanpyo = kanpyo + 1
        End If
        Range("F" & migi).Value = kanpyo
    Next
    migi = migi + 1
End Sub


右のテーブルのForループの中で左のテーブルのForループをさせる。

これがやりたかったんです!

解説動画を見てスッキリしました。

これは絶対マスターしなければ...φ(..)


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

北嶋さん:

変数の初期値については、発展編で扱います。

初期値を明示的に設定するかどうかは、微妙なところ。

コーディングの効率性という視点で言うと、設定は不要。
高速性という意味で言うと、すでに0に設定されている値について再度0にする作業が入るのはある意味好ましくない。
可読性(特に、レベルの低い人に分かるように書くという意味で)という視点で言うと、設定はしたほうがよい。

プログラムは、コーディングの効率性、高速性、可読性というある意味相反する要素を天秤にかけながら書くことになります。
どのバランスを採るかは、ケースバイケースです。


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

Sub kazoe()
    Dim count
    count = 0
    Dim gyo
    For gyo = 4 To 33
        If Range("c" & gyo).Value = "しそ巻き無料" Then
            count = count + 1
        End If
    Next
    Range("f4").Value = count
End Sub


上のようにcount=0と初期値を入れなくても、小人ちゃんが0にしてくれるんですね。
便利ですけど、なんかフワフワしてて個人的には好きではないかもです。
ちゃんと書いたほうがスッキリするような気がします。


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

> 思考がそのまま表現されますね。

ですです。手順の整理とか、書いていくプロセスとか、モロに出ます。


> フォローアップ講座に追いついたら復習します。
> (きっと今回とは違ったものが見えるはず・・・キット)

いいセンスです。適当なところで切り上げるのが上手な学び方のポイントです☆

Dim shisoDim nomiDim kanshiso = 0 これはいらないかもしれないが"0"を入力したい場合は必要かなnomi = 0 これはいらないかもしれないが"0"を入力したい場合は必要かなkan = 0 これはいらないかもしれないが"0"を入力したい場合は必要かな


0 を代入したほうがやや丁寧です。いいセンスですよ!
詳しくは、発展編で v(^^


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

解説を見ずにできたけど・・・
頭がついて行かない為か、"For Next構文"を2つ重ねて使うのは思いつかなかったです。
思考がそのまま表現されますね。

Sub mondai2()
    Dim shiso
    Dim nomi
    Dim kan
    shiso = 0 これはいらないかもしれないが"0"を入力したい場合は必要かな
    nomi = 0 これはいらないかもしれないが"0"を入力したい場合は必要かな
    kan = 0 これはいらないかもしれないが"0"を入力したい場合は必要かな
    Dim hen
    For hen = 4 To 33
        If Range("C" & hen).Value = "しそ巻き無料" Then
            shiso = shiso + 1
        ElseIf Range("C" & hen).Value = "飲みもの無料" Then
            nomi = nomi + 1
        ElseIf Range("C" & hen).Value = "かんぴょう巻き無料" Then
            kan = kan + 1
        End If
    Next
    Range("F4").Value = shiso
    Range("F5").Value = nomi
    Range("F6").Value = kan
End Sub

自分で理解しながら書いていますが、解説と比べると無駄が多いですね。
フォローアップ講座に追いついたら復習します。
(きっと今回とは違ったものが見えるはず・・・キット)


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

> for next構文の前にゼロにする別のお団子をもってきて初期化ができる。

そうそう。その「初期化」の概念が重要です。やっぱり、そのことに意識を向けないうちは初級~中の下くらいなんですよね。
VBAだと、いろんなところで小人ちゃんがさりげなく配慮して初期化をしてくれるんですが。
プログラムを書くこと自体に慣れてくると、いろいろなことに気づく余裕がでてきます。

自分で初期化するという発想を得られれば、別のシーンでも自然にそういうことをしようと思えるようになります。


> フォローアップ講座も後半に入ったので、昨日から前半の動画を1個ずつみなおしはじめました。簡単に感じるのがたまらなく嬉しいですね~。
> それと、学校の授業で表が出てくると、どういうマクロをかいたらいいか予測がついてくるようになったのも楽しいですね~。

いやー。分かります。その感覚。

ひきつづき、お楽しみを! (^


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

こんにちは~(*^o^*)

今日の問題を自力で解く段階で予測がついたことは次の3つ。
・求めたい値を示す変数が必要
・if構文を使ってend ifの前に+1がつくパターンのはず
・二つの表のそれぞれについての変数が必要

動画をみて確認したことは2つ。
・for next構文で計算させて、その後に最終の値をだす別のお団子をもってくる。
・for next構文の前にゼロにする別のお団子をもってきて初期化ができる。

左の表から100点以上の人だけ右の表にうつす問題の復習だとピンときたので、No.4の動画ももう1回みて復習しました。

フォローアップ講座も後半に入ったので、昨日から前半の動画を1個ずつみなおしはじめました。簡単に感じるのがたまらなく嬉しいですね~。

それと、学校の授業で表が出てくると、どういうマクロをかいたらいいか予測がついてくるようになったのも楽しいですね~。

day11も引き続きがんばりま~す。


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

星野さん:

その方針でよいと思います。
基礎編で登場する部品だけでもかなりのことをできます。

「中華包丁一本で何でも作れるようになる」というイメージでしょうか。
たくさんの調理器具を知っても、使いこなせないばかりか、頭が混乱するだけですから ヾ(´ー`)ノ

でも逆に言うと、ひとつの道具に習熟してから別の道具を学ぶと、相当に習得も早いです。
そして、最終的には、そのほうが近道でしょう。


286 : 星野さんのコメント (2013-03-09 00:00:00)

小川先生、こんにちは。
お返事ありがとうございます。
>あまりたくさん道具を渡すと混乱を招いてしまうので、基礎編では扱っていません。
発展編で扱う内容です。

ありがとうございます。
私もそのほうが頭が混乱しませんし、
頭を使ってる感じがするので、このままでやっていきます。


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

星野さん:

コメント欄へようこそ ヾ(´ー`)ノ

> Countifを使ってVBA上で表現することは可能なのでしょうか。

ご質問は、「可能かどうか」ですね。
でしたら、「可能です」というのが答えです。

あまりたくさん道具を渡すと混乱を招いてしまうので、基礎編では扱っていません。
発展編で扱う内容です。

今回の動画シリーズすべてやり終えたら特別に選考してお教えしますので、ご興味あれば、最終回の動画コメントででも、その旨表明ください。

..と言いつつ、この動画シリーズでも、どこかでちらと紹介したような気もしますが(汗


284 : 星野さんのコメント (2013-03-06 00:00:00)

小川先生、おはようございます。

ようやくフォローアップ講座、追いつきました!
追いついた記念に書き込みます。

今回の課題は、習った知識でできる方法が
あったという点に気づけ、理解度があがった(ように感じる)ので、
よかったです。



あと、質問があります。
Countifを使ってVBA上で表現することは
可能なのでしょうか。


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

結果として、正解しましたけど、2番の問題は1番のようにすぐにはマクロを書けなかったです。
最初、E列のループをC列のループに入れようとして、思いの外戸惑いました。

あと、変数の初期化は必ず行うものだと思っていましたが、画面を見ていると、例えば、累計を求めるなど、初期化をしない方が良い場合があると思いました。


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

> 初心者だから、ゆっくりと 一つづつ 解決したい気持ちがあります。

何をおっしゃいますやら。


僕なら、変数宣言の部分は、一段インデントします。


Rangeオブジェクトの取得をどうするかというのは、{好み, 可読性} の問題かと。

登場した範囲で細かい議論への僕の考え・感触を書くと以下のとおり:

[1]
.Offsetで取得するのと、 Cells(j, 6) で取得するのとでどちらのほうが早いかは、テストしないと分かりません。
もし Cells(j, 6) のほうが優れていたなら、 With ... End With を使う方針自体、どうだったかと。

[2]
With ... End With は、何度もそのオブジェクトにアクセスするなら使いたい。
ただし、With句の中で何回そのオブジェクトにアクセスするかで、するべきかどうかは異なりそう。
今回の場合、 .Value が一回。 .Offset が一回の合計二回です。上記[1]次第では、やらないほうがよかったかも。
(Withブロック内部で利用する回数が少ないときに使うと、かえって可読性が落ちる、という気も)

[3]
Cellsは、僕はあまり使わないです。
複数登場してくると可読性が落ちるのと、別シート上にある複数セルで指定される範囲を指定するときに冗長になる点が気になるので(発展編テキスト参照)。

[4]
With Range("E" & j)
.Offset(, 1) [*1]
End With



Range("F" & j) [*1]

の [*1], [*2] でどちらのほうがアクセスが早いかは分かりません。テストしてみないと。
なんとなく前者のほうが早い気はしますが、可読性で言うと後者か。

どっちの方針で書くべきかはケースバイケース。明らかにすぐ右のセルだ、というなら、前者もありか。

もっとも、

Range("E" & j).Offset(, 1)
Range("F" & j)

の比較なら、問題なく後者ですね。


Range("F" & j)といった記載方法について。

可読性、メンテナンス性をさらに高めるなら、

定数
S_LABEL = "E"
S_COUNT = "F"

を用意して

Range(S_COUNT & j)

と書いたほうがよい。
メンテナンス性についてさらに書くと、列が多い & 入れ替え、列の挿入削除等ひんぱんにあるシートでマクロを記述するとき、

たとえば一列追加なら

S_COUNT = "G"

と修正すれば済む点秀逸。

[4-1]
もっとも、Offsetでも、

I_LABEL = 0
I_COUNT = 1

とかにしておいて、すべて Offset で表現してしまうのもあり。

Range("E5").Offset(m, n) でやる。

その場合、 Cells(j ,5).Offset(m, n) 、 Range("E" & j).Offset(i) といった取得方法は、可読性、アクセススピードともに劣ると思われる。
(というか、どうせ .Offset使うなら、Offsetだけにして、 Range() や Cells() 内の引数は固定値にしてくれ!と言いたくなる。)

[5]
総じて言うと、基礎編で呈示している

Range("F" & j)

といった形は、文字列の結合にかかるコスト、戻り値にコレクションも取り得て引数も miscellaneous なプロパティということで単一のセルを取得するまでのコストはおそらく高そうだが、初心者には直感的で分かりやすい点秀逸。

別シート上にあるセルを指定するときも、そのセルの名前を声に出して読み上げてから、

Worksheets("hoge").Range("F5")

といった具合に書けばよいですし、ITリテラシーがまだあまり高くない人でも分かる。非常に直感的。

オブジェクトの取得にかかるコストは基礎編レベルの受講生にとって重大な問題ではないですし。
(そもそもまるでマクロなんて書けない人が書けるようになっただけで莫大な成果。「パフォーマンスがどう」とか「横に連続計算したい」とか、そういうレベルの議論をしたくなるところまで連れて行くのが基礎編の目標)


> 何が良くて 何が最悪で

という話に戻すと、Excel VBAで高速性を求めることがそもそも間違い?もともとスクリプト言語なので、実行速度はあまり重要ではない気も。
「Perlを使って、アクセス数の多いwebシステムを書く」とかならともかく、四六時中動いているシステムを作るために書く言語ではないですし(「月次決算用のマクロ」とかだと、使用頻度は月1回なわけです)。

一度きりの仕事をテキトーに処理するための「書きなぐって使い捨て」なんてマクロもたくさん書きます。

事務仕事の変化に合わせて書き直すことを前提として考えたときにも、一般事務職の人が「月に一度しか動かさないシステム」のメンテナンスをするなら、「それを書いた人にとって可読性が高い」ということが最優先かと思います。
最適化のために可読性やメンテナンス性を落としても、そのデメリットを吸収できるだけのベネフィットを得られないケースがほとんどかと思います。


280 : 受講生さんのコメント (2013-02-22 00:00:00)

初心者だから、ゆっくりと 一つづつ 解決したい気持ちがあります。
どんな コードでも動いてしまいまが、何が良くて 何が最悪で 何が、、、
そんな 気持ちのまま 講座の受講をさせて頂きました。
改善すべき事、小川先生が お勧めの方法を お願いします。

Public Sub 商品別数量()
Dim i As Long, j As Long, j_cut As Long
 
    For j = 4 To 6
        j_cut = 0
        With Cells(j, 5)
            For i = 2 To 33
                If Cells(i, 3).Value = .Value Then
                    j_cut = j_cut + 1
                End If
            Next i
            .Offset(0, 1).Value = j_cut
        End With
    Next j
 
End Sub


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

豊島さん:

詳しい解説は発展編に譲りますが、変数には「初期値」というものがあります。
変数を作った直後に、すでに値が入っているのです。

「初期化をしないほうがよい」のではなく、明示的に初期化しなくても、初期値をそのまま利用した、という感じですね。
もちろん、初期値があるにもかかわらず、ループの前とかに明示的に変数に 0 なり "" なりの値を設定してもかまいません。
(そうすれば、その分可読性も高くなります)


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

山根さん:

3つくらいなら、これでもOKですね。

あとは、教えていませんし、たぶんまだ早いですが、さらに上級のテクニックとして、配列を使う方法もエレガントかも。


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

For Nextをネストさせる方法は浮かんだのですがあえてそれ以外でやってみるか、ということで書いてみました。

Sub kyan() 
Dim gyo As Long
Dim siso As Long
Dim nomi As Long
Dim kan As Long
 
siso = 0 
nomi = 0 
kan = 0 
 
For gyo = 4 To 33 
If Range("e4").Value = Range("c" & gyo).Value Then
siso = siso + 1 
ElseIf Range("e5").Value = Range("c" & gyo).Value Then
nomi = nomi + 1 
ElseIf Range("e6").Value = Range("c" & gyo).Value Then
kan = kan + 1 
End If
Next
Range("f4").Value = siso 
Range("f5").Value = nomi 
Range("f6").Value = kan 
End Sub


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

佐藤さん:

> 初期化はなるほどと思いました。

小人ちゃんに勝手にやってもらう代わりに、自分でする、ということですね。

> どうしてこれで3種類全部数えられるか、とか理解はできていません~

今日あたり、あらためて振り返るとあっさり分かるのではないでしょうか?どうでしょう? (^_


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

動画を見ながらやりました。
あっさりと動くけど、どうしてこれで3種類全部数えられるか、とか理解はできていません~
とりあえず覚えます。
初期化はなるほどと思いました。


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

とにかくまず、しそ巻きの出現回数だけとってこれるか。

それができれば、新しく作るfornext構文の入りで明示的にカウンター変数を初期化するだけです。


274 : 長江秀展さんのコメント (2012-11-01 00:00:00)

自力では解けませんでした。とりあえず覚えます。


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

苦労して色々とやってみましたがダメでした。Countif関数みたいなのがあるのかと思って(*_*;、断念して動画を見てまたまた目から鱗でした。


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

今回は自力では無理でした。素直に動画を見ることにしました。変数の初期化は思いもつかなかったです。また、”goukei=0” とした構文をどこに挿入するかも迷ってしまいそうです。


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

問1は問題なし。

問2は動画解説と同じように goukei = 0 を入れてなかったので
思うような結果にはならず、初期化するという概念も忘れていました。


271 : 有家 健司さんのコメント (2012-10-16 00:00:00)

最初は回数を数えるオブジェクト言語(rangeみたいなの)があるのかと思ったんですが、これまでの知識で対応できた訳ですね。
解説見ないとわかりませんでした。復習します。

Sub kaisu()
Dim goukei
Dim f
For f = 4 To 6
goukei = 0
Dim c
For c = 4 To 33
If Range("C" & c).Value = Range("E" & f).Value Then
goukei = goukei + 1

End If
Next
Range("F" & f).Value = goukei
Next
End Su


1243 : 受講生さんのコメント (2012-09-05 06:41:00)

初期化を組み込むのは便利ですね!

今回、僕が書いたダブりの多いコード(下に記してあります)をスリムにするのに、まさに必要ですね。



あと、[1]で頻度をカウントする変数を入れる位置も勉強になりました。

これまでやったフォローアップでも、同じようにできるか確かめてみようと思います。



'[1]

Sub test()

Dim hindo

hindo = 1

Dim gyo

For gyo = 4 To 33

If Range("C" & gyo) = "しそ巻き無料" Then

Range("F4") = hindo

hindo = hindo + 1

End If

Next

End Sub





'[2]

Sub test1()

Dim shindo

Dim nhindo

Dim khindo

shindo = 1

nhindo = 1

khindo = 1

Dim gyo

For gyo = 4 To 33

If Range("C" & gyo) = "しそ巻き無料" Then

Range("F4") = shindo

shindo = shindo + 1

ElseIf Range("C" & gyo) = "飲みもの無料" Then

Range("F5") = nhindo

nhindo = nhindo + 1

Else

Range("C" & gyo) = "かんぴょう巻き無料"

Range("F6") = khindo

khindo = khindo + 1

End If

Next

End Sub


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) 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ