各資料ごとに1番からの番号を割り振る。AutoFill機能より便利なマクロ

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

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

解説

演習問題テーマ:各資料ごとに1番からの番号を割り振る。AutoFill機能より便利なマクロ

1つ上の行と比べて同じか違うかによってわりふる数字が変わるというのがポイント。

2番目の問題は、同じカテゴリーの中では順番に番号を1個ずつ増やしてわりふる仕組み、違うカテゴリーになったら先頭番号を1に戻してからまた順番に番号を1個ずつ増やしてわりふる仕組み、をよくみてください。

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

10567 : 小川慶一の回答 (2018-09-13 08:27:19)

受講生 さん:

受講生さんの理解と納得感が深まったようでよかったです。

そうなんです。実は、手を動かすと理解と納得の度合いがぜんぜん違います。

とりわけ良いな、と感じられたのは、以下です。

>基礎を再確認するためにも、自分の間違えたマクロを元に小人ちゃんシートに反映もさせていきました。

「変数」と「変数の使い方」の対応も修正できたようでよかったです。

演習は、「横に人がいるつもりで、その人に説明しながら解く」というのがとてもよいですよ。
自分が何は分かっていて、何はスラスラできて、何はなおざりにしているのか、が如実に分かります。
それで、理解不足?と感じられたところについては、必要に応じて以下の順序で再確認します。
・まずはいろいろコードをいじってチェック
・マインドマップレジュメでチェック
・テキストPDFを読んでみる
・動画講座で再確認
・さらに必要なら、手書きワーク

そのうえで、そこで再確認したことについて、「横に人がいるつもりで、その人に説明してみる」というのをしてみます。
少ししんどいですが、なおざりにしているところは先に進んだところで結局自分で自分を落とす落とし穴になります。

>基礎フォローアップベーシックも最終にさしかかるにつれて、少しずつできるようになってきた楽しさと自信から

復習と新しい学びとを同時並行されるのがよいですよ。
この先、過去問1つ、新問題1つ、という順番で解いていくとか。

たとえば、基礎編フォローアップベーシックの問題を1つ解いたら、アドバンスの問題を1つ解く、のくり返しです。

工夫して、楽しんで学んでください (^^)/~



> 返信が遅くなってしまい申し訳ありません。
> トンチンカンな質問に対して丁寧に指導いただき、ありがとうございます。
>
> [a]の基礎講座第1章8と9を見直したところ、自分の間違いに気がつきました。格納された変数は右辺で利用される。左辺に変数を持ってくるということは、変数を格納するということであり、私がIF構文ないでやっていたことは、一度格納したBANGOという変数の内容を変更していただけだと、ハッとしました。よくよく冷静になって自分のマクロを見れば明白な間違いなのに、基礎フォローアップベーシックも最終にさしかかるにつれて、少しずつできるようになってきた楽しさと自信から、一度学んだ基礎の知識を置き去りにして、練習問題を解いていたように思います。基礎を再確認するためにも、自分の間違えたマクロを元に小人ちゃんシートに反映もさせていきました。小人ちゃんシートを使うと自分の書いたマクロをキチンと一つずつ理解しながら、反映ができるので、とても良かったです。基礎ができていないことを先生にご指摘いただき、ここで改めて基礎の大切さに気づけて本当に良かったです。ありがとうございました。
>
> ----------------------------
> >コメント番号10378で投稿したマクロのRange("B" & GYO).Valueの箇所をコメント番号10443で投稿したマクロのように関数(BANGO)に置き換えるとエクセルに反映されなくなります。
> >このような関数の使い方は出来ないということなのでしょうか。という質問になります。
>
> そういうご質問でしたか。
>
> >関数(BANGO)に置き換えると
> ↑
> ここで、用語を間違えています。これは関数ではありません。
>
> >このような関数の使い方は出来ないということなのでしょうか。
> ↑
> 上記のとおり、BANGOは関数ではありません。
> なので、「このような関数の使い方は出来ないということなのでしょうか」という質問には、回答不能です。
>
> 用語を間違えていて、機能への理解もできてない...ということなので。
> このタイミングで、以下の動画を復習し、用語とその機能について、ご自身の知識を修正してください。
>
> ○基礎講座第1章8 - 変数を使ったプログラム、変数を使う意義
> https://online.pc5bai.com/movie/index/25/104/
>
> [a] まずは動画をひととおり見て、用語とその意味を確認してください。
>
> [b] 次に、動画にあわせて、「こびとちゃんシート」を使って、こびとちゃんになったつもりで、一行一行、マクロのコードの内容をシートに反映させていってください。
>
> [c] 上記のワークをしっかりやったあと、さらに、コメント番号10443のマクロを見直してください。
>
> [d] それでもどこがどう問題なのか?が分からなければ、「こびとちゃんシート」を使って(*)、こびとちゃんになったつもりで、一行一行、コメント番号10443のマクロのコードの内容をシートに反映させていってください。
>
> (*)こびとちゃんシートは19行目まではないですが、4行目から9行目まではFor Next構文に従っで実際に作業してください。10行目以降はやらなくてOKです。
>
> [a]-[d] までのどこかで、何をどう勘違いしていたのか?ということについて、すっきり整理して理解できるかと思います。
> 無事に理解できましたら、[a]-[d] までのどこで問題解決できたか?お知らせください。
>
> [e] もしここまでやっても分からなかった場合は、上記[d]のワークをやった結果のこびとちゃんシート、手書きワークをやりおえた状態のものをお送りください。
> PDFファイルでもJPGファイルでもかまいません。スキャンまたは携帯で撮影した画像。どちらでも構いません。
> ファイルをお送りいただけたなら、そのファイル、コメント番号10443のマクロを使って解説します。
>
>
> [a]-[d]のワークは、とても面倒に感じられるかもしれません。
>
> でも、なぜ、講座本編でもわざわざこういうワークをやる時間を取っているのか?というと、それは、こういう手書きワークはとても重要だからです。
>
> それに、多少手書きワークをしたとしても、基礎編フォローの演習問題にチャレンジするのにかかる総時間と比べたら微々たるものですので、ここは面倒でもやってみてください。
>
> 漫然とマクロを実行しているだけのときとは比べようのない大きな学びを得ることができるでしょう。


10565 : 受講生さんのコメント (2018-09-11 15:37:50)

返信が遅くなってしまい申し訳ありません。
トンチンカンな質問に対して丁寧に指導いただき、ありがとうございます。

[a]の基礎講座第1章8と9を見直したところ、自分の間違いに気がつきました。格納された変数は右辺で利用される。左辺に変数を持ってくるということは、変数を格納するということであり、私がIF構文ないでやっていたことは、一度格納したBANGOという変数の内容を変更していただけだと、ハッとしました。よくよく冷静になって自分のマクロを見れば明白な間違いなのに、基礎フォローアップベーシックも最終にさしかかるにつれて、少しずつできるようになってきた楽しさと自信から、一度学んだ基礎の知識を置き去りにして、練習問題を解いていたように思います。基礎を再確認するためにも、自分の間違えたマクロを元に小人ちゃんシートに反映もさせていきました。小人ちゃんシートを使うと自分の書いたマクロをキチンと一つずつ理解しながら、反映ができるので、とても良かったです。基礎ができていないことを先生にご指摘いただき、ここで改めて基礎の大切さに気づけて本当に良かったです。ありがとうございました。

----------------------------
>コメント番号10378で投稿したマクロのRange("B" & GYO).Valueの箇所をコメント番号10443で投稿したマクロのように関数(BANGO)に置き換えるとエクセルに反映されなくなります。
>このような関数の使い方は出来ないということなのでしょうか。という質問になります。

そういうご質問でしたか。

>関数(BANGO)に置き換えると

ここで、用語を間違えています。これは関数ではありません。

>このような関数の使い方は出来ないということなのでしょうか。

上記のとおり、BANGOは関数ではありません。
なので、「このような関数の使い方は出来ないということなのでしょうか」という質問には、回答不能です。

用語を間違えていて、機能への理解もできてない...ということなので。
このタイミングで、以下の動画を復習し、用語とその機能について、ご自身の知識を修正してください。

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

[a] まずは動画をひととおり見て、用語とその意味を確認してください。

[b] 次に、動画にあわせて、「こびとちゃんシート」を使って、こびとちゃんになったつもりで、一行一行、マクロのコードの内容をシートに反映させていってください。

[c] 上記のワークをしっかりやったあと、さらに、コメント番号10443のマクロを見直してください。

[d] それでもどこがどう問題なのか?が分からなければ、「こびとちゃんシート」を使って(*)、こびとちゃんになったつもりで、一行一行、コメント番号10443のマクロのコードの内容をシートに反映させていってください。

(*)こびとちゃんシートは19行目まではないですが、4行目から9行目まではFor Next構文に従っで実際に作業してください。10行目以降はやらなくてOKです。

[a]-[d] までのどこかで、何をどう勘違いしていたのか?ということについて、すっきり整理して理解できるかと思います。
無事に理解できましたら、[a]-[d] までのどこで問題解決できたか?お知らせください。

[e] もしここまでやっても分からなかった場合は、上記[d]のワークをやった結果のこびとちゃんシート、手書きワークをやりおえた状態のものをお送りください。
PDFファイルでもJPGファイルでもかまいません。スキャンまたは携帯で撮影した画像。どちらでも構いません。
ファイルをお送りいただけたなら、そのファイル、コメント番号10443のマクロを使って解説します。


[a]-[d]のワークは、とても面倒に感じられるかもしれません。

でも、なぜ、講座本編でもわざわざこういうワークをやる時間を取っているのか?というと、それは、こういう手書きワークはとても重要だからです。

それに、多少手書きワークをしたとしても、基礎編フォローの演習問題にチャレンジするのにかかる総時間と比べたら微々たるものですので、ここは面倒でもやってみてください。

漫然とマクロを実行しているだけのときとは比べようのない大きな学びを得ることができるでしょう。


10446 : 小川慶一の回答 (2018-08-18 12:38:18)

受講生 さん:

>コメント番号10378で投稿したマクロのRange("B" & GYO).Valueの箇所をコメント番号10443で投稿したマクロのように関数(BANGO)に置き換えるとエクセルに反映されなくなります。
>このような関数の使い方は出来ないということなのでしょうか。という質問になります。

そういうご質問でしたか。

>関数(BANGO)に置き換えると

ここで、用語を間違えています。これは関数ではありません。

>このような関数の使い方は出来ないということなのでしょうか。

上記のとおり、BANGOは関数ではありません。
なので、「このような関数の使い方は出来ないということなのでしょうか」という質問には、回答不能です。

用語を間違えていて、機能への理解もできてない...ということなので。
このタイミングで、以下の動画を復習し、用語とその機能について、ご自身の知識を修正してください。

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

[a] まずは動画をひととおり見て、用語とその意味を確認してください。

[b] 次に、動画にあわせて、「こびとちゃんシート」を使って、こびとちゃんになったつもりで、一行一行、マクロのコードの内容をシートに反映させていってください。

[c] 上記のワークをしっかりやったあと、さらに、コメント番号10443のマクロを見直してください。

[d] それでもどこがどう問題なのか?が分からなければ、「こびとちゃんシート」を使って(*)、こびとちゃんになったつもりで、一行一行、コメント番号10443のマクロのコードの内容をシートに反映させていってください。

(*)こびとちゃんシートは19行目まではないですが、4行目から9行目まではFor Next構文に従っで実際に作業してください。10行目以降はやらなくてOKです。

[a]-[d] までのどこかで、何をどう勘違いしていたのか?ということについて、すっきり整理して理解できるかと思います。
無事に理解できましたら、[a]-[d] までのどこで問題解決できたか?お知らせください。

[e] もしここまでやっても分からなかった場合は、上記[d]のワークをやった結果のこびとちゃんシート、手書きワークをやりおえた状態のものをお送りください。
PDFファイルでもJPGファイルでもかまいません。スキャンまたは携帯で撮影した画像。どちらでも構いません。
ファイルをお送りいただけたなら、そのファイル、コメント番号10443のマクロを使って解説します。


[a]-[d]のワークは、とても面倒に感じられるかもしれません。

でも、なぜ、講座本編でもわざわざこういうワークをやる時間を取っているのか?というと、それは、こういう手書きワークはとても重要だからです。

それに、多少手書きワークをしたとしても、基礎編フォローの演習問題にチャレンジするのにかかる総時間と比べたら微々たるものですので、ここは面倒でもやってみてください。

漫然とマクロを実行しているだけのときとは比べようのない大きな学びを得ることができるでしょう。


> 初めの投稿での質問が下記になります。
>
> 「下のマクロを書いた際に、Range("B" & GYO).Valueも繰り返されるので
> 初め関数を使っていたのですが、資料番号が表に記入されませんでした。
> スッテプインで一つずつ確認しても
> 問題なく実行出来ているように見えるのですが、
> どうしてエクセルに反映されないのでしょうか。」
>
> つまり、コメント番号10378で投稿したマクロのRange("B" & GYO).Valueの箇所をコメント番号10443で投稿したマクロのように関数(BANGO)に置き換えるとエクセルに反映されなくなります。このような関数の使い方は出来ないということなのでしょうか。という質問になります。
>
> 紛らわしい書き方をしてすいません。
> よろしくお願いします。


10445 : 受講生さんのコメント (2018-08-18 11:30:53)

初めの投稿での質問が下記になります。

「下のマクロを書いた際に、Range("B" & GYO).Valueも繰り返されるので
初め関数を使っていたのですが、資料番号が表に記入されませんでした。
スッテプインで一つずつ確認しても
問題なく実行出来ているように見えるのですが、
どうしてエクセルに反映されないのでしょうか。」

つまり、コメント番号10378で投稿したマクロのRange("B" & GYO).Valueの箇所をコメント番号10443で投稿したマクロのように関数(BANGO)に置き換えるとエクセルに反映されなくなります。このような関数の使い方は出来ないということなのでしょうか。という質問になります。

紛らわしい書き方をしてすいません。
よろしくお願いします。

ーーーーーーーーーーーーーーーーーーーーー
>受講生 さん:

コメント番号10378で投稿されたマクロは以下。
Sub AAA()
Dim GYO
For GYO = 4 To 19
Dim NAME
NAME = Range("D" & GYO).Value
If NAME = "資料A" Then
Range("B" & GYO).Value = 1
ElseIf NAME = "資料B" Then
Range("B" & GYO).Value = 2
ElseIf NAME = "資料C" Then
Range("B" & GYO).Value = 3
End If
Range("C" & GYO).Value = Mid(Range("F" & GYO).Value, 2, 1)
Next
End Sub


そして、今回お送りいただいたファイルのモジュール「Module1」にあったマクロは以下です。

Sub AAA()
Dim NAMAE
Dim BANGO
Dim GYO
For GYO = 4 To 19
NAMAE = Range("D" & GYO).Value
BANGO = Range("B" & GYO).Value
If NAMAE = "資料A" Then
BANGO = 1
ElseIf NAMAE = "資料B" Then
BANGO = 2
ElseIf NAMAE = "資料C" Then
BANGO = 3
End If
Range("C" & GYO).Value = Mid(Range("F" & GYO).Value, 2, 1)
Next
End Sub


10444 : 小川慶一の回答 (2018-08-18 10:45:05)

受講生 さん:

コメント番号10378で投稿されたマクロは以下。

Sub AAA()
    Dim GYO
    For GYO = 4 To 19
        Dim NAME
        NAME = Range("D" & GYO).Value
        If NAME = "資料A" Then
            Range("B" & GYO).Value = 1
        ElseIf NAME = "資料B" Then
            Range("B" & GYO).Value = 2
        ElseIf NAME = "資料C" Then
            Range("B" & GYO).Value = 3
        End If
        Range("C" & GYO).Value = Mid(Range("F" & GYO).Value, 2, 1)
    Next
End Sub


そして、今回お送りいただいたファイルのモジュール「Module1」にあったマクロは以下です。

Sub AAA()
    Dim NAMAE
    Dim BANGO
    Dim GYO
    For GYO = 4 To 19
        NAMAE = Range("D" & GYO).Value
        BANGO = Range("B" & GYO).Value
        If NAMAE = "資料A" Then
             BANGO = 1
        ElseIf NAMAE = "資料B" Then
             BANGO = 2
        ElseIf NAMAE = "資料C" Then
             BANGO = 3
        End If
        Range("C" & GYO).Value = Mid(Range("F" & GYO).Value, 2, 1)
    Next
End Sub


10443 : 受講生さんのコメント (2018-08-18 03:05:06)

はい、二つ目の問題です。
自分で気づかないうちに間違った操作をしてるのかもしれないです。
お手数おかけしますが、添付ファイルの確認お願いします。

---------------------------
>受講生 さん:

動画の5分あたりから扱っている、2つ目の問題ですよね。
ちゃんと動きますね...。

ファイルごと送付いただけますか。
よろしくお願いいたします。


10393 : 小川慶一の回答 (2018-08-12 12:00:04)

受講生 さん:

動画の5分あたりから扱っている、2つ目の問題ですよね。
ちゃんと動きますね...。

ファイルごと送付いただけますか。
よろしくお願いいたします。




> 返信ありがとうございます。
>
> >今、僕の環境で試しました。
> >が、きちんと動作しますね。。
> >これとは別のマクロのことでしょうか。
> >でしたら、添削して欲しいマクロを別送してください。
>
> いえ、下記のマクロのことで間違いないです。
> きちんと動作しましたか、、、
> 先生に質問する前にも、エクセル、パソコン自体の再起動をかけて
> 試して見たのですが、きちんと動作せず、
> 先ほど、もう一度、先生にご指摘頂いた点を修正して
> 実行しましたが、やはりB列への反映がされませんでした。
>
> >[1] Dim NAME は、 For 文より前に持っていく
>
> for文の中にいつもDIM XXXを入れていました。
> 説明を頂いて初めて、よく考えてみればそうだなと気づきました。
> ありがとうございます。
>
> >[2] 変数名は NAME でなく他の言葉推奨
>
> もう一度、変数を活用するときの注意点を復習してみます。
> ありがとうございます。
>
> ーーーーーーーーーーーーーーーーーーーーー
> > 下のマクロを書いた際に、Range("B" & GYO).Valueも繰り返されるので
> > 初め関数を使っていたのですが、資料番号が表に記入されませんでした。
> > スッテプインで一つずつ確認しても
> > 問題なく実行出来ているように見えるのですが、
> > どうしてエクセルに反映されないのでしょうか。
>
> ↑
> 今、僕の環境で試しました。
> が、きちんと動作しますね。。
>
> これとは別のマクロのことでしょうか。
> でしたら、添削して欲しいマクロを別送してください。
>
> いただいたマクロについては、以下の2点修正したいですね。
> [1] Dim NAME は、 For 文より前に持っていく
> [2] 変数名は NAME でなく他の言葉推奨
>
> [1] は、いただいたマクロのような書き方だと、くり返しの回数だけ変数を作り直すことになります。僕の提案の方法なら、一度作った変数の中身を差し替えていくだけ。
> というか、「同じ名前の変数を何度も生成し直す」ということ自体、プログラミングでは推奨されません。
>
> [2] については、基礎編本編第1章「基礎講座第1章9 - 変数を活用するときの注意点」をまずは参照。
> https://online.pc5bai.com/movie/index/25/105/
>
> 英単語一語の変数名だと、実在するプロパティ等とかぶる危険性が高いです。(そして、実際、かぶってます)


10392 : 受講生さんのコメント (2018-08-12 07:52:42)

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

>今、僕の環境で試しました。
>が、きちんと動作しますね。。
>これとは別のマクロのことでしょうか。
>でしたら、添削して欲しいマクロを別送してください。

いえ、下記のマクロのことで間違いないです。
きちんと動作しましたか、、、
先生に質問する前にも、エクセル、パソコン自体の再起動をかけて
試して見たのですが、きちんと動作せず、
先ほど、もう一度、先生にご指摘頂いた点を修正して
実行しましたが、やはりB列への反映がされませんでした。

>[1] Dim NAME は、 For 文より前に持っていく

for文の中にいつもDIM XXXを入れていました。
説明を頂いて初めて、よく考えてみればそうだなと気づきました。
ありがとうございます。

>[2] 変数名は NAME でなく他の言葉推奨

もう一度、変数を活用するときの注意点を復習してみます。
ありがとうございます。

ーーーーーーーーーーーーーーーーーーーーー
> 下のマクロを書いた際に、Range("B" & GYO).Valueも繰り返されるので
> 初め関数を使っていたのですが、資料番号が表に記入されませんでした。
> スッテプインで一つずつ確認しても
> 問題なく実行出来ているように見えるのですが、
> どうしてエクセルに反映されないのでしょうか。


今、僕の環境で試しました。
が、きちんと動作しますね。。

これとは別のマクロのことでしょうか。
でしたら、添削して欲しいマクロを別送してください。

いただいたマクロについては、以下の2点修正したいですね。
[1] Dim NAME は、 For 文より前に持っていく
[2] 変数名は NAME でなく他の言葉推奨

[1] は、いただいたマクロのような書き方だと、くり返しの回数だけ変数を作り直すことになります。僕の提案の方法なら、一度作った変数の中身を差し替えていくだけ。
というか、「同じ名前の変数を何度も生成し直す」ということ自体、プログラミングでは推奨されません。

[2] については、基礎編本編第1章「基礎講座第1章9 - 変数を活用するときの注意点」をまずは参照。
https://online.pc5bai.com/movie/index/25/105/

英単語一語の変数名だと、実在するプロパティ等とかぶる危険性が高いです。(そして、実際、かぶってます)


10388 : 小川慶一の回答 (2018-08-11 18:52:03)

受講生 さん:

> 下のマクロを書いた際に、Range("B" & GYO).Valueも繰り返されるので
> 初め関数を使っていたのですが、資料番号が表に記入されませんでした。
> スッテプインで一つずつ確認しても
> 問題なく実行出来ているように見えるのですが、
> どうしてエクセルに反映されないのでしょうか。


今、僕の環境で試しました。
が、きちんと動作しますね。。

これとは別のマクロのことでしょうか。
でしたら、添削して欲しいマクロを別送してください。

いただいたマクロについては、以下の2点修正したいですね。
[1] Dim NAME は、 For 文より前に持っていく
[2] 変数名は NAME でなく他の言葉推奨

[1] は、いただいたマクロのような書き方だと、くり返しの回数だけ変数を作り直すことになります。僕の提案の方法なら、一度作った変数の中身を差し替えていくだけ。
というか、「同じ名前の変数を何度も生成し直す」ということ自体、プログラミングでは推奨されません。

[2] については、基礎編本編第1章「基礎講座第1章9 - 変数を活用するときの注意点」をまずは参照。
https://online.pc5bai.com/movie/index/25/105/

英単語一語の変数名だと、実在するプロパティ等とかぶる危険性が高いです。(そして、実際、かぶってます)



> 資料名が1、2、3と順番に並ばないことがある可能性を考えたため
> <>という発想がなく、先生の解説を見て目から鱗でした!
> 下記マクロを書いて、自分では出来た!と思っていたので、
> 問題の意図が掴めていなかったことに少しショックでした。笑
>
> 教材で<>を見た時、この比較演算子はどんな時に使うんだろうと
> 思っていましたが、こういう使い方ができるんですね。
> マクロがよりシンプルになるので、
> このパターンをきちんと体得できるように
> 繰り返し練習したいと思います。
>
> 質問
> 下のマクロを書いた際に、Range("B" & GYO).Valueも繰り返されるので
> 初め関数を使っていたのですが、資料番号が表に記入されませんでした。
> スッテプインで一つずつ確認しても
> 問題なく実行出来ているように見えるのですが、
> どうしてエクセルに反映されないのでしょうか。
>
> Sub AAA()
> Dim GYO
> For GYO = 4 To 19
> Dim NAME
> NAME = Range("D" & GYO).Value
> If NAME = "資料A" Then
> Range("B" & GYO).Value = 1
> ElseIf NAME = "資料B" Then
> Range("B" & GYO).Value = 2
> ElseIf NAME = "資料C" Then
> Range("B" & GYO).Value = 3
> End If
> Range("C" & GYO).Value = Mid(Range("F" & GYO).Value, 2, 1)
> Next
> End Sub
>


10378 : 受講生さんのコメント (2018-08-11 05:08:33)

資料名が1、2、3と順番に並ばないことがある可能性を考えたため
<>という発想がなく、先生の解説を見て目から鱗でした!
下記マクロを書いて、自分では出来た!と思っていたので、
問題の意図が掴めていなかったことに少しショックでした。笑

教材で<>を見た時、この比較演算子はどんな時に使うんだろうと
思っていましたが、こういう使い方ができるんですね。
マクロがよりシンプルになるので、
このパターンをきちんと体得できるように
繰り返し練習したいと思います。

質問
下のマクロを書いた際に、Range("B" & GYO).Valueも繰り返されるので
初め関数を使っていたのですが、資料番号が表に記入されませんでした。
スッテプインで一つずつ確認しても
問題なく実行出来ているように見えるのですが、
どうしてエクセルに反映されないのでしょうか。

Sub AAA()
Dim GYO
For GYO = 4 To 19
Dim NAME
NAME = Range("D" & GYO).Value
If NAME = "資料A" Then
Range("B" & GYO).Value = 1
ElseIf NAME = "資料B" Then
Range("B" & GYO).Value = 2
ElseIf NAME = "資料C" Then
Range("B" & GYO).Value = 3
End If
Range("C" & GYO).Value = Mid(Range("F" & GYO).Value, 2, 1)
Next
End Sub


10231 : 小川慶一の回答 (2018-07-08 15:01:40)

morimotoさん:

> 上下の比較gyo-1とgyoの手法はかなりびっくりしました。

前後のデータを比較するときの基本形です。

> それからgt=gt+1, id=id+1 ほんと重要だとわかりました。

カウンターを自分で動かすのも、基本中の基本ですね。


10227 : morimotoさんのコメント (2018-07-07 23:53:32)

方法が出てこず非常にむずかしかったです。上下の比較gyo-1とgyoの手法はかなりびっくりしました。これはこれでこの手法を覚えておきます。
それからgt=gt+1, id=id+1 ほんと重要だとわかりました。しそまき問題で出てきましたが、いろんなコードでよく見る場面ですので困ったら使えないか考えるようにします。ほんと勉強になります。


9349 : 小川慶一の回答 (2018-01-17 13:32:57)

吉川 裕子さん:

左手にカウンターを持っていて、適当なタイミングで押したり、ゼロに戻したり、としている様子をイメージしてください。
そうすると、 + 1 するタイミングがより明確に見えてきます。

あとは、そうして予想を立てつつ、何度もマクロを書いては実行してみて、実行結果を確認します。

シンプルですが、これがいちばん強力な学習方法です。


9348 : ガラパゴスタディー吉川の回答 (2018-01-16 16:23:36)

どのタイミングで変数+1とするか、少し苦戦しました。
演習問題は、ある程度ゴールがわかっている状態からのスタートですが、たどり着くのにまだ試行錯誤が必要なレベルです。
実務でここまですぐにマクロが書けるようになるまでは、まだまだ訓練が必要だと思うので、引き続き学習していこうと思います。


9011 : 小川慶一の回答 (2017-10-07 14:21:02)

受講生 さん:

「上下の値を比較して処理→次の行に移動して同様の処理をする」
というのは、基本パターンです☆

> ・上の行と下の行の値を比べることで番号を割り振ることができる。


9005 : 受講生さんのコメント (2017-10-06 19:01:04)

・上の行と下の行の値を比べることで番号を割り振ることができる。


8993 : 小川慶一の回答 (2017-10-04 18:29:18)

受講生 さん:

報告ありがとうございます☆
できるところから、ガンガン活用してください! (^^

> いま仕事でこの機能をつかってデータ加工してます 全部はマクロ化するのは先になりますが部分的でも仕事の効率が違います ありがとうございました


8987 : 受講生さんのコメント (2017-10-03 12:39:09)

いま仕事でこの機能をつかってデータ加工してます 全部はマクロ化するのは先になりますが部分的でも仕事の効率が違います ありがとうございました


8979 : 小川慶一の回答 (2017-10-01 20:15:47)

横山 知明さん:

基本パターンです。
似た事例が今後も多く登場します。

こういうのはノーヒントで自分で思いつけばすばらしいですが、そういうことができる人も、(よほどの天才でない限りは)以前にどこかで似たような課題で思考訓練をしたことがあるにすぎません。

> 発想がすごいです。マスターするのが必死で、質問できるところまでのレベルに
> 行っていないような気がします。それでも、仕事で使うときに、何も見ないで書けるものも出てきているので、とても嬉しいです。


8977 : 横山 知明さんのコメント (2017-10-01 17:46:00)

発想がすごいです。マスターするのが必死で、質問できるところまでのレベルに
行っていないような気がします。それでも、仕事で使うときに、何も見ないで書けるものも出てきているので、とても嬉しいです。


8692 : 小川慶一の回答 (2017-08-12 22:01:41)

受講生 さん:

悪くないと思います。

> ForNext構文ですぐに変数(番号)を記入し、変数を可変しながら番号をふるマクロを考えてみました。動画のようにテストを実施しながら作成しました。
> 動画の見本と異なるのは、1つ下の行と比べて同じか違うかによってわりふる数字を変える点です。


8689 : 受講生さんのコメント (2017-08-12 19:35:42)

ForNext構文ですぐに変数(番号)を記入し、変数を可変しながら番号をふるマクロを考えてみました。動画のようにテストを実施しながら作成しました。
動画の見本と異なるのは、1つ下の行と比べて同じか違うかによってわりふる数字を変える点です。

'問題[1]
Sub warifuribangou()
    Dim id
    Dim gyo
    id = 1
    For gyo = 4 To 19
        Range("B" & gyo).Value = id
        If Range("C" & gyo).Value <> Range("C" & gyo + 1).Value Then
            id = id + 1
        End If
    Next gyo
End Sub

'問題[2]
Sub nantoka()
    Dim id
    Dim gt
    Dim gyo
    id = 1
    gt = 1
    For gyo = 4 To 19
        Range("B" & gyo).Value = id
        Range("C" & gyo).Value = gt
        gt = gt + 1
        If Range("D" & gyo).Value <> Range("D" & gyo + 1).Value Then
            id = id + 1
            gt = 1
        End If
    Next gyo
End Sub


7431 : 小川慶一の回答 (2016-12-16 14:38:27)

受講生 さん:

>変数はfor next 構文の外で設定していれば、構文の下のコードには反映されないと勝手に思っていたのですが、
>nextの下にコードを書いても、変数リセットの指示を小人ちゃんに出さなければ元に戻らないんですね!

いろいろ確認しながら作業すると、よい学びになりますね。
このあたりの挙動は言語によって微妙に異なります。

以下のプログラム、一箇所だけコメントしておきます。ご確認ください。

Sub rensyu2()    
    Dim ban
    Dim gyo
    Dim cno
    ban = 0
    cno = 1
    For gyo = 4 To 19
        If Range("D" & gyo).Value <> Range("D" & gyo - 1).Value Then
            ban = ban + 1
            cno = 1
        Else
        cno = cno + 1'←インデントいれましょう。
        End If
        Range("B" & gyo).Value = ban
        Range("C" & gyo).Value = cno
    Next
        
End Sub


7430 : 受講生さんのコメント (2016-12-16 13:08:20)

if、elseを使って問題を解いてみました。
変数はfor next 構文の外で設定していれば、構文の下のコードには反映されないと勝手に思っていたのですが、
nextの下にコードを書いても、変数リセットの指示を小人ちゃんに出さなければ元に戻らないんですね!

Sub rensyu2()    
    Dim ban
    Dim gyo
    Dim cno
    ban = 0
    cno = 1
    For gyo = 4 To 19
        If Range("D" & gyo).Value <> Range("D" & gyo - 1).Value Then
            ban = ban + 1
            cno = 1
        Else
        cno = cno + 1
        End If
        Range("B" & gyo).Value = ban
        Range("C" & gyo).Value = cno
    Next
        
End Sub


6628 : 小川慶一の回答 (2016-05-12 14:24:09)

受講生 さん:

質問については、ふさわしいページで改めてお願いします。

>小川先生、
>
>はい、次の章に対する質問でした。時間がたってから質問を送ったので間違ったところに貼ってしまいました。すみませんでした。
>
>
>
>
>
>小川慶一 さん:
>
>>受講生 さん:
>>
>>ところで、この質問。
>>この動画ではなく、以下のページのものに対する質問ではないでしょうか?
>>https://online.pc5bai.com/movie/index/27/157
>>
>


6624 : 受講生さんのコメント (2016-05-11 11:25:35)

小川先生、

はい、次の章に対する質問でした。時間がたってから質問を送ったので間違ったところに貼ってしまいました。すみませんでした。





小川慶一 さん:

>受講生 さん:
>
>ところで、この質問。
>この動画ではなく、以下のページのものに対する質問ではないでしょうか?
>https://online.pc5bai.com/movie/index/27/157
>


6583 : 小川慶一の回答 (2016-05-04 10:40:01)

受講生 さん:

ところで、この質問。
この動画ではなく、以下のページのものに対する質問ではないでしょうか?
https://online.pc5bai.com/movie/index/27/157


6573 : 受講生さんのコメント (2016-05-02 21:29:37)

小川先生、
返信遅くなりすみません。こんな質問でも真摯に受け止めていただけてうれしいです。
送ってくれた参考例をよく考えてみました。
最初のsub mojikeiretu()
の場合は 最初の一行目を空白にするために、moji=""とわざわざ書かねばならないけれども、Sub honnbann1とhonnbann2は、ループなので何度も繰り返す形態を
moji=moji & Range("D" & gyo). valueのように書いて、しかも最初の一行目を処理するときには、moji=moji & ,,,,の後半の文字を、ゼロと解釈して処理しているわけですね。(moji=0)と最初に定義しなくても。

すみませんが この程度しか理解できません。訂正や 気づくべき点に修正があれば 是非ご指摘ください 宜しくお願いいたします。

最初の質問では ” gyosha=の次にgyosha & 、、、、 と続くのかわからいのです”と書きましたが、 gyosha=gyosha &、、、というのは、For ~next1の構文、ループ処理の文の定番の形と考えてもいいのでしょうか?

あともう一つ
先生の回答に
>> gyoshaの変数の定義が上方に書いてあるわけでないし
>
>いえ、変数の定義していますよ。
> Dim furi の一行前。

とありましたが、
Sub nanntoka furi()
Dim gyousha
Dim furi
Dim gyo
For gyo=2 to 11
と書いてありますから、 Dim gyoushaのことですね。これを変数の定義というのですか? 私はこれはただ変数の宣言をしているだけと受け止めてしまい、実は最初のほうに、gyousha="" とでも書いてあったら、これが定義とかよべるものであって、処理の式の展開を理解するのに役立つものと考えていました。 すみませんややこしくて。こんなレベルでも 仕事では少しづつ学んだことが役立っています。アドバイス宜しくお願いいたします。

小川慶一 さん:

>受講生 さん:
>
>良いですよ。こういう質問大歓迎です。
>
>まずは、以下のコードを順番に実行して、その中身をいろいろ読みつつ考えてみてください。
>
>

Sub mojiketsugo()
>    Dim moji
>    moji = ""
>    Range("A1").Value = moji
>    
>    moji = moji & "東京都"
>    Range("A2").Value = moji
>    
>    moji = moji & ","
>    Range("A3").Value = moji
>    
>    moji = moji & "神奈川県"
>    Range("A4").Value = moji
>    
>    moji = moji & ","
>    Range("A5").Value = moji
>    
>    moji = moji & "千葉県"
>    Range("A6").Value = moji
>    
>    moji = moji & ","
>    Range("A7").Value = moji
>End Sub
>
>Sub jyunbi()
>    Range("D1").Value = "大阪府"
>    Range("D2").Value = "京都府"
>    Range("D3").Value = "奈良県"
>End Sub
>
>Sub honban1()
>    Dim moji
>    Dim gyo
>    For gyo = 1 To 3
>        moji = moji & Range("D" & gyo).Value
>        moji = moji & ","
>        Range("G" & gyo).Value = moji
>    Next
>End Sub
>
>Sub honban2()
>    Dim moji
>    Dim gyo
>    For gyo = 1 To 3
>        moji = moji & Range("D" & gyo).Value & ","
>        Range("J" & gyo).Value = moji
>    Next
>End Sub
>

>
>あと、一点だけ。
>
>> gyoshaの変数の定義が上方に書いてあるわけでないし
>
>いえ、変数の定義していますよ。
> Dim furi の一行前。
>


6452 : 小川慶一の回答 (2016-04-18 11:16:53)

受講生 さん:

良いですよ。こういう質問大歓迎です。

まずは、以下のコードを順番に実行して、その中身をいろいろ読みつつ考えてみてください。

Sub mojiketsugo()
    Dim moji
    moji = ""
    Range("A1").Value = moji
    
    moji = moji & "東京都"
    Range("A2").Value = moji
    
    moji = moji & ","
    Range("A3").Value = moji
    
    moji = moji & "神奈川県"
    Range("A4").Value = moji
    
    moji = moji & ","
    Range("A5").Value = moji
    
    moji = moji & "千葉県"
    Range("A6").Value = moji
    
    moji = moji & ","
    Range("A7").Value = moji
End Sub

Sub jyunbi()
    Range("D1").Value = "大阪府"
    Range("D2").Value = "京都府"
    Range("D3").Value = "奈良県"
End Sub

Sub honban1()
    Dim moji
    Dim gyo
    For gyo = 1 To 3
        moji = moji & Range("D" & gyo).Value
        moji = moji & ","
        Range("G" & gyo).Value = moji
    Next
End Sub

Sub honban2()
    Dim moji
    Dim gyo
    For gyo = 1 To 3
        moji = moji & Range("D" & gyo).Value & ","
        Range("J" & gyo).Value = moji
    Next
End Sub


あと、一点だけ。

> gyoshaの変数の定義が上方に書いてあるわけでないし

いえ、変数の定義していますよ。
Dim furi の一行前。


6435 : 受講生さんのコメント (2016-04-15 23:33:38)

基礎編フォローアップの16課まで何とかついてきましたが、このあたりで頭がフリーズしてしまいました。ほかの受講生さんの投稿を読むとあまりに高度なレベルなので 恥ずかしいです。初歩的な質問があるので 教えてください。

Sub nanntoka furi()
       Dim gyousha
       Dim furi
       Dim gyo
       For gyo=2 to 11
             gyosha=gyosha & "," & Range("A" & gyo). Value
             ,,,,,,,,
             ,,,,,,,,,,
End Sub
 

のなかで、 なぜ  gyosha=の次にgyosha & 、、、、 と続くのかわからいのです。gyoshaの変数の定義が上方に書いてあるわけでないし、=の右側に書かれたgyoshaをどう解釈したらよいのでしょうか? 幼稚な質問ですみません。教えてください。


6345 : 沖津さんのコメント (2016-04-09 00:44:23)

小川先生
すみません・・個人用のメモに入れるつもりがこちらに投稿してしまいました。
失礼しましたm(__)


6344 : 沖津さんのコメント (2016-04-09 00:33:44)

2016/4/8 2回目完了!2回目を自力でやったが、解答とは違うやり方でも動いた。(else にgt=gt+1を入れる方法)


6153 : 小川慶一の回答 (2016-03-27 20:14:19)

受講生 さん:

特にコメントないです。解ければすばらしいです。


6152 : 小川慶一の回答 (2016-03-27 20:13:03)

受講生 さん:

この問題も、要は、「変数の初期化を自分でするタイミングはいつか?」というところがキモです。


6145 : 受講生さんのコメント (2016-03-27 04:48:39)

やり方が分かれば[1]が解けましたので、
それを動画で確認してから[2]も考えてみました。
なんと動画を見ないで解けました(≧▽≦)
B列とC列で数字の動きは違うけれども、
判別条件はまったく同じなので、まとめてできないかなと。
変数+1を入れる位置がちょっと自信ありませんが
[/code]
Sub rensyu032701()
Dim gyo
Dim BF
Dim CF
BF = 0
CF = 0

For gyo = 4 To 19
If Range("D" & gyo).Value <> Range("d" & gyo - 1).Value Then
BF = BF + 1
CF = 1
Else
CF = CF + 1
End If
Range("B" & gyo).Value = BF
Range("C" & gyo).Value = CF
Next
End Sub
[/code]
by goosk


6144 : 受講生さんのコメント (2016-03-27 03:29:31)

先輩ユーザ様のコメントにもありますように、私も最初は
「資料Aなら1、資料Bなら2、そうでないなら3」
という分岐処理で回した解答を作りました。
資料の名前に規則性がないとか、順番がバラバラだった場合なら
それでよかったかもしれませんね。
しかしデータのボリュームや資料の種類が多かったら、やはり
規則性に注目して書かないと大変なことになります。

ワークシート関数で、リストから重複データを探すために
前後の行を比較する方法を使っている表を見たことがあって、
今回それを思い出しました。
VBAで同じことができるわけですね。なるほど。φ(..)メモメモ

考え方は大体わかったので、模範解答は伏せて
自分でも同じように書けるかどうか試してみます。
by goosk


4799 : 小川慶一の回答 (2015-08-05 05:39:33)

鈴木優子 さん:

基礎編フォローアップはパターンを学ぶ場です。鵜呑みにしてマネしてください。
それがいちばん「感性」を磨く近道です。

ひきつづきお愉しみを☆


>自力出といた時は みなさまと同じで 資料A の時は Bの時は・・・とif 文で分岐したり、
>問題2のほうは いっぱい 変数使ったりしていました。
>解答のマクロを見て 思わず「きれい!」と言いました。
>こんなにシンプルに物事をさっと理解できるようになりたいなぁ。
>感性を磨いていきたいと思いました。頑張ります!


4795 : 鈴木優子さんのコメント (2015-08-04 20:46:19)

自力出といた時は みなさまと同じで 資料A の時は Bの時は・・・とif 文で分岐したり、
問題2のほうは いっぱい 変数使ったりしていました。
解答のマクロを見て 思わず「きれい!」と言いました。
こんなにシンプルに物事をさっと理解できるようになりたいなぁ。
感性を磨いていきたいと思いました。頑張ります!


3825 : 小川慶一の回答 (2015-02-13 06:34:53)

匿名 さん:

>「If○○ = ×× Then」だけでなく、「<>(等しくなかったら)」という使い方もできるのだなと、解説を観て思いました。
>「等しければ」の反対は「等しくなければ」だから、「=」の条件でIF文を作るのが難しい、あるいはややこしくなるようなら、
>「<>」の条件を考えて、作ってみるという方法があるのだなと思いました。

発展編1に進むと、同様の趣旨で Not 演算子というものも登場します。
これもよく使います。状況によっては、 <> は使えず、 Not 演算子を使うよりない、というケースもでてきます。


3810 : 受講生さんのコメント (2015-02-11 23:31:56)

最初に、自分で考えたものが以下の通りです。

Sub bangou()
Dim gyo
Dim Asiryo
Dim Bsiryo
Dim Csiryo
    
    Asiryo = 0
    Bsiryo = 0
    Csiryo = 0
    
    For gyo = 4 To 19
        If Range("D" & gyo).Value = "資料A" Then
            Range("B" & gyo).Value = 1
            Asiryo = Asiryo + 1
            Range("C" & gyo).Value = Asiryo
        ElseIf Range("D" & gyo).Value = "資料B" Then
            Range("B" & gyo).Value = 2
            Bsiryo = Bsiryo + 1
            Range("C" & gyo).Value = Bsiryo
        Else
            Range("D" & gyo).Value = "資料C" Then
            Range("B" & gyo).Value = 3
            Csiryo = Csiryo + 1
            Range("C" & gyo).Value = Csiryo
        End If

    Next
            
End Sub


IF文の条件を「<>」にすることは、思い付きませんでした。
 If Range("D" & gyo - 1).Value <> Range("D" & gyo).Value Then

「If○○ = ×× Then」だけでなく、「<>(等しくなかったら)」という使い方もできるのだなと、解説を観て思いました。
「等しければ」の反対は「等しくなければ」だから、「=」の条件でIF文を作るのが難しい、あるいはややこしくなるようなら、
「<>」の条件を考えて、作ってみるという方法があるのだなと思いました。


1910 : 小川慶一の回答 (2014-08-11 16:12:57)

明石 照伸 さん:

実は、マクロ書くときの基本パターンはかなり共通してたりします。

この課題は、インクリメントする部分は、何度もやってきた、条件に一致する行があったら、その中身を別の表に転記するというパターンと同じですね。

後半は、基礎編フォロー動画18回等でやっているパターンと同じです。


1884 : 明石 照伸さんのコメント (2014-08-09 15:46:43)

お世話になります。

以下のようにコードを考えたて、一応
回答できたつもりですが、

動画解説の観点が全然違っていたので
驚きました。

上下の行で値が変化したことをトリガーに
処理を行うやり方というのは、以前の問題でも
私自身使っていますが、

今回のようにシンプルに変わったらインクリメントする、
のように、利用できるとは考えていませんでした。(^^;

考えてみれば元々の表にそういう作成者の
ロジックというか意図があってそのように
レコードが並べられているのですから、
それを素直に読み取っているとも言えますね。

毎回勉強になります。(^^


=====

Sub furiwake()
Dim gyo

For gyo = 4 To 19

’ <A B Cの判定>
If Mid(Range("d" & gyo).Value, 3) = "A" Then
Range("b" & gyo).Value = 1

ElseIf Mid(Range("d" & gyo).Value, 3) = "B" Then
Range("b" & gyo).Value = 2

ElseIf Mid(Range("d" & gyo).Value, 3) = "C" Then
Range("b" & gyo).Value = 3

End If

’<F列の値からもってくる >
Range("c" & gyo).Value = Mid(Range("f" & gyo).Value, 2, 1)
Next


End Sub

====


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

小俣さん:

> 今回は、行数のカウンター変数とその変数-1でセルの上下を比較して分岐するのが肝だったんですね。

そうそう。一般法則は何か?と考えて、それをプログラム的に表現する。

読みやすさは、そのプログラムを読む人のレベルによります。


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

今回は、行数のカウンター変数とその変数-1でセルの上下を比較して分岐するのが肝だったんですね。

資料名自体を比較して条件分岐させるプロシージャを最初に書いてしまったのですが、資料名でソートされている前提に立てば、動画解説のようにセルの上下を比較するような記述をすれば資料名がわからなくても、何個もあっても動くわけですね。

読みやすさを度外視すれば、なるべく定数を書かずに変数を減らすと、ものすごくシンプルで汎用性の高いコードになりますね。
そして、そういう風に書こうとするとまるでパズルを解いているような気分になります。


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

山本さん:

よいと思います。僕もこういうの好きです。実践でもこんな手法をよく使います。


519 : 山本博己さんのコメント (2013-08-20 00:01:00)

すいません、上記質問↑は問2ですね。よろしくお願いします。


518 : 山本博己さんのコメント (2013-08-20 00:00:00)

こんにちは☆
僕はこちらの方が思いつきで書きやすかったのですが、もし問題ありましたら、アドバイスをお願いします!!よろしくお願い致します。

Sub test6()
Dim number
Dim gyo
number = 1
For gyo = 4 To 19

If Range("d" & gyo - 1).Value = Range("d" & gyo).Value Then
number = number + 1
Else
number = 1


End If
Range("c" & gyo) = number
Next

End Su


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

池本さん:

> 一個上の行と比べながら同じか違うかで数字がかわる仕掛けにするというのが今日の学び。

あー、そうです。まさに、今回のはそれがポイント。

そして、

> これをやっていて得られるものは単なるマクロのかき方だけじゃないってところが偉大。
> マクロ勉強してみようと思ってよかった~☆

そうそう。それもポイントです~☆


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

こんにちは~☆

とってもおもしろい問題でした!!

動画を見る前の自力の段階では、いちいち資料Aなら1、Bなら2とかやりながら、資料がAtoZなど数が多かったら大変なマクロだな~、もっといい方法あるはずだな~と思いながらかいてました。

一個上の行と比べながら同じか違うかで数字がかわる仕掛けにするというのが今日の学び。

動画の説明は、最初はなんのこっちゃと思いましたが、繰り返し動画をみて、一時停止しながらわかったことをマクロでかいて動画をおっかけたら話がすとんと腑に落ちました。
わかっちゃったらなんてことないですね~(*^^*)♪

あと、今日はじめてみた<>。
=の反対で
右辺と左辺を比べて違うときtrue、同じならfalse
教科書54ページでも確認して覚えました。

+1パターンはおなじみになってきました。
スタート、戻り値さえきめてしまえば
問題1は対照の値と同じならずっと同じ、値がかわったら+1,
問題2は問題1の構造に加えて、対照の値がかわるときのスタートかつ戻り値1で、対照の値がかわって1にもどるまでは、ずっと+1を繰り返すだけのこと。便利ですね。

マクロおもしろい!! 
きっと私の脳みそはいっぱい刺激をうけて元気いっぱいなはず!!
 
これをやっていて得られるものは単なるマクロのかき方だけじゃないってところが偉大。

マクロ勉強してみようと思ってよかった~☆

day17も楽しみで~す(*^^*)♪


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

豊島さん:

資料の数がたくさんあっても、マクロ実行前にそれらの名称が分からなくても解決できるようになる、というのが今回の問題の趣旨でした (^


514 : 豊島 久博さんのコメント (2013-03-05 00:00:00)

今回も何とか動くマクロが書けましたが、解説のように、前の行と比べると言う発想は浮かばなかったです。

Sub bango()
    Dim shiryo
    Dim gyo
    Dim migi1
    Dim migi2
    Dim migi3
     
    For gyo = 4 To 19
        shiryo = Range("d" & gyo).Value
         
        If shiryo = "資料A" Then
            migi1 = migi1 + 1
            Range("b" & gyo).Value = 1
            Range("c" & gyo).Value = migi1
        ElseIf shiryo = "資料B" Then
            migi2 = migi2 + 1
            Range("b" & gyo).Value = 2
            Range("c" & gyo).Value = migi2
        ElseIf shiryo = "資料C" Then
            migi3 = migi3 + 1
            Range("b" & gyo).Value = 3
            Range("c" & gyo).Value = migi3
        End If
    Next
End Sub

と書きました。


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

山根さん:

もっと抽象的な課題でした(汗


512 : 山根信行さんのコメント (2013-02-04 00:00:00)

ひとつ上のセルと比較でしたか。
資料A資料Bの末尾のアルファベットで処理を分岐してしまいました。
他にも書かれていますがデータが増えた時は?と少し疑問に思いながらも結果が例と同じだからまあいいかと済ませてしまいました。
結果を得る為にデータをどう評価して手順書を書くかまだまだ修行が必要だと感じました。

動画を見た後で実際書いてみて納得いたしました。
[CODE]Sub Q1()
Dim cnt As Long
Dim x As Long
Dim y As Long
Dim z As Long
x = 1
y = 1
z = 1
For cnt = 4 To 19
Select Case Right(Range("D" & cnt).Value, 1)
Case Is = "A"
Range("B" & cnt).Value = 1
Range("C" & cnt).Value = x
x = x + 1
Case Is = "B"
Range("B" & cnt).Value = 2
Range("C" & cnt).Value = y
y = y + 1
Case Is = "C"
Range("B" & cnt).Value = 3
Range("C" & cnt).Value = z
z = z + 1
End Select
Next
End Sub
[/CODE


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

山口さん、

> セルの状況をどう読み取って簡単な式にするかがコツなんですね。

ですね。いかに、身も蓋もない書き方をするか。

一般的に、個々の機能についての記述が済めば、メンテナンス性も高くなる可能性大です。


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

追記です。

ひとつ、べた褒めするのを忘れてました。

ともあれ、どういうアプローチででも自力でこの問題を解けたなら相当の腕力です。
かなり自信持っていただいてOKですよ v(^^*

そのレベルに到達した人向けでなければ、「伝票作成マクロ」の作成の流れすら説明できないです。
(しても萎縮されてしまうだけなので) ヾ(´ー`)ノ


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

佐藤さん:

> 一つ上と違ったら、と考えるのですね。

発展編で出てくる「伝票作成マクロ」と同じです。

「伝票作成マクロ」の場合は、一つ上と違ったら

○シートを追加して、
○シート名をつけて
○転記先シートの何行目にデータを投入するかを指定するための変数を初期化する

という流れ。[*1]
(と聞かされても、これだけ練習したあとだったら、なんとなく見当つくでしょ?)


そして、

> 自分がif Then構文の構造をちゃんと理解していないことに気が付きました。

↑こういう基礎的なところのマスターが重要なわけです。

If Then構文やFor Next構文が意識しないでも書けるレベルでないと、
「[*1]のような仕組みだ!」と分かっていても、それ以前の問題で
ひっかかってしまう。

基礎編は、いろいろなケースでこれらの構文を体験する中で、
「知識」レベルでとどまっていた構文作成能力を、
「無意識」レベルに落とし込むプロセスでもあります。

でも、ここをしっかりやっておくと、あとあと相当力になりますよ。


> 私が間違えると、小人ちゃんはちゃんと間違えたとおりに実行してくれるのですね。

「ちゃんと」間違えたとおりにという表現の仕方が秀逸ですね (^^

だからこそ、基礎編の演習中にお話しした以下が大切なわけです。

[1] まずは、書きながら考える
[2] まずは、実行してから考える
[3] 可能な限りコピペですませる

[1], [2]とりあえず書いて実行してみると、自分が正しく書けたのかどうかがすぐに分かります。

[3] は、より安心・安定して正しく書けるための保険。


508 : 佐藤 尚子さんのコメント (2012-12-01 00:00:00)

最初にRight関数とMid関数を使って書いて、ちゃんと動いたのですが、これだと資料の種類が増えたときに対応できないな~と思ったら、ちゃんと動画ではそのやり方が紹介されていました。一つ上と違ったら、と考えるのですね。
ではそのあとやってみようと自分で書いてみると、資料名の変わり目のセルだけに番号が入ったり、変わり目だけ番号が入らなかったりする・・・。動画と確認してみて、自分がif Then構文の構造をちゃんと理解していないことに気が付きました。私が間違えると、小人ちゃんはちゃんと間違えたとおりに実行してくれるのですね。
何度も書いて身につけます!


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

加藤さん、

> 小恥ずかしながら<>を初めて知りました。

最初は、そんなモンです。

この動画シリーズで出てくるパターンをマスターするだけでも、相当のことができるようになります。

ひきつづき、楽しんで勉強してください! (^


506 : 加藤美智子さんのコメント (2012-11-05 00:00:00)

色々とやってみましたが、うまく動いてくれませんでした…。(*_*;

動画を見て、簡潔さに驚きました。(小恥ずかしながら<>を初めて知りました。)


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

問題1だけなら下記のマクロでなんとかなったのですが、
問題2を追加したらおかしなことになってしまいました(*_*;

"="ではなく"<>"、+1ではなく、-1にするといいんですね。


Sub mondai1()
Dim gyo
Dim bangou
bangou = 1
Range("B4").Value = 1
For gyo = 4 To 19 - 1
If Range("C" & gyo).Value = Range("C" & gyo + 1).Value Then
Range("B" & gyo + 1).Value = bangou
Else
Range("B" & gyo + 1).Value = bangou + 1
bangou = bangou + 1
End If
Next
End Su


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

恥ずかしながら<>を知りませんでした。
確かに綺麗なマクロになりますね。

<>使用前
Sub mondai1()
Dim cnt
For cnt = 4 To 19
If Range("C" & cnt).Value = Range("C4").Value Then
Range("B" & cnt).Value = "1"
ElseIf Range("C" & cnt).Value = Range("C12").Value Then
Range("B" & cnt).Value = "2"
ElseIf Range("C" & cnt).Value = Range("C17").Value Then
Range("B" & cnt).Value = "3"
End If
Next

End Sub

<>使用後

Sub mondai1()
Dim id
Dim cnt
id = 0
For cnt = 4 To 19
If Range("C" & cnt - 1).Value <> Range("C" & cnt).Value Then
id = id + 1
End If
Range("B" & cnt).Value = id
Next
End Sub

Sub mondai2()
Dim id
Dim id2
Dim cnt
id = 0
id2 = 1
For cnt = 4 To 19
If Range("D" & cnt - 1).Value <> Range("D" & cnt).Value Then
id = id + 1
id2 = 1
End If
Range("B" & cnt).Value = id
Range("C" & cnt).Value = id2
id2 = id2 + 1
Next

End Su


1215 : 小川慶一の回答 (2012-09-13 08:17:00)

達人養成塾 小川です。

一昨日~昨日とちょっとバタバタしてまして、お返事遅れました。


> 僕は、アルゴリズムがあるという意図に気付かなかったので[1][2]とも強引にやりました。

強引でもよいですよ。技でも力でも相手を倒せるようになってください。

あと、強引にやるなら、 select case 使ってみたいところでもあります。
発展編テキストを参照して、やってみてください!!


1214 : 受講生さんのコメント (2012-09-11 15:59:00)

前と同じか比較する、dim gtの使い方

このようなアルゴリズムで処理すると非常に簡素ですね。



dim gtは次のカウントの為に初期化していると捉えました。



流れを追うと、先生の仰る通り全然難しくないですね。

スッキリしています。



僕は、アルゴリズムがあるという意図に気付かなかったので[1][2]とも強引にやりました。



Sub test()

Dim gyo

For gyo = 4 To 19

If Range("C" & gyo).Value = "資料A" Then

Range("B" & gyo).Value = "1"

ElseIf Range("C" & gyo).Value = "資料B" Then

Range("B" & gyo).Value = "2"

Else

Range("B" & gyo).Value = "3"

End If

Next

End Sub





Sub test2()

Dim gyo

For gyo = 4 To 19

If Range("D" & gyo).Value = "資料A" Then

Range("B" & gyo).Value = "1"

Range("C" & gyo).Value = gyo - 3

ElseIf Range("D" & gyo).Value = "資料B" Then

Range("B" & gyo).Value = "2"

Range("C" & gyo).Value = gyo - 11

Else

Range("B" & gyo).Value = "3"

Range("C" & gyo).Value = gyo - 16

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

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ