エクセルマクロ オンライン講座コメント紹介

コメント紹介
   └ エクセルマクロ・VBA基礎編フォローアップ
       └ VLookUp関数、Index関数、Match関数より便利なマクロ-該当する行が見つからない場合の処理をアレンジ

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

[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

 


[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

 


[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

>

 


[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になるのかもわかりません。

 


[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になるのかもわかりません。
>

 


[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://padstudy.jp/movie/27 で言うところの、
動画その4~動画その12までをすべてやり直してみてください。
つまり、複数の変数を活用する演習問題すべてです。

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

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

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

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

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

 


[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://padstudy.jp/movie/27 で言うところの、
>動画その4~動画その12までをすべてやり直してみてください。
>つまり、複数の変数を活用する演習問題すべてです。
>
>「変数の順序」についてひとことだけ言うと、変数の宣言は、その変数を活用する前であればいつでもよいです。
>
>そのことを意識したうえで、演習問題を何も見ずにイチから書いて解いてください。
>たとえば、あえて、使う順序と逆の順番で変数が上から並ぶように宣言して使うとか。
>余裕があれば、これらの演習でもFor Next構文は毎回出てきますから、そこで/その直後にそのFor Next構文を抜けたところで変数がどんな値を取っているか?ということをいちいち確認されると良いでしょう。
>この演習のような、複数のFor Next構文が入れ子になっているマクロのような複雑なプログラムを眺めてうんうん考えるより、実践的かつ簡単な例を使って確認したほうが近道です。
>本当は余裕があれば倍速再生ででもいいから演習の解説動画もすべて見直して欲しいです。でも、さくさく解けなかった問題だけでもOKです。
>
>今は、これ以上は書かないことにします。あまり情報過多になると混乱させてしまいそうなので。
>曖昧な理解のうえに情報を積み上げても認識が破綻します。
>
>今は、たぶん、情報をつめこむよりも、演習を通じてご自身の中で曖昧になっていることを実感を持って身体レベルでしっかり納得することのほうが大切かと。
>この演習直前までの学びをしっかり定着させましょう。
>
>「どうしても前の課題に戻って演習をしている時間はない」ということでしたら、また相談してください。

 


[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構文作って、
>正解の順序との変数の変わり方の違いを見比べたら、何かわかるかな、と思い変数の値の確認が始まった次第です。ですが、結局余計にわからなくなり
>こちらに質問しました。閲覧可能期間がせまり、焦って進めようとしてきましたが、結局身についてないと意味がないので期間内は諦めて、
>再度動画を見直してじっくりやり直してみます。ありがとうございました。

 


まずはここから!スマホでも学べる無料動画講座

今なら先着30名限定で無料!定価4,800円の、初心者のためのエクセルマクロ動画講座。
  1. Excel 97~Excel 2016まですべて対応。動画本数20本、総再生時間2時間44分53秒
  2. PC, Mac, iPhone, iPad, Androidのお好みの環境で、いつでも好きなときに学べます。
2004年から10年間述べ3,000名以上に実施した研修の経験と実績を集約した講座です。
いますぐ無料で試してください。

トップへ