VLookUp関数、Index関数、Match関数より便利なマクロ-該当する行が見つからない場合の処理をアレンジ

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

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

解説

演習問題テーマ:VLookUp関数、Index関数、Match関数より便利なマクロ-該当する行が見つからない場合の処理をアレンジ

複数の表の間でのマッチングのアレンジです。データ転記先の表に該当する行が見つからない場合は、転記先表の後半にデータを追記します。

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

12475 : 小川慶一の回答 (2020-09-29 05:37:51)

受講生 さん:

> いつもお世話になっています。
> 質問致します。
> false、trueは、変数では無いのですね?

はい、True, False は、変数ではありません。では何かというと、値です。
文字列: "こんにちは"
日付: #2020/09/29 05:28#
数値: 0, 1, 2, 3, ...
True/False: True, False

True/False は、「二択のどちらか」ということを表現するときに使う値です。
また、条件文の判定結果は、 True/False のいずれかになります。
以下、コメントを付記してみました。

Sub JyokenHanteiSample()
    If Range("B2").Value > 100 Then 'Range("B2").Value > 100 を満たせばTrue。
        '以下、条件文の判定結果がTrueだったときの処理
        Range("C2").Value = "★★★"
        Range("D2").Value = "条件をクリアしています"
        Range("E2").Value = "おめでとうございます!あなたは次のステップに進めます!"
    Else
        '以下、条件文の判定結果がFalseだったときの処理
        Range("C2").Value = "☆☆☆"
        Range("D2").Value = "条件を満たせませんでした"
        Range("E2").Value = "うーん、まだまだ。復習しっかりしましょう!"
    End If
End Sub


If文は、基礎編本編第3章で登場します。
第3章を復習されると良いかと思います。

あと、基礎編フォローアップも、ベーシックから、上記のことを意識しつつ解きなおしてみてください。
理解が深まって、結果としてより上達早くなるかと思います。


12471 : 受講生さんのコメント (2020-09-28 14:28:47)

いつもお世話になっています。
質問致します。
false、trueは、変数では無いのですね?
(確かに、Dimで宣言もしてません。)
他の文字に変えたらうまく行きませんでした。

なにか特別な意味を持つキーワードなのでしょうか?




12445 : 小川慶一の回答 (2020-09-22 12:50:16)

ゲストさん:

プログラミング技術の習得というのは、「分離可能なものをより分離していくもの」という側面があります。
その分抽象度もあがりますし注意すべきことも増えます。が、そこを乗り越えると書けるマクロの質、できることの幅もグッとあがります。

ひきつづき、楽しみに学んでください。


12443 : ゲストさんのコメント (2020-09-21 17:27:16)

ありがとうございます。
なるほど、条件判定とその後の処理の機能を分離させたい時に便利そうですね。
使い方一つで、ひとつの「変数」にこのような機能がもたせられるのは、奥深いですね。

小川慶一さん:

> ゲストさん:
>
> 条件判定をする機能と処理を実行する機能とを分離させたいときにフラグを使います。
> 条件判定直後に処理を実行させようとすると複雑なコードになってしまう、あるいは、If文内の処理のボリュームが大きすぎになってしまう、といったときに有効な手法です。
>
> 以下に、フラグの件だけを抽出したシンプルなマクロを用意してみました。
> ゲストさんなら、上の補足説明と以下のサンプルコードだけで意図が伝わるのではないかとも思いますが、どうでしょうか。
>
>

Sub check_if_over_50_is_more_than_5()
>     '50点を超える値が5件以上あるかどうかを調べ、該当する場合は「合格」とする
>     Dim i
>     Dim kensu
>     For i = 2 To 11
>         If Range("B" & i).Value > 50 Then
>             kensu = kensu + 1
>             If kensu > 5 Then
>                 Range("D2").Value = "合格" '即座に処理
>                 Exit For 'Exit For は、即座にくりかえし作業を終了する。発展編1参照。
>             End If
>         End If
>     Next
> End Sub
> 
> Sub check_if_over_50_is_more_than_5_flag()
>     '50点を超える値が5件以上あるかどうかを調べ、該当する場合は「合格」とする
>     'フラグを使った場合
>     Dim i
>     Dim kensu
>     Dim flag
>     flag = False '[1]
>     For i = 2 To 11
>         If Range("B" & i).Value > 50 Then
>             kensu = kensu + 1
>             If kensu > 5 Then
>                 flag = True 'フラグをつけるだけ
>                 Exit For
>             End If
>         End If
>     Next
>     
>     '以下で、フラグを元に処理を行うか判定
>     If flag = True Then '[2]
>         Range("D2").Value = "合格"
>     End If
> End Sub
> 
> '[1] これはなくてもOKですが(詳しくは発展編1の第1章「変数の初期値」を参照)
> '[2] If flag Then でも OK(詳しくは発展編2第1章「式と戻り値」を参照)

>


12440 : 小川慶一の回答 (2020-09-21 08:48:22)

ゲストさん:

条件判定をする機能と処理を実行する機能とを分離させたいときにフラグを使います。
条件判定直後に処理を実行させようとすると複雑なコードになってしまう、あるいは、If文内の処理のボリュームが大きすぎになってしまう、といったときに有効な手法です。

以下に、フラグの件だけを抽出したシンプルなマクロを用意してみました。
ゲストさんなら、上の補足説明と以下のサンプルコードだけで意図が伝わるのではないかとも思いますが、どうでしょうか。

Sub check_if_over_50_is_more_than_5()
    '50点を超える値が5件以上あるかどうかを調べ、該当する場合は「合格」とする
    Dim i
    Dim kensu
    For i = 2 To 11
        If Range("B" & i).Value > 50 Then
            kensu = kensu + 1
            If kensu > 5 Then
                Range("D2").Value = "合格" '即座に処理
                Exit For 'Exit For は、即座にくりかえし作業を終了する。発展編1参照。
            End If
        End If
    Next
End Sub

Sub check_if_over_50_is_more_than_5_flag()
    '50点を超える値が5件以上あるかどうかを調べ、該当する場合は「合格」とする
    'フラグを使った場合
    Dim i
    Dim kensu
    Dim flag
    flag = False '[1]
    For i = 2 To 11
        If Range("B" & i).Value > 50 Then
            kensu = kensu + 1
            If kensu > 5 Then
                flag = True 'フラグをつけるだけ
                Exit For
            End If
        End If
    Next
    
    '以下で、フラグを元に処理を行うか判定
    If flag = True Then '[2]
        Range("D2").Value = "合格"
    End If
End Sub

'[1] これはなくてもOKですが(詳しくは発展編1の第1章「変数の初期値」を参照)
'[2] If flag Then でも OK(詳しくは発展編2第1章「式と戻り値」を参照)


12436 : ゲストさんのコメント (2020-09-20 12:27:57)

お世話になっています。
今回の「フラグ」という概念は、
「if文で条件一致するグループと条件一致しないグループの二つのグループに分けている」ように感じたのですが、
その理解で良いでしょうか?


10455 : 小川慶一の回答 (2018-08-19 08:42:56)

morimotoさん:

ちょっと厳しいかな。

まずは、最低限、以下の制限時間を目指してください。

[1] 7分→12分
[2] 7分→11分
[3] 7分→10分
[4] 10分→15分
[5] 10分→14分
[6] 10分→13分
[7] 10分→12分


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

morimotoさん:

[4]で、以下は不要では?

Range("k" & migi).Value = ""


以下から、練習不足はご自身としても実感されていることと思います。
・[1]は60分、[3]は5時間かかって「ようやくできた」たということ
・「[2], [4], [5], [6], [7]はそれぞれ[1], [3]でできたマクロを編集加工して済ませた」ということ

この理解度では、構造全体について考察することは難しいです。
ついては、理解を深め、パターンを手になじませるため、同じ問題を何度もくり返し解くことをおすすめします。

具体的には、[1]-[7]のそれぞれについて、イチから書いて以下の時間内で収まるようになるまで練習してください。

[1] 7分
[2] 7分
[3] 7分
[4] 10分
[5] 10分
[6] 10分
[7] 10分

[1]-[7]すべて上記の時間内で解けるようになったころには、当初の疑問はもう解消していることと思います。
上記の制限時間で問題を解けるようになったら、そのうえで、以下の投稿についてご自身で回答を考え、その回答をこのページコメント欄に投稿ください。

あるいは、当初の疑問はもう解消しているかもしれません。
が、その場合でも、上記制限時間内でマクロを書ききる練習は行ってください。
実装能力次第で、理解度や腑に落ち方がまったく変わります。
「人の書いたマクロをちゃちゃっと編集しても期待通りに動かなかった。なぜだ?」というときに、イチから書き直して検証できる人とそうでない人とでは、理解度や腑に落ち方がまったく違いがあります。
僕としては、この機会にそこまで実感してもらいたいです。


> 小川塾長:改めて一度整理し考えて見まして、フラグのfalse, trueですが、4:45あたりから説明が始まりまして、左のIDと右のIDで一致しないものを見つけたときmitsuketaと定義し、そしてその一致がみつからないとき→true、反対に一致がみつかったとき→false ということでいいのかなと思いました。そうすると、左のIDと右のIDの一致について
> (1)では一致がみつかるときだから、false
> (2)では一致がみつからないすなわち不一致があるときだからtrue
> そして(3)では一致がみつからないときだから、trueとすべきだと思いました。(解説ではfalseでした)
> 実際小生の解釈で実行すると解答と異なりA30行以下一致しているIDの12,17,2,11,19,6,26,10,13が表示されました。 
> (3)にてfalseになるところが知りたいです。
> いろんなcodeでfalseやtrueが出てくるのでこの機会につかみたいです。
> よろしくお願いします。

Sub mondai201_01()
    Dim hida
    Dim migi
    Dim mitsuketa
    Dim tenkisaki

    tenkisaki = 30

    For migi = 11 To 21
        mitsuketa = False-----(1)
        For hida = 4 To 29
            If Range("A" & hida).Value = Range("E" & migi).Value Then
                Range("C" & hida).Value = Range("F" & migi).Value
                mitsuketa = True------(2)
                Exit For
            End If
        Next
        If mitsuketa = False Then-----(3) 不一致があるときだからtrue??
            Range("A" & tenkisaki).Value = Range("E" & migi).Value
            Range("C" & tenkisaki).Value = Range("F" & migi).Value
            tenkisaki = tenkisaki + 1
        End If
    Next
End Sub


10453 : morimotoさんのコメント (2018-08-19 06:26:15)

そして最後の特訓問題です。
[7]
シート「キャンペーン名簿1」で、右の表11行目から21行目までについて順番に調査する。
右の表の各行ごとに、E列のIDが左の表のA列に存在するかを調べ、存在しない場合は以下を行うマクロを作れ。
当該右の表のE列に記載されたIDをA列に追記する。
当該右の表のF列に記載された名前をB列に追記する。
Sub tokkun_7()
Dim hida
Dim migi
Dim atate
atate = 30
Dim bango
bango = 1
Dim mitsuketa

For migi = 11 To 21
mitsuketa = False
For hida = 4 To 29
If Range("a" & hida).Value = Range("e" & migi).Value Then
Range("a" & atate).Value = ""
mitsuketa = True
Exit For
End If
Next hida

If mitsuketa = False Then
Range("a" & atate).Value = Range("e" & migi).Value
Range("c" & atate).Value = Range("f" & migi).Value '←追記部分
atate = atate + 1
End If
Next migi
End Sub

2分。右の表のF列の内容をC30以下に追記する


10452 : morimotoさんのコメント (2018-08-19 06:23:57)

[6]
シート「キャンペーン名簿1」で、右の表11行目から21行目までについて順番に調査する。
右の表の各行ごとに、E列のIDが左の表のA列に存在するかを調べ、存在しない場合は以下を行うマクロを作れ。
当該右の表のE列に記載されたIDをA列に追記する。
Sub tokkun_6()
Dim hida
Dim migi
Dim atate '←追記部分
atate = 30 '←追記部分
Dim bango
bango = 1
Dim mitsuketa

For migi = 11 To 21
mitsuketa = False
For hida = 4 To 29
If Range("a" & hida).Value = Range("e" & migi).Value Then
Range("a" & atate).Value = ""
mitsuketa = True
Exit For
End If
Next hida

If mitsuketa = False Then
Range("a" & atate).Value = Range("e" & migi).Value '←追記部分
atate = atate + 1 '←追記部分
End If

Next migi
End Sub
3分 A列の30行目からatate=atate+1にて追加する


10451 : morimotoさんのコメント (2018-08-19 06:21:38)

[5]
シート「キャンペーン名簿1」で、右の表11行目から21行目までについて順番に調査する。
右の表の各行ごとに、E列のIDが左の表のA列に存在するかを調べ、存在しないもののリストをK列に作れ。
ただし、リストの内容は、K列にID、L列に氏名と記入するものする。
Sub tokkun_5()
Dim hida
Dim migi
Dim tate
tate = 11
Dim bango
bango = 1
Dim mitsuketa

For migi = 11 To 21
mitsuketa = False
For hida = 4 To 29
If Range("a" & hida).Value = Range("e" & migi).Value Then
Range("k" & migi).Value = ""
mitsuketa = True
Exit For
End If
Next hida

If mitsuketa = False Then
Range("k" & tate).Value = Range("e" & migi).Value
Range("l" & tate).Value = Range("f" & migi).Value '←追記部分
tate = tate + 1 '←追記部分
End If

Next migi
End Sub

2分。右の表のF列の分を追加するだけでよい。


10450 : morimotoさんのコメント (2018-08-19 06:19:24)

[4]
シート「キャンペーン名簿1」で、右の表11行目から21行目までについて順番に調査する。
右の表の各行ごとに、E列のIDが左の表のA列に存在するかを調べ、存在しないもののリストをK列に作れ。
ただし、リストの内容はIDだけでよい。
Sub tokkun_4()
Dim hida
Dim migi
Dim tate
tate = 11
Dim bango
bango = 1
Dim mitsuketa

For migi = 11 To 21
mitsuketa = False
For hida = 4 To 29
If Range("a" & hida).Value = Range("e" & migi).Value Then
Range("k" & migi).Value = ""
mitsuketa = True
Exit For
End If
Next hida

If mitsuketa = False Then
Range("k" & tate).Value = Range("e" & migi).Value '←追記部分
tate = tate + 1 '←追記部分
End If
Next migi
End Sub
'5分 [3]のcodeの加工だけ。始めたい行番号をtateで定義し 次に表示させたいものを tate=tate+1で次の行にずらすだけ


10449 : morimotoさんのコメント (2018-08-19 06:16:56)

'[3]
シート「キャンペーン名簿1」で、右の表11行目から21行目までについて順番に調査する。
右の表の各行ごとに、E列のIDが左の表のA列に存在するかを調べ、存在しない場合は1, 2, 3, ... とI列に上から順に番号を割り振るマクロを作れ。
存在する場合はI列には何も記入しない。
Sub tokkun_3()
Dim hida
Dim migi
Dim bango
bango = 1
Dim mitsuketa

For migi = 11 To 21
mitsuketa = False
For hida = 4 To 29
If Range("a" & hida).Value = Range("e" & migi).Value Then '-----(1)
Range("i" & migi).Value = ""
mitsuketa = True
Exit For
End If
'------(3)
Next hida

If mitsuketa = False Then '-------(2)
Range("i" & migi).Value = bango------(5)
'Range("i" & migi).Value = Range("e" & migi).Value '-------(4)
bango = bango + 1
End If
Next migi
5時間。[2]の逆パターンだとシンプルに考え(1)に等号を<>にしても予想もしない結果(実行するも何も表示されない)になる。よく考え、(3)以下の処理を考える。そして(3)に(2)から下4行end ifまでを入れて試みるが、I13には「53」I17には「108」と表示され,どうやらbangoのloopの回数が表示されるだけで解答には至らず。次に左のIDにない46, 33の値か出るか調べ(4)のコードを入れ実行すると46,33が表示される。そして(5)と
bango=bango+1にしてようやく出来上がる。


10448 : morimotoさんのコメント (2018-08-19 06:11:49)

[2]
'シート「キャンペーン名簿1」で、右の表11行目から21行目までについて順番に調査する。
右の表の各行ごとに、E列のIDが左の表のA列に存在するかを調べ、存在する場合は1, 2, 3, ... とH列に上から順に番号を割り振るマクロを作れ。
存在しない場合はH列には何も記入しない。
Sub tokkun_2()
Dim hida
Dim migi
Dim bango
bango = 1
Dim mitsuketa
For migi = 11 To 21
mitsuketa = False
For hida = 4 To 29
If Range("a" & hida).Value = Range("e" & migi).Value Then
Range("h" & migi).Value = bango ←追記
bango = bango + 1 ←追記
mitsuketa = True
Exit For
End If
Next hida
Next migi
End Sub

7分:tokkun_1をcopyして追記加工した


10447 : morimotoさんのコメント (2018-08-19 06:08:17)

小川塾長:特訓問題仕上がりました。[1]から順に送ります。
[1]
シート「キャンペーン名簿1」で、右の表11行目から21行目までについて順番に調査する。
右の表の各行ごとに、E列のIDが左の表のA列に存在するかを調べ、存在しない場合は "なし"、
存在する場合は"あり"とG列に記入するマクロを作れ。

Sub tokkun_1()
Dim hida
Dim migi
Dim mitsuketa
For migi = 11 To 21
mitsuketa = False '-----(1)
For hida = 4 To 29
If Range("a" & hida).Value = Range("e" & migi).Value Then
Range("g" & migi).Value = "あり"
mitsuketa = True
Exit For

End If '------(P)
If mitsuketa = True Then '------(2)
Range("g" & migi).Value = "なし"
End If
Next hida
Next migi
End Sub
'60分
'理由:フラグの付けてやってみました。(1)でtrueならどうなるか (2)の位置が(P)より上なのか下なのか いろいろやってみてようやくできたところです。


10438 : 小川慶一の回答 (2018-08-17 11:02:24)

morimotoさん:

以下について、[1]から順に解いてください。
[1]-[7]について、書き上がったマクロと、それぞれの課題を解くのにかかった時間もお知らせください。

ks201.xls を使用する。

[1]
シート「キャンペーン名簿1」で、右の表11行目から21行目までについて順番に調査する。
右の表の各行ごとに、E列のIDが左の表のA列に存在するかを調べ、存在しない場合は"なし"、存在する場合は"あり"とG列に記入するマクロを作れ。

[2]
シート「キャンペーン名簿1」で、右の表11行目から21行目までについて順番に調査する。
右の表の各行ごとに、E列のIDが左の表のA列に存在するかを調べ、存在する場合は1, 2, 3, ... とH列に上から順に番号を割り振るマクロを作れ。
存在しない場合はH列には何も記入しない。

[3]
シート「キャンペーン名簿1」で、右の表11行目から21行目までについて順番に調査する。
右の表の各行ごとに、E列のIDが左の表のA列に存在するかを調べ、存在しない場合は1, 2, 3, ... とI列に上から順に番号を割り振るマクロを作れ。
存在する場合はI列には何も記入しない。

[4]
シート「キャンペーン名簿1」で、右の表11行目から21行目までについて順番に調査する。
右の表の各行ごとに、E列のIDが左の表のA列に存在するかを調べ、存在しないもののリストをK列に作れ。
ただし、リストの内容はIDだけでよい。

[5]
シート「キャンペーン名簿1」で、右の表11行目から21行目までについて順番に調査する。
右の表の各行ごとに、E列のIDが左の表のA列に存在するかを調べ、存在しないもののリストをK列に作れ。
ただし、リストの内容は、K列にID、L列に氏名とする。

[6]
シート「キャンペーン名簿1」で、右の表11行目から21行目までについて順番に調査する。
右の表の各行ごとに、E列のIDが左の表のA列に存在するかを調べ、存在しない場合は以下を行うマクロを作れ。
・当該右の表のE列に記載されたIDをA列に追記する。

[7]
シート「キャンペーン名簿1」で、右の表11行目から21行目までについて順番に調査する。
右の表の各行ごとに、E列のIDが左の表のA列に存在するかを調べ、存在しない場合は以下を行うマクロを作れ。
・当該右の表のE列に記載されたIDをA列に追記する。
・当該右の表のF列に記載された名前をB列に追記する。


> 小川塾長:改めて一度整理し考えて見まして、フラグのfalse, trueですが、4:45あたりから説明が始まりまして、左のIDと右のIDで一致しないものを見つけたときmitsuketaと定義し、そしてその一致がみつからないとき→true、反対に一致がみつかったとき→false ということでいいのかなと思いました。そうすると、左のIDと右のIDの一致について
> (1)では一致がみつかるときだから、false
> (2)では一致がみつからないすなわち不一致があるときだからtrue
> そして(3)では一致がみつからないときだから、trueとすべきだと思いました。(解説ではfalseでした)
> 実際小生の解釈で実行すると解答と異なりA30行以下一致しているIDの12,17,2,11,19,6,26,10,13が表示されました。 
> (3)にてfalseになるところが知りたいです。
> いろんなcodeでfalseやtrueが出てくるのでこの機会につかみたいです。
> よろしくお願いします。
> Sub mondai201_01()
> Dim hida
> Dim migi
> Dim mitsuketa
> Dim tenkisaki
>
> tenkisaki = 30
>
> For migi = 11 To 21
> mitsuketa = False-----(1)
> For hida = 4 To 29
> If Range("A" & hida).Value = Range("E" & migi).Value Then
> Range("C" & hida).Value = Range("F" & migi).Value
> mitsuketa = True------(2)
> Exit For
> End If
> Next
> If mitsuketa = False Then-----(3) 不一致があるときだからtrue??
> Range("A" & tenkisaki).Value = Range("E" & migi).Value
> Range("C" & tenkisaki).Value = Range("F" & migi).Value
> tenkisaki = tenkisaki + 1
> End If
> Next
> End Sub


10431 : morimotoさんのコメント (2018-08-17 00:47:18)

小川塾長:改めて一度整理し考えて見まして、フラグのfalse, trueですが、4:45あたりから説明が始まりまして、左のIDと右のIDで一致しないものを見つけたときmitsuketaと定義し、そしてその一致がみつからないとき→true、反対に一致がみつかったとき→false ということでいいのかなと思いました。そうすると、左のIDと右のIDの一致について
(1)では一致がみつかるときだから、false
(2)では一致がみつからないすなわち不一致があるときだからtrue
そして(3)では一致がみつからないときだから、trueとすべきだと思いました。(解説ではfalseでした)
実際小生の解釈で実行すると解答と異なりA30行以下一致しているIDの12,17,2,11,19,6,26,10,13が表示されました。 
(3)にてfalseになるところが知りたいです。
いろんなcodeでfalseやtrueが出てくるのでこの機会につかみたいです。
よろしくお願いします。
Sub mondai201_01()
Dim hida
Dim migi
Dim mitsuketa
Dim tenkisaki

tenkisaki = 30

For migi = 11 To 21
mitsuketa = False-----(1)
For hida = 4 To 29
If Range("A" & hida).Value = Range("E" & migi).Value Then
Range("C" & hida).Value = Range("F" & migi).Value
mitsuketa = True------(2)
Exit For
End If
Next
If mitsuketa = False Then-----(3) 不一致があるときだからtrue??
Range("A" & tenkisaki).Value = Range("E" & migi).Value
Range("C" & tenkisaki).Value = Range("F" & migi).Value
tenkisaki = tenkisaki + 1
End If
Next
End Sub


10427 : 小川慶一の回答 (2018-08-16 12:42:37)

morimotoさん:

コードの話の前に...。

> false, trueのところがつかめませんで、下のcodeが解説講義の分ですが、(1)でfalseとありますが、falseは右のIDの中で左のIDにないもの(36,44)についてなので、(1)以下のhida,,,を処理するにはfalseでなくtrueにして右のIDの中に左のIDにあるときC列に転記する処理と考えtrueと書くのでないかと思いました(実行したらおかしな結果でした)

ご自身でも、読みにくいということは感覚として分かるかと思います。
こういう分かりにくい日本語を使ってしまうクセを改めましょう。

一文で済ませられるような情報量ではないです。
短い文の組み合わせで書きなおしてみましょう。

こういうスキルは言語運用の能力です。言語運用能力は、こびとちゃんにとって読みやすいプログラムを書くとか、人が書いたプログラムを読むとかいうとときにも大切です。
言い換えると、こういうスキルの弱さが、あなたの構文理解力を制約しています。

ということで、上に示した文を少し分解してみました。
こういうこと↓でしょうか?

解説講義で出てきた下のcodeについてアドバイスお願いします。
下のcodeの、(1)でfalseとありますが、trueと書くべきではないかと思いました。
というのは、以下の理由からです。

そう思う理由を順序立てて説明...その1
そう思う理由を順序立てて説明...その2
そう思う理由を順序立てて説明...その3

ところが、そう考えて(1)のfalseをtrueと書き改めてマクロを実行したところ、おかしな結果になりました。


言いたいことの流れはたぶん上記のとおりだろうと思います。

が、理由のところは読んでも理解できませんでした。上記「そう思う理由」を自分なりに整理して再投稿してください。

それから、「おかしな結果」というだけで済ませてあとは人に委ねるというのもプログラマーの態度としては無責任です。
ので、具体的に、本来望ましい実行結果と比較してどのような差が生じているのか?を自分の言葉で示してください。

あと、動画解説の何分何秒までは理解できたのか?もお知らせください。
そして、何分何秒のどういう説明が理解できなかったのか?もお知らせください。

苦手なタイプの宿題を多くもらってしまい、大変に感じられるかもしれませんが...。
マクロの勉強と思ってしっかり取り組んでいただければと思います。よろしくお願いします。

もっとも、上記のとおりに整理すれば、再度質問する前に、ご自身で問題解決できてしまうかもしれません。




> false, trueのところがつかめませんで、下のcodeが解説講義の分ですが、(1)でfalseとありますが、falseは右のIDの中で左のIDにないもの(36,44)についてなので、(1)以下のhida,,,を処理するにはfalseでなくtrueにして右のIDの中に左のIDにあるときC列に転記する処理と考えtrueと書くのでないかと思いました(実行したらおかしな結果でした)
> また(2)のtrueですが、右のIDの中で左のIDにないものがあればforからexitで抜けて(3)の処理に続けばと考えてしまいました。実行結果がおかしいので理解・解釈がおかしいのはわかりますが、きちんとつかんでおきたいので、(1)がfalse, (2)がtrueとなるところをアドバイスお願いします。
Sub mondai201_01()
Dim hida
Dim migi
Dim mitsuketa
Dim tenkisaki
 tenkisaki = 30
 For migi = 11 To 21
 mitsuketa = False---------(1)
       For hida = 4 To 29
        If Range("A" & hida).Value = Range("E" & migi).Value Then
              Range("C" & hida).Value = Range("F" & migi).Value
              mitsuketa = True-------(2)
               Exit For
           End If
        Next
       If mitsuketa = False Then--------(3)
            Range("A" & tenkisaki).Value = Range("E" & migi).Value
            Range("C" & tenkisaki).Value = Range("F" & migi).Value
            tenkisaki = tenkisaki + 1
        End If
    Next
End Sub


10412 : morimotoさんのコメント (2018-08-15 22:23:15)

false, trueのところがつかめませんで、下のcodeが解説講義の分ですが、(1)でfalseとありますが、falseは右のIDの中で左のIDにないもの(36,44)についてなので、(1)以下のhida,,,を処理するにはfalseでなくtrueにして右のIDの中に左のIDにあるときC列に転記する処理と考えtrueと書くのでないかと思いました(実行したらおかしな結果でした)
また(2)のtrueですが、右のIDの中で左のIDにないものがあればforからexitで抜けて(3)の処理に続けばと考えてしまいました。実行結果がおかしいので理解・解釈がおかしいのはわかりますが、きちんとつかんでおきたいので、(1)がfalse, (2)がtrueとなるところをアドバイスお願いします。
Sub mondai201_01()
Dim hida
Dim migi
Dim mitsuketa
Dim tenkisaki
tenkisaki = 30
For migi = 11 To 21
mitsuketa = False---------(1)
For hida = 4 To 29
If Range("A" & hida).Value = Range("E" & migi).Value Then
Range("C" & hida).Value = Range("F" & migi).Value
mitsuketa = True-------(2)
Exit For
End If
Next
If mitsuketa = False Then--------(3)
Range("A" & tenkisaki).Value = Range("E" & migi).Value
Range("C" & tenkisaki).Value = Range("F" & migi).Value
tenkisaki = tenkisaki + 1
End If
Next
End Sub


9868 : 小川慶一の回答 (2018-04-30 13:01:02)

受講生 さん:

おお、がんばりましたね!

> [A] 転記元ファイルにマクロを書く場合

ひとつの転記元ファイルから複数の転記先ファイルにデータを転記するとにはこれで良いでしょう。


> [B] 転記先ファイルにマクロを書く場合

複数のの転記元ファイルからひとつの転記先ファイルにデータを転記するときにはこれで良いでしょう。


> [C] ネット、マクロを記入するだけのファイルを作り、そのファイルにマクロを書く場合。

すいません。「ネット」は、「別途」の誤記でした。

複数の転記元ファイルから複数の転記先ファイルにデータを転記するとにはこれが最善でしょう。


>  についてのメリットはアクティブになっていることで書いたマクロの
>  実行がその場で確認できる事。

これは、メリットとは言えません。
テストをするプログラマーの都合でしかないので、きちんと動作するようになったらどうでもいい問題です。

>  デメリットはファイルが他の人に開かれていると操作できない。
> デメリットは 転記元、転記先のファイルが開かれている場合は処理ができないので誰も転記元のファイルを開いていない状態でマクロを起動させる必要があると思います。

これは[A]、[B]、[C]のいずれでも起きる問題です。
基礎編レベルの段階では、実運用でカバーですね。つまり、Excelマクロで制御するのではなく、利用者に通知するこのマクロの仕様方法についての注意事項として取り扱います。


> > Thisworkbook.Path について調べてみてください。
> 調べてみました。

例えばCドライブにhogeというフォルダがあるとします。
フォルダのパスは C\hoge です。

ここに、fuga.xlsmというファイルがあるとします。
このfuga.xlsmというファイルが、piyo.xlsmというファイルを開くとします。

その時、Thiswork.Pathを使ってマクロ書く場合と、ファイルのパスをフルパスで指定する場合との比較を以下に示します。
以下でどうでしょうか。

Sub ThisWorkbookPathSample()
    Dim sPath
    sPath = ThisWorkbook.Path & "\piyo.xlsm"
    Workbooks.Open Filename:=sPath
End Sub
Sub FullPathSample()
    Dim sPath
    sPath = "C:\hoge\piyo.xlsm"
    Workbooks.Open Filename:=sPath
End Sub


C\hoge\mokyu にある uni.xlsm を開くなら、以下。

Sub ThisWorkbookPathSample()
    Dim sPath
    sPath = ThisWorkbook.Path & "\mokyu\uni.xlsm"
    Workbooks.Open Filename:=sPath
End Sub
Sub FullPathSample()
    Dim sPath
    sPath = "C:\hoge\mokyu\uni.xlsm"
    Workbooks.Open Filename:=sPath
End Sub



> 現在の業務ではLEFT関数やInstr関数を使うような業務はありません。
> それぞれの方が受けたお客様からの問い合わせについて記入しているファイルを読みに行って、一つのファイルに必要な情報だけを転記するといった内容です。そのため、フォローアップまで受講していますが実務に使えているのはIF文とFor Next構文で転記していくところぐらいです。
> この先の中級編でそのような勉強はありますか?

基礎編フォローアップの後半に、まさにそんな内容のものがありますが…。これでは足りないでしょうか?
動画24以降。
https://online.pc5bai.com/movie/index/27/871


9063 : 小川慶一の回答 (2017-10-15 12:34:03)

受講生 さん:

ですね。
自分で試すのがいちばん勉強になります (^^

以下も改めて参照ください。
今復習すると、気づくことも多いでしょう。

出現回数を数える。CountIf関数がやっていることをマクロで書くと?
https://online.pc5bai.com/movie/index/27/150


> 9049 : 受講生さんのコメント (2017-10-12 23:59:24)
>
> もう一度「F8」でひとつずつ進めてみて、私が間違えてmistake = Falseを入れた位置だと、一度trueが入ってしまうと、ずっとtrueのままになってしまい、下のif文がきちんと処理されないということが分かりました。
> hidaが29まで行ったら、mistake をFalseに戻しておかないといけないので、私が書いた位置ではダメということですね。


9053 : 受講生さんのコメント (2017-10-14 15:23:42)

9049 : 受講生さんのコメント (2017-10-12 23:59:24)

もう一度「F8」でひとつずつ進めてみて、私が間違えてmistake = Falseを入れた位置だと、一度trueが入ってしまうと、ずっとtrueのままになってしまい、下のif文がきちんと処理されないということが分かりました。
hidaが29まで行ったら、mistake をFalseに戻しておかないといけないので、私が書いた位置ではダメということですね。


9049 : 受講生さんのコメント (2017-10-12 23:59:24)

マクロに苦手意識があってなかなか勉強が続きませんでしたが、
おかげさまで何とかここまで来られました。

今回は、一度、流して講義を聞いてみて、その後自分で書いてみました。

すると、mistake = False の位置が間違えていたため、「46」と「33」
が枠外に書かれませんでした。

こういう間違いをするということは、どの辺の理解が足りないのでしょうか?
よろしくお願いいたします。


Sub renshu()
Dim hida
Dim migi
Dim mistake
Dim tenkisaki

tenkisaki = 30
mistake = False ← ここに入れてしまった

For migi = 11 To 21
          ← 本来はここ
For hida = 4 To 29
If Range("a" & hida) = Range("e" & migi) Then
    Range("c" & hida) = Range("f" & migi)
    mistake = True
End If

Next
If mistake = False Then
    Range("a" & tenkisaki) = Range("e" & migi)
     Range("c" & tenkisaki) = Range("f" & migi)
     tenkisaki = tenkisaki + 1
     End If
Next
end sub


8538 : 小川慶一の回答 (2017-07-13 18:19:04)

受講生 さん:

大切な概念です。
そして、これをすっきり理解できると、マクロを書くときにとても助けになります。

> 解説に書かれている「フラグ」の概念がしっくりきました。
> 「フラグ」の使い方ですが
> For Nextの繰り返し中で条件によって、仕事を振り分ける時に
> 有効だと思いました。
> ↓
> 条件判定と処理のタイミングが一致しないときには、
> 「フラグ」となる変数の値の変更だけをしておき、処理は後回しにします。
>


8532 : 受講生さんのコメント (2017-07-13 07:25:50)

解説に書かれている「フラグ」の概念がしっくりきました。
「フラグ」の使い方ですが
For Nextの繰り返し中で条件によって、仕事を振り分ける時に
有効だと思いました。

条件判定と処理のタイミングが一致しないときには、
「フラグ」となる変数の値の変更だけをしておき、処理は後回しにします。


8384 : 小川慶一の回答 (2017-06-19 09:30:05)

受講生 さん:

>このプログラムを動かすと、D列に全てエラーが記載されてしまいます。
>マッチングしていない氏名のみエラーが出るにはどのようにしたら良いかご教示願います。

「どのようにしたら良いか」ということであれば、まずは、インデントのきちんとされたプログラムを書くことです。
それができれば、自力で問題を解決できるようになるでしょう。

前回ご質問いただいたときの添付ファイルにあった以下のプログラムでもそうでしたが

Sub test0004()
    '変数kouで「鉄筋/5F部分/6階建」で1つ目のスラッシュを確認
    Dim kou
    '変数takasaで「鉄筋/5F部分/6階建」で2つ目のスラッシュを確認
    Dim takasa
    '変数kaiで「鉄筋/5F部分/6階建」で真ん中の「階」の部分を確認
    Dim kai
    '変数iで繰り返し処理
    Dim i
  
    For i = 2 To 51
    kou = InStr(Range("D" & i), "/")
    takasa = InStr(kou + 1, Range("D" & i), "/")
    kai = Mid(Range("D" & i), kou + 1, takasa - kou - 1)
    Range("J" & i) = Left(Range("D" & i), kou - 1)
    Range("L" & i) = Mid(Range("D" & i), takasa + 1)
    Range("K" & i) = kai
    Next
    
End Sub


今回のプログラムもこれ↓です。

Sub test2()
        Dim saki
        Dim moto
        
         For moto = 4 To 31
         For saki = 4 To 31
       
       
           
        If Worksheets("転記先").Cells(saki, 2).Value = Worksheets("元データ").Cells(moto, 2).Value Then
                Worksheets("転記先").Cells(saki, 3).Value = Worksheets("元データ").Cells(moto, 3).Value
        Else
               Worksheets("転記先").Range("D" & saki).Value = "エラー"
        
        End If
        Next
        Next
  
End Sub


これでは問題解決を自分でできなくて当然です。

インデントされてないプログラムでは、本人も問題を見つけられません。
テストをするにも大変です。

ということなので、以下の練習問題から、きちんとインデントされたプログラムを書くことを意識して全問解き直されることをお勧めします。
「If文とForNext構文を組み合わせる」
https://online.pc5bai.com/movie/index/27/141

以下を徹底してください。「ハナコのステップ」にしたがって動画で解説しているとおりにプログラムを書いていれば自然にこうなります。
[1] sub ... end sub の中身は4文字分右へ
[2] for ... next や if ... else ... end if の中身は4も自分右へ

「If文とForNext構文を組み合わせる」から順に問題を解いていって、上記の説明と動画解説だけでは理解できないところがあったら、質問してください。


このままインデントされてないプログラムでゴリ押ししても、いずれもっと複雑な課題にトライしようとしても行き詰まるだけです。
難易度の高い問題を自力で解けるようになるには、基礎がしっかりしている必要があります。
数学で言えば、計算問題を早く正確に解けて、簡単な文章題が解けて、はじめて、難しい文章題が解けるようになるものです。
計算問題や簡単な文章題で足腰をしっかり鍛えないと、難しい文章題にチャレンジしようとしても必ず足元をすくわれます。
マクロもそれと同じです。簡単なマクロを書き上げるときの基本パターンをしっかり身につけていないと、難しいマクロを書こうとしても書きあげられません。
ということで、ここまで、嫌がらせではなくて、本当にそう思って書いていますので、ご理解いただければと思います。

とはいえ、今回だけは、いただいた質問そのものについても回答さしあげますね。

お送りいただいたプログラムを僕のほうで手直ししました。
以下のとおり。

Sub test2_ogawa()
    Dim saki
    Dim moto
    For moto = 4 To 31
        For saki = 4 To 31
            If Worksheets("転記先").Cells(saki, 2).Value = Worksheets("元データ").Cells(moto, 2).Value Then
                Worksheets("転記先").Cells(saki, 3).Value = Worksheets("元データ").Cells(moto, 3).Value
            Else
                Worksheets("転記先").Range("D" & saki).Value = "エラー"
            End If
        Next
    Next
End Sub



この状態にしてから、 [F8] でステップイン実行を30回くらいすれば何が起きているのか?十分に理解できることでしょう。
変数の値をプログラム実行中に確認するには、「自動データヒント」機能を利用できましたね。不審に思ったことがあったら、ステップインモードでのプログラム実行中に、変数 moto や変数 saki の値を確認しましょう。


8374 : 受講生さんのコメント (2017-06-18 12:58:19)

【動画24】の問題についてご教示願います(問題添付)
データ転記先の表に該当する氏名が見つからない場合は、転記先表にエラーが出るようにプログラムを作成しました(下記参照)
このプログラムを動かすと、D列に全てエラーが記載されてしまいます。
お忙しい中申し訳ありませんが、マッチングしていない氏名のみエラーが
出るにはどのようにしたら良いかご教示願います。
【回答1】
Sub test1()
Dim saki
Dim moto

For moto = 4 To 31
For saki = 4 To 31

If Worksheets("転記先").Range("B" & saki).Value = Worksheets("元データ").Range("B" & moto).Value Then
Worksheets("転記先").Range("C" & saki).Value = Worksheets("元データ").Range("C" & moto).Value

ElseIf Worksheets("転記先").Range("B" & saki).Value <> Worksheets("元データ").Range("B" & moto).Value Then
Worksheets("転記先").Range("D" & saki).Value = "エラー"

End If

Next

【回答2】
Sub test2()
Dim saki
Dim moto

For moto = 4 To 31
For saki = 4 To 31

If Worksheets("転記先").Cells(saki, 2).Value = Worksheets("元データ").Cells(moto, 2).Value Then
Worksheets("転記先").Cells(saki, 3).Value = Worksheets("元データ").Cells(moto, 3).Value
Else
'Worksheets("転記先").Range("D" & saki).Value = "エラー"
End If
Next
Next

End Sub 


7822 : 小川慶一の回答 (2017-03-15 01:00:38)

新見陽子 さん:

>こちらに質問する前に、元々あった疑問が、
>変数が2つある時のForNext構文で使う時の順序がわからない、でした。

なるほど。

いろいろやりとりしてみて、ようやく、核心が見えてきた気がします。

以下の問題は、自力で解けますか?
「複数の表の間でのマッチング。VLookUp関数がやっていることをマクロで書くと?」
https://online.pc5bai.com/movie/index/27/153

それでは、これから、上記の問題を自力で解けるという前提で解説します。

- - -

前記の「元々あった疑問」について、ご回答します。

「変数が2つある時のForNext構文で使う時の順序」は、プログラムを書き始める前の構想段階で自ずと決まるものです。

構想段階で、「どっちからでもいいじゃん」という結論になることもあります。
前記リンク先の例題は、「どっちからでもいいじゃん」という結論になる例です。

その反対に、「この順番でないと解決できない」という結論になることもあります。
今回の問題は、「この順番でないと解決できない」という結論になる例です。

構想力不足から結論が見えない場合もあります。
そのときには、やってみるよりないです。
「エイヤ!」でどっちを先に使うか決めてとりあえず行けるところまで行ってみて、運が良ければ無事にマクロを書き上げられて、バンザイ三唱です!
行き詰まってしまったら、すっぱり諦めて、もうひとつの変数を先に使うという方針で、マクロをイチから作り直します。

このようなロスを回避するためには、構想力をつけることが重要です。
そして、構想力をつけるには、演習問題をくり返し解くことと、実務でマクロを書くこととの2つが重要です。
演習問題は「くり返し解くこと」が重要ですから、前回も案内したとおり、簡単な問題から、自力でさくさく解けるようになるまでくり返し練習してください。

あと、

>それで正解とは逆の順序のForNext構文作って、
>正解の順序との変数の変わり方の違いを見比べたら、
>何かわかるかな、と思い変数の値の確認が始まった次第です。

ということでしたら、最初からその方針でイチからマクロを書けばもっとより効率的に学べたことと思います。
今回のご質問でいただいたマクロは、おそらく完成品のマクロにあるループの位置を手作業で入れ替えただけのものかと思います。そういうやり方では、力はつきません。

少し厳しい言い方をしますが、今回あなたを混乱させてしまったのは、あなたご自身です。

「検証したいことがあるときには、イチから自分でマクロを書く」というのは、テスト検証の基本中の基本です。
これはとても大切なことなので、今後の学習の重要な指針とすべく、肝に銘じてください。

- - -

「変数が2つある時のForNext構文で使う時の順序」は、プログラムを書き始める前の構想段階で自ずと決まるものです。

構想段階で、「どっちからでもいいじゃん」という結論になることもあります。
前記リンク先の例題は、「どっちからでもいいじゃん」という結論になる例です。

その反対に、「この順番でないと解決できない」という結論になることもあります。
今回の問題は、「この順番でないと解決できない」という結論になる例です。

○前記リンク先の例題であれば、ForNext構文のどちらが先でも問題ありません

○一方、今回の問題は、以下の手順でないと解けません(*)
[1] 右の表の特定の行のID値について左の表で検索する
[1-1] 前記検索で合致するIDを見つけたら、左表のその行に値を記入
[1-2] 前記検索で合致するIDが見つからなかったら、左表の最終行に値を記入
[2] 前記[1]を右の表のすべての行に対して実行する

(*)厳密に言うと解けないことはないですが、遠回りばかりで大変です

ということで、前記[1]-[2]を順を追って実装しました。以下。

[1] セルE11の値と一致するものがセルA4-A29にないかを調べる
[1-1] あれば簡単。左の表で見つけた値の2つ右のセルに情報を書き込む
[1-2] 見つからなかった場合は、左表の最後尾にIDとどのキャンペーンに応募したか?という情報について書き込む

上記[1]を、以下のプログラムで実現しました。

Sub renshu1()
    Dim hida
    Dim mitsuketa
    Dim tenkisaki
    
    tenkisaki = 30
    '[a]
    For hida = 4 To 29
        If Range("A" & hida).Value = Range("E11").Value Then
            Range("C" & hida).Value = Range("F11").Value
            mitsuketa = True
        End If
    Next
    If mitsuketa = False Then
        Range("A" & tenkisaki).Value = Range("E11").Value
        Range("C" & tenkisaki).Value = Range("F11").Value
        tenkisaki = tenkisaki + 1
    End If
    '[b]
End Sub



[確認1] ここまでは、自力で実装できますか?

上記のところまで実装できれば、あとは簡単です。

[2]に進みます。プログラム内の、[*a]-[*b]をハナコします。
変数 migi を新たに用意。
あと、変数 migi を使った For Next構文のループでは、先頭行で mitsuketa = false することだけ注意して:

Sub renshu2()
    Dim hida
    Dim migi
    Dim mitsuketa
    Dim tenkisaki
    
    tenkisaki = 30
    
    For migi = 11 To 21
        mitsuketa = False
        For hida = 4 To 29
            If Range("A" & hida).Value = Range("E" & migi).Value Then
                Range("C" & hida).Value = Range("F" & migi).Value
                mitsuketa = True
            End If
        Next
        If mitsuketa = False Then
            Range("A" & tenkisaki).Value = Range("E" & migi).Value
            Range("C" & tenkisaki).Value = Range("F" & migi).Value
            tenkisaki = tenkisaki + 1
        End If
    Next
End Sub



[確認2] ここまでは、自力で実装できますか?

ということで、無事に課題を解決することができました。

- - -

構想力不足から結論が見えない場合もあります。
そのときには、やってみるよりないです。
「エイヤ!」でどっちを先に使うか決めてとりあえず行けるところまで行ってみて、運が良ければ無事にマクロを書き上げられて、バンザイ三唱です!
行き詰まってしまったら、すっぱり諦めて、もうひとつの変数を先に使うという方針で、マクロをイチから作り直します。

このようなロスを回避するためには、構想力をつけることが重要です。
そして、構想力をつけるには、演習問題をくり返し解くことと、実務でマクロを書くこととの2つが重要です。
演習問題は「くり返し解くこと」が重要ですから、前回も案内したとおり、簡単な問題から、自力でさくさく解けるようになるまでくり返し練習してください。

- - -

あと、

>それで正解とは逆の順序のForNext構文作って、
>正解の順序との変数の変わり方の違いを見比べたら、
>何かわかるかな、と思い変数の値の確認が始まった次第です。

ということでしたら、最初からその方針でイチからマクロを書けばもっとより効率的に学べたことと思います。
今回のご質問でいただいたマクロは、おそらく完成品のマクロにあるループの位置を手作業で入れ替えただけのものかと思います。そういうやり方では、力はつきませんし、自分を混乱させるばかりです。実際、

>ですが、結局余計にわからなくなり

とのことですね。

少し厳しい言い方をしますが、今回あなたを混乱させてしまったのは、あなたご自身のテスト検証時の慎重さ不足です。

参考までに書くと、僕がどうしてそう思ったのか?というと、「左の表の特定の行のID値について右の表で検索する」ということからマクロを書きはじめたなら、最初の質問で提示されたような複雑なプログラムになる前に、以下のプログラムになった段階で、[*c], [*d]に何を書けばいいのか?と考えあぐねて行き詰まっているはずだからです。

Sub renshu0()
    Dim migi
    Dim tenkisaki
    Dim mitsuketa
    
    tenkisaki = 30
    For migi = 11 To 21
        If Range("A4").Value = Range("E" & migi).Value Then
            Range("C4").Value = Range("F" & migi).Value
            mitsuketa = True
            Exit For
        End If
    Next
    If mitsuketa = False Then
        Range("A" & tenkisaki).Value = ... [*c]
        Range("C" & tenkisaki).Value = ... [*d]
    End If
End Sub


プログラミングは、自分の頭と手を使って練習すればするほど上達します。
逆に言うと、分かったような気になって頭も手も使わないでサボっていると、より複雑な課題に出くわしたときに頭が混乱して行き詰まります。

もっとも、誰でも時間も手間も惜しいので頭が混乱して行き詰まるまではテキトーな学習姿勢でどんどん先に進んでも構いません。僕自身も、新しいことを学ぶときにはそういう態度で学ぶことがよくあります。

でも、いざ行き詰まったときは、より基本的な学習内容をしっかり復習したり、頭と手を動かしてイチからマクロを書いてみたりといった基本的な努力は欠かせません。
僕自身も、行き詰まったら、そのように工数をかけ、ひとつひとつの事象についてじっくり検証しながら学びを進めます。

「検証したいことがあるときには、イチから自分でマクロを書く」というのは、テスト検証の基本中の基本です。
これはとても大切なことなので、今後の学習の重要な指針とすべく、肝に銘じてください。

以上のとおりです。今後の一連の経験が、よい学びになりますよう。


>小川慶一 さん:
>ご返答ありがとうございます。
>またズレたことを言ってるかもしれませんが、こちらに質問する前に、元々あった疑問が、変数が2つある時のForNext構文で使う時の順序がわかない、でした。
>変数の宣言の順序は気にしてなかったのですが、ForNext構文で使う時の順序がわからず、それで正解とは逆の順序のForNext構文作って、
>正解の順序との変数の変わり方の違いを見比べたら、何かわかるかな、と思い変数の値の確認が始まった次第です。ですが、結局余計にわからなくなり
>こちらに質問しました。閲覧可能期間がせまり、焦って進めようとしてきましたが、結局身についてないと意味がないので期間内は諦めて、
>再度動画を見直してじっくりやり直してみます。ありがとうございました。


7819 : 新見陽子さんのコメント (2017-03-14 14:23:26)

小川慶一 さん:
ご返答ありがとうございます。
またズレたことを言ってるかもしれませんが、こちらに質問する前に、元々あった疑問が、変数が2つある時のForNext構文で使う時の順序がわかない、でした。
変数の宣言の順序は気にしてなかったのですが、ForNext構文で使う時の順序がわからず、それで正解とは逆の順序のForNext構文作って、
正解の順序との変数の変わり方の違いを見比べたら、何かわかるかな、と思い変数の値の確認が始まった次第です。ですが、結局余計にわからなくなり
こちらに質問しました。閲覧可能期間がせまり、焦って進めようとしてきましたが、結局身についてないと意味がないので期間内は諦めて、
再度動画を見直してじっくりやり直してみます。ありがとうございました。



>新見陽子 さん:
>
>>のカウンター変数migiは1個上がって22になる。というのが今精一杯の理解です。
>
>↑
>理解が足りないです。以下の僕のmsgをもう一度記載します。大きな声に出して、3回読んでみて。それから、書かれていることを日本語としてしっかり理解すること。
>
>>>本質的な問題はどこか?ということの理解が足りないと思います。
>>>ForNext構文で使っている変数の値をForNext構文が終わったあとに利用しようというのがそもそもの間違いです。
>
>上記の僕が引用した前回のmsgをしっかり理解できたなら、そもそも最初に引用した新見さんの見解などどうでもよいということがご理解いただけると思います。
>
>というか、もう少し明示的に書きます。
>For Next構文を抜けたら、そのFor Next構文でくり返し作業のカウントに使っていた変数がどういう値になっていようと知ったこっちゃないです。
>生ゴミ用ゴミ箱に捨てた、人参のヘタがその後どうなったか?というのと同じくらいにどうでもいい話です。
>For Next構文を抜けたあとにそのFor Next構文のくり返し作業のカウントに使っていた変数の値を活用しようというのは、ゴミ箱に捨てた人参のヘタを再度ゴミ箱から拾って使おうというくらいに愚かな実装アイデアです。
>
>>変数が2つ出てきたからNextも2個付けて辻褄合わせた、くらいに考えてました。
>>でもまだ、カウンター変数が2つ出てきたときの変数の順序のもってきかたがわかりません。ピンとこないんです。
>
>「辻褄合わせ」、「変数の順序のもってきかたがわからない」、「ピンとこない」という言葉と前記の理解のポイントがズレている状況から推察するに、たぶん、純粋に経験不足です。
>
>https://online.pc5bai.com/movie/index/27 で言うところの、
>動画その4~動画その12までをすべてやり直してみてください。
>つまり、複数の変数を活用する演習問題すべてです。
>
>「変数の順序」についてひとことだけ言うと、変数の宣言は、その変数を活用する前であればいつでもよいです。
>
>そのことを意識したうえで、演習問題を何も見ずにイチから書いて解いてください。
>たとえば、あえて、使う順序と逆の順番で変数が上から並ぶように宣言して使うとか。
>余裕があれば、これらの演習でもFor Next構文は毎回出てきますから、そこで/その直後にそのFor Next構文を抜けたところで変数がどんな値を取っているか?ということをいちいち確認されると良いでしょう。
>この演習のような、複数のFor Next構文が入れ子になっているマクロのような複雑なプログラムを眺めてうんうん考えるより、実践的かつ簡単な例を使って確認したほうが近道です。
>本当は余裕があれば倍速再生ででもいいから演習の解説動画もすべて見直して欲しいです。でも、さくさく解けなかった問題だけでもOKです。
>
>今は、これ以上は書かないことにします。あまり情報過多になると混乱させてしまいそうなので。
>曖昧な理解のうえに情報を積み上げても認識が破綻します。
>
>今は、たぶん、情報をつめこむよりも、演習を通じてご自身の中で曖昧になっていることを実感を持って身体レベルでしっかり納得することのほうが大切かと。
>この演習直前までの学びをしっかり定着させましょう。
>
>「どうしても前の課題に戻って演習をしている時間はない」ということでしたら、また相談してください。


7814 : 小川慶一の回答 (2017-03-13 20:16:48)

新見陽子 さん:

>のカウンター変数migiは1個上がって22になる。というのが今精一杯の理解です。


理解が足りないです。以下の僕のmsgをもう一度記載します。大きな声に出して、3回読んでみて。それから、書かれていることを日本語としてしっかり理解すること。

>>本質的な問題はどこか?ということの理解が足りないと思います。
>>ForNext構文で使っている変数の値をForNext構文が終わったあとに利用しようというのがそもそもの間違いです。

上記の僕が引用した前回のmsgをしっかり理解できたなら、そもそも最初に引用した新見さんの見解などどうでもよいということがご理解いただけると思います。

というか、もう少し明示的に書きます。
For Next構文を抜けたら、そのFor Next構文でくり返し作業のカウントに使っていた変数がどういう値になっていようと知ったこっちゃないです。
生ゴミ用ゴミ箱に捨てた、人参のヘタがその後どうなったか?というのと同じくらいにどうでもいい話です。
For Next構文を抜けたあとにそのFor Next構文のくり返し作業のカウントに使っていた変数の値を活用しようというのは、ゴミ箱に捨てた人参のヘタを再度ゴミ箱から拾って使おうというくらいに愚かな実装アイデアです。

>変数が2つ出てきたからNextも2個付けて辻褄合わせた、くらいに考えてました。
>でもまだ、カウンター変数が2つ出てきたときの変数の順序のもってきかたがわかりません。ピンとこないんです。

「辻褄合わせ」、「変数の順序のもってきかたがわからない」、「ピンとこない」という言葉と前記の理解のポイントがズレている状況から推察するに、たぶん、純粋に経験不足です。

https://online.pc5bai.com/package/index/27 で言うところの、
動画その4~動画その12までをすべてやり直してみてください。
つまり、複数の変数を活用する演習問題すべてです。

「変数の順序」についてひとことだけ言うと、変数の宣言は、その変数を活用する前であればいつでもよいです。

そのことを意識したうえで、演習問題を何も見ずにイチから書いて解いてください。
たとえば、あえて、使う順序と逆の順番で変数が上から並ぶように宣言して使うとか。
余裕があれば、これらの演習でもFor Next構文は毎回出てきますから、そこで/その直後にそのFor Next構文を抜けたところで変数がどんな値を取っているか?ということをいちいち確認されると良いでしょう。
この演習のような、複数のFor Next構文が入れ子になっているマクロのような複雑なプログラムを眺めてうんうん考えるより、実践的かつ簡単な例を使って確認したほうが近道です。
本当は余裕があれば倍速再生ででもいいから演習の解説動画もすべて見直して欲しいです。でも、さくさく解けなかった問題だけでもOKです。

今は、これ以上は書かないことにします。あまり情報過多になると混乱させてしまいそうなので。
曖昧な理解のうえに情報を積み上げても認識が破綻します。

今は、たぶん、情報をつめこむよりも、演習を通じてご自身の中で曖昧になっていることを実感を持って身体レベルでしっかり納得することのほうが大切かと。
この演習直前までの学びをしっかり定着させましょう。

「どうしても前の課題に戻って演習をしている時間はない」ということでしたら、また相談してください。


7812 : 新見陽子さんのコメント (2017-03-13 15:14:12)

小川慶一 さん:
お世話になります。

ForNext構文で使っている変数の値、4 To 29や11 To 21は、ForNext構文の中だけの話なんですね。
繰り返しの作業を終えてNextを通ったあとは、この29までや21までという指示は終わっている。
この部分の理解は、これであっているでしょうか。そして、ここも理解してなかったのですが
変数 migi = 11 To 21 のForNext構文①のくくりの中に、変数 hida = 4 To 29 のForNext構文②が
入っているんですね。変数が2つ出てきたからNextも2個付けて辻褄合わせた、くらいに考えてました。
構文①の中の構文②のくくりだから、これを逆にして、変数 hida = 4 To 29 のForNext構文の中に
変数 migi = 11 To 21 のForNext構文を入れたら、変数 migi = 11 To 21 の指定が終わったあとの話なので、
If mitsuketa = False Then
Range("A" & tenkisaki).Value = Range("E" & migi).Value
Range("C" & tenkisaki).Value = Range("F" & migi).Value
のカウンター変数migiは1個上がって22になる。というのが今精一杯の理解です。

でもまだ、カウンター変数が2つ出てきたときの変数の順序のもってきかたがわかりません。ピンとこないんです。
 Dim hida
Dim migi
の順序で上で変数を宣言した流れで、そのままの順序でForNext構文も書いてしまいます。


>新見陽子 さん:
>
>>わかりました。
>
>どうかな。。
>
>本質的な問題はどこか?ということの理解が足りないと思います。
>
>ForNext構文で使っている変数の値をForNext構文が終わったあとに利用しようというのがそもそもの間違いです。
>
>以下では、セルC1には、12という値が入ります。
>

Sub fornext_hensutest()
>    Dim gyo
>    For gyo = 2 To 11
>        Range("A" & gyo).Value = gyo
>    Next
>    Range("C1").Value = gyo '[*]
>End Sub

>
>以下では、Exit Forからループを途中で抜けることがない限り、[1]を実行するときの変数 migi の値はつねに22です。
>
>
For migi = 11 To 21 '←ここです
>    If Range("A" & hida).Value = Range("E" & migi).Value Then
>        Range("C" & hida).Value = Range("F" & migi).Value
>        mitsuketa = True
>        Exit For
>    End If
>Next
>If mitsuketa = False Then
>    Range("A" & tenkisaki).Value = Range("E" & migi).Value'[1]
>    Range("C" & tenkisaki).Value = Range("F" & migi).Value
>    tenkisaki = tenkisaki + 1
>End If

>
>エクセルシートの中身を確認すれば分かりますが、 migi = 22 のとき、Range("E" & migi).Valueの値は常にブランクです。
>
>まずはここまで。
>また考えて(というか、ご自身での考察は一旦捨てて、上記を十分に咀嚼して、それから当初の質問でご自身が提出されたコードを見直して)、どのような理解をしたか?お知らせください。
>
>そうすれば、そもそも以下の疑問はでてこないものと思います。
>
>>ですが、最初の質問とは別の疑問が出てきました。
>>なぜ For migi = 11 To 21としれているのに、
>>それを飛び越えて22になるのかもわかりません。
>


7801 : 小川慶一の回答 (2017-03-08 17:18:03)

新見陽子 さん:

>わかりました。

どうかな。。

本質的な問題はどこか?ということの理解が足りないと思います。

ForNext構文で使っている変数の値をForNext構文が終わったあとに利用しようというのがそもそもの間違いです。

以下では、セルC1には、12という値が入ります。

Sub fornext_hensutest()
    Dim gyo
    For gyo = 2 To 11
        Range("A" & gyo).Value = gyo
    Next
    Range("C1").Value = gyo '[*]
End Sub


以下では、Exit Forからループを途中で抜けることがない限り、[1]を実行するときの変数 migi の値はつねに22です。

For migi = 11 To 21 '←ここです
    If Range("A" & hida).Value = Range("E" & migi).Value Then
        Range("C" & hida).Value = Range("F" & migi).Value
        mitsuketa = True
        Exit For
    End If
Next
If mitsuketa = False Then
    Range("A" & tenkisaki).Value = Range("E" & migi).Value'[1]
    Range("C" & tenkisaki).Value = Range("F" & migi).Value
    tenkisaki = tenkisaki + 1
End If


エクセルシートの中身を確認すれば分かりますが、 migi = 22 のとき、Range("E" & migi).Valueの値は常にブランクです。

まずはここまで。
また考えて(というか、ご自身での考察は一旦捨てて、上記を十分に咀嚼して、それから当初の質問でご自身が提出されたコードを見直して)、どのような理解をしたか?お知らせください。

そうすれば、そもそも以下の疑問はでてこないものと思います。

>ですが、最初の質問とは別の疑問が出てきました。
>なぜ For migi = 11 To 21としれているのに、
>それを飛び越えて22になるのかもわかりません。


7800 : 新見陽子さんのコメント (2017-03-08 15:38:14)

小川慶一 さん:
ご返答ありがとうございます。

わかりました。A列の変数はhidaだから、A列の結果を表示させたければ Range("A" & tenkisaki).Value = Range("E" & migi).Value を
Range("A" & tenkisaki).Value = Range("A" & hida).Value に変えればいいだけですね。そしてA列に33や46の値はなく、
比較してないから表示もされるわけがないんですね。

ですが、最初の質問とは別の疑問が出てきました。
正しい順序のマクロではE13セルの値46と、A4~A29の値の比較が一巡し一致するものがないと、
If mitsuketa = False Thenを通ってRange("A" & tenkisaki).Value = Range("E" & migi).Valueに来た時、migiの値は13のままなのですが、
順序を入れ替えたマクロでは、A4セルの値1とE11~E21 セルの値の比較が一巡し、If mitsuketa = False Then を通り過ぎると
migiの値が21から22に変わりました。変わった理由もわからなければ、なぜ For migi = 11 To 21としれているのに、
それを飛び越えて22になるのかもわかりません。

>新見陽子 さん:
>
>以下の行が実行されるときの2つの変数 tenkisaki, migi の値をチェックしてください。
>つまり、[*]の行にブレークポイントを入れて[F5]でマクロを実行。[*]の行で実行が止まったところで自動データヒント機能を使って(つまり、変数の上にマウスポインタを持ってきて)値を調べます。
>

Range("A" & tenkisaki).Value = Range("E" & migi).Value '[*]
>Range("C" & tenkisaki).Value = Range("F" & migi).Value

>
>まずはそれをやって、2つのセル Range("A" & tenkisaki), Range("E" & migi) がどこを指すのか?エクセル画面で指さししながら確認してみてください。
>
>それで解決しなければ、上記のテストの結果何が分かったか?を示して、再度質問してください。
>(もちろん、上記のヒントだけで解決できた場合も)
>
>よろしく、お願いいたします。
>
>>お世話になります。
>>①の問題で、 mitsuketa = False の上下にある変数の定義の順序を、以下のように入れ替えてマクロを実行した場合、
>>顧客リストのID1に一致するものが、キャンペーン応募状況の表にはないので、ID1が30行目に追加されそうな気がするのですが、
>>追加されません。それどころか、ID46、ID33も追加されませんでした。F8で動きを追ってみたのですが、
>>なぜ、無視されるのかわかりません。なぜなんでしょう?
>>
>>
Sub mondai201_01()
>>    Dim hida
>>    Dim migi
>>    Dim mitsuketa
>>    Dim tenkisaki
>>    
>>    tenkisaki = 30
>>    
>>    For hida = 4 To 29  '←ここと
>>        mitsuketa = False
>>        For migi = 11 To 21 '←ここです
>>            If Range("A" & hida).Value = Range("E" & migi).Value Then
>>                Range("C" & hida).Value = Range("F" & migi).Value
>>                mitsuketa = True
>>                Exit For
>>            End If
>>        Next
>>        If mitsuketa = False Then
>>            Range("A" & tenkisaki).Value = Range("E" & migi).Value
>>            Range("C" & tenkisaki).Value = Range("F" & migi).Value
>>            tenkisaki = tenkisaki + 1
>>        End If
>>    Next
>>    
>>End Sub

>


7797 : 小川慶一の回答 (2017-03-08 09:42:45)

新見陽子 さん:

以下の行が実行されるときの2つの変数 tenkisaki, migi の値をチェックしてください。
つまり、[*]の行にブレークポイントを入れて[F5]でマクロを実行。[*]の行で実行が止まったところで自動データヒント機能を使って(つまり、変数の上にマウスポインタを持ってきて)値を調べます。

Range("A" & tenkisaki).Value = Range("E" & migi).Value '[*]
Range("C" & tenkisaki).Value = Range("F" & migi).Value


まずはそれをやって、2つのセル Range("A" & tenkisaki), Range("E" & migi) がどこを指すのか?エクセル画面で指さししながら確認してみてください。

それで解決しなければ、上記のテストの結果何が分かったか?を示して、再度質問してください。
(もちろん、上記のヒントだけで解決できた場合も)

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

>お世話になります。
>①の問題で、 mitsuketa = False の上下にある変数の定義の順序を、以下のように入れ替えてマクロを実行した場合、
>顧客リストのID1に一致するものが、キャンペーン応募状況の表にはないので、ID1が30行目に追加されそうな気がするのですが、
>追加されません。それどころか、ID46、ID33も追加されませんでした。F8で動きを追ってみたのですが、
>なぜ、無視されるのかわかりません。なぜなんでしょう?
>
>
Sub mondai201_01()
>    Dim hida
>    Dim migi
>    Dim mitsuketa
>    Dim tenkisaki
>    
>    tenkisaki = 30
>    
>    For hida = 4 To 29  '←ここと
>        mitsuketa = False
>        For migi = 11 To 21 '←ここです
>            If Range("A" & hida).Value = Range("E" & migi).Value Then
>                Range("C" & hida).Value = Range("F" & migi).Value
>                mitsuketa = True
>                Exit For
>            End If
>        Next
>        If mitsuketa = False Then
>            Range("A" & tenkisaki).Value = Range("E" & migi).Value
>            Range("C" & tenkisaki).Value = Range("F" & migi).Value
>            tenkisaki = tenkisaki + 1
>        End If
>    Next
>    
>End Sub


7795 : 新見陽子さんのコメント (2017-03-07 14:33:39)

お世話になります。
①の問題で、 mitsuketa = False の上下にある変数の定義の順序を、以下のように入れ替えてマクロを実行した場合、
顧客リストのID1に一致するものが、キャンペーン応募状況の表にはないので、ID1が30行目に追加されそうな気がするのですが、
追加されません。それどころか、ID46、ID33も追加されませんでした。F8で動きを追ってみたのですが、
なぜ、無視されるのかわかりません。なぜなんでしょう?

Sub mondai201_01()
    Dim hida
    Dim migi
    Dim mitsuketa
    Dim tenkisaki
    
    tenkisaki = 30
    
    For hida = 4 To 29  '←ここと
        mitsuketa = False
        For migi = 11 To 21 '←ここです
            If Range("A" & hida).Value = Range("E" & migi).Value Then
                Range("C" & hida).Value = Range("F" & migi).Value
                mitsuketa = True
                Exit For
            End If
        Next
        If mitsuketa = False Then
            Range("A" & tenkisaki).Value = Range("E" & migi).Value
            Range("C" & tenkisaki).Value = Range("F" & migi).Value
            tenkisaki = tenkisaki + 1
        End If
    Next
    
End Sub


6406 : 小川慶一の回答 (2016-04-12 10:56:46)

受講生 さん:

>Trueの綴りが違ったらFalseとして扱われてしまうとわかって驚きでした。

へー。そうなんですか!僕もびっくりです。


>小川先生へ
>
>フラグの概念、なるほど!と思いました。
>
>動画を見て、真似て書いてみたのですが
>転記先にキャンペーンタイプの一覧がそのまま転記されてしまいました。
>原因はTrueの綴りを間違っていたためでした(;・∀・)
>
>Trueの綴りが違ったらFalseとして扱われてしまうとわかって驚きでした。
>
>


6384 : 受講生さんのコメント (2016-04-11 18:02:15)

小川先生へ

フラグの概念、なるほど!と思いました。

動画を見て、真似て書いてみたのですが
転記先にキャンペーンタイプの一覧がそのまま転記されてしまいました。
原因はTrueの綴りを間違っていたためでした(;・∀・)

Trueの綴りが違ったらFalseとして扱われてしまうとわかって驚きでした。


6350 : 小川慶一の回答 (2016-04-09 04:08:15)

ゲスト さん:

資料の準備少し遅れました。すいません。
今はもう可能ですので!

>いつもお世話になっております。
>動画の資料ファイルはこちらの画面からはダウンロードできないのでしょうか?


6337 : 宮下 郁子さんのコメント (2016-04-05 17:50:10)

いつもお世話になっております。
動画の資料ファイルはこちらの画面からはダウンロードできないのでしょうか?


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

本講座の動画一覧

  1. 【動画1】 住所情報を都道府県から市区町村レベルで細かく分割する
    【動画1】 住所情報を都道府県から市区町村レベルで細かく分割する 未習得
  2. 【動画2】 保険料額表から標準報酬額ごとの保険料負担額を算出する
    【動画2】 保険料額表から標準報酬額ごとの保険料負担額を算出する 未習得
  3. 【動画3】 セル内の文字列から区切り文字を見つけ、その出現回数+1回だけデータ転記する
    【動画3】 セル内の文字列から区切り文字を見つけ、その出現回数+1回だけデータ転記する 未習得
  4. 【動画4】 セル内の文字列から区切り文字を見つけ、その区切り文字の間にある文字列を切り出す
    【動画4】 セル内の文字列から区切り文字を見つけ、その区切り文字の間にある文字列を切り出す 未習得
  5. 【動画5】 セル内の文字列から区切り文字を見つけ、その区切り文字の間にある文字列を反映しつつデータ転記する
    【動画5】 セル内の文字列から区切り文字を見つけ、その区切り文字の間にある文字列を反映しつつデータ転記する 未習得
  6. 【動画6】 VLookUp関数、Index関数、Match関数より便利なマクロ-該当する行が見つからない場合の処理をアレンジ
    【動画6】 VLookUp関数、Index関数、Match関数より便利なマクロ-該当する行が見つからない場合の処理をアレンジ 未習得
  7. 【動画7】 VLookUp関数、Index関数、Match関数より便利なマクロ-複数シート間、複数ファイル間でのマッチング
    【動画7】 VLookUp関数、Index関数、Match関数より便利なマクロ-複数シート間、複数ファイル間でのマッチング 未習得
  8. 【動画8】 転記先シートを生成してデータを流し込む。
    【動画8】 転記先シートを生成してデータを流し込む。 未習得
  9. 【動画9】 転記先ファイルを生成してデータを流し込む。
    【動画9】 転記先ファイルを生成してデータを流し込む。 未習得
  10. 【動画10】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で作成する。
    【動画10】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で作成する。 未習得
  11. 【動画11】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で同一ファイル内に連続的に作成する。
    【動画11】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で同一ファイル内に連続的に作成する。 未習得
  12. 【動画12】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で複数の別ファイルとして連続的に作成する。
    【動画12】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で複数の別ファイルとして連続的に作成する。 未習得
  13. 【動画13】 ファイル配布→配布先でのデータ記入→記入済データを手元資料に統合
    【動画13】 ファイル配布→配布先でのデータ記入→記入済データを手元資料に統合 未習得
  14. 【動画14】 データ記入用ファイルを配布する-その1
    【動画14】 データ記入用ファイルを配布する-その1 未習得
  15. 【動画15】 データ記入用ファイルを配布する-その2
    【動画15】 データ記入用ファイルを配布する-その2 未習得
  16. 【動画16】 各部署からファイルを回収し、記入済データを手元資料に統合その1
    【動画16】 各部署からファイルを回収し、記入済データを手元資料に統合その1 未習得
  17. 【動画17】 各部署からファイルを回収し、記入済データを手元資料に統合その2
    【動画17】 各部署からファイルを回収し、記入済データを手元資料に統合その2 未習得
  18. 【動画18】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その1)
    【動画18】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その1) 未習得
  19. 【動画19】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その2-1)
    【動画19】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その2-1) 未習得
  20. 【動画20】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その2-2)
    【動画20】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その2-2) 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ