
マッチングの基本パターン。
2つの表があるのでそれぞれの表に対応する変数をつくることが基本です。ひとつひとつていねいに、まず左の表のIDとマッチするところに右の情報をもってくる仕組み、次に右の表の情報を順番に全部調べる仕組みをつくります。
Ctrl+Zでマクロの状態を戻す習慣をつけてください。
この講座を含む定額コースに参加するか、この講座を購入することで、講座を利用できるようになります。
定額コースに参加すると、そのコースの利用期間中はいつでも講座を利用できます。
講座を購入すると、いつでも講座を利用できます。
学習記録としてメモを残す
質問や感想を投稿する
投稿時に 記号が \ に変換されてしまいますが、気にせず投稿してください。※投稿に必要な権限がありません。
このページへの投稿/コメント
念のため動作確認してみましたが、手元の環境では、問題は再現しませんでした。
おそらく、一時的に通信状態が悪いときがあり、そのときにお使いのブラウザが動画の読み込みに失敗してしまったのだろうと思います。
以下のいずかを試してみていただけますでしょうか。
・別のブラウザでログインしてこのページの動画の再生を試してみる
・別の端末でログインしてこのページの動画の再生を試してみる
なお、しばらく時間を置いてからあれば、同じブラウザで試してもうまくいくものと思います。
それでもだめな場合は、キャッシュをクリアしてから再度試してみてください。
よろしくお願いいたします。
'シート2のG列の値がA列と一致した氏名と郵便番号B列・住所C列をシート5へ転記
Sub tenki()
Dim hida
Dim migi
migi = 3
For hida = 2 To 20
If Worksheets("Sheet2").Range("A" & hida).Value = Worksheets("Sheet2").Range("G" & hida).Value Then
Worksheets("Sheet5").Range("B" & migi).Value = Worksheets("Sheet2").Range("A" & hida).Value
Worksheets("Sheet5").Range("C" & migi).Value = Worksheets("Sheet2").Range("B" & hida).Value
Worksheets("Sheet5").Range("D" & migi).Value=Worksheets("Sheet2").Range("C" & hida).Value
migi = migi + 1
End If
Next
End Sub
こんばんは。
If Worksheets("Sheet2").Range("A" & hida).Value = Worksheets("Sheet2").Range("G" & hida).Value Then
↑
この条件だと、A列とG列の値が一致した行の中身しか転記しませんね。
では、どのようにすれば、「G列にある氏名と同じ氏名をA列から探す」ことができるか?
それについては、このページの課題を参考にしてください。
また、転記については、以下の課題を参考にしてください。
○条件に一致するデータを別表に転記する。AutoFilterより便利な条件抽出マクロ。
https://forum.pc5bai.com/lesson/page/144
最低でも、以下の3つの変数が必要です。
A列の行を指定する変数
G列の行を指定する変数
転記先の行を指定する変数
このページの課題でも解説したとおり、最低でも、以下の2つのFor Next構文が必要です。
(内側にくるものから示します。G列もA列も2行目以降に調査対象のデータがあるものとします)
A列各行の値をG2の値と比較する
G列各行に対して同様の処理を行う
このヒントでピンとこないようでしたら、このページでの演習が不足しています。
連続で5回くらい解いてください。遅くとも1回あたり所要時間が6分を切るところまで。
それからもう一度このヒントを読み返して、そして再トライしてみてください。
この過程で挫折した場合は、どんな努力をしてどう挫折をしたのか?を示していただければ、次のヒント(あるいはワークなり、解答例なり)を出します。
小川慶一さん:
> さざなみさん:
>
> こんばんは。
>
> If Worksheets("Sheet2").Range("A" & hida).Value = Worksheets("Sheet2").Range("G" & hida).Value Then
> ↑
> この条件だと、A列とG列の値が一致した行の中身しか転記しませんね。
>
> では、どのようにすれば、「G列にある氏名と同じ氏名をA列から探す」ことができるか?
> それについては、このページの課題を参考にしてください。
>
> また、転記については、以下の課題を参考にしてください。
>
> ○条件に一致するデータを別表に転記する。AutoFilterより便利な条件抽出マクロ。
> https://forum.pc5bai.com/lesson/page/144
>
>
> 最低でも、以下の3つの変数が必要です。
> A列の行を指定する変数
> G列の行を指定する変数
> 転記先の行を指定する変数
>
> このページの課題でも解説したとおり、最低でも、以下の2つのFor Next構文が必要です。
> (内側にくるものから示します。G列もA列も2行目以降に調査対象のデータがあるものとします)
>
> A列各行の値をG2の値と比較する
> G列各行に対して同様の処理を行う
>
>
> このヒントでピンとこないようでしたら、このページでの演習が不足しています。
> 連続で5回くらい解いてください。遅くとも1回あたり所要時間が6分を切るところまで。
> それからもう一度このヒントを読み返して、そして再トライしてみてください。
>
> この過程で挫折した場合は、どんな努力をしてどう挫折をしたのか?を示していただければ、次のヒント(あるいはワークなり、解答例なり)を出します。
>
>
解決したい課題はいたってシンプルです。
[a]
G2セルにある値を使い、条件に一致するデータを見つける。そして何らかの処理をする。
↓
G2:G20の範囲にある値を使って同様に処理を行う。
このページで紹介している課題と何が違うのかというと、「そして何らかの処理」の部分が、
[b]
「条件に一致した行に値を書き込む」
から
「条件に一致した行にあるデータを別シートに転記する」
に変わっただけです。
そして、[a], [b]のうち、さざなみさんは、[a]の部分でつまづかれています。
[b]に気を取られて[a]の処理をきちんと実装できなくなっているというのは、要は、[a]にかかる演習が不足しているということです。
「実務上の課題を解決する必要に迫られている」という状況は、上達のチャンスです。
> さっそくに返信ありがとうございます!もっと演習してできるようになりたいと思います!
ではなく、
> もっと動画を見てたくさんマクロ書いてすっとわかるようにがんばります。
ではなく、今目の前にある課題のために努力したほうがよいです。
先だっての投稿は、そういう意味でのアドバイスです。
「もっと動画を見る」のではなく、このページの演習をくり返して自分のものにしてください。
「もっと演習して」ではなく、この課題を解決するためのヒントを必死になって探すつもりで演習をくり返してださい。
Sub tenki2()
Dim hida
Dim migi
Dim migii
migii = 3
For migi = 2 To 20
For hida = 2 To 20
If Worksheets("Sheet2").Range("G" & migi).Value = Worksheets("Sheet2").Range("A" & hida).Value Then
Worksheets("Sheet5").Range("B" & migii).Value = Worksheets("Sheet2").Range("A" & hida).Value
Worksheets("Sheet5").Range("C" & migii).Value = Worksheets("Sheet2").Range("B" & hida).Value
Worksheets("Sheet5").Range("D" & migii).Value = Worksheets("Sheet2").Range("C" & hida).Value
migii = migii + 1
End If
Next
Next
End Sub
小川慶一さん:
> 受講生 さん:
>
> 解決したい課題はいたってシンプルです。
>
> [a]
> G2セルにある値を使い、条件に一致するデータを見つける。そして何らかの処理をする。
> ↓
> G2:G20の範囲にある値を使って同様に処理を行う。
>
> このページで紹介している課題と何が違うのかというと、「そして何らかの処理」の部分が、
>
> [b]
> 「条件に一致した行に値を書き込む」
> から
> 「条件に一致した行にあるデータを別シートに転記する」
>
> に変わっただけです。
>
> そして、[a], [b]のうち、さざなみさんは、[a]の部分でつまづかれています。
> [b]に気を取られて[a]の処理をきちんと実装できなくなっているというのは、要は、[a]にかかる演習が不足しているということです。
>
>
> 「実務上の課題を解決する必要に迫られている」という状況は、上達のチャンスです。
>
> > さっそくに返信ありがとうございます!もっと演習してできるようになりたいと思います!
>
> ではなく、
>
> > もっと動画を見てたくさんマクロ書いてすっとわかるようにがんばります。
>
> ではなく、今目の前にある課題のために努力したほうがよいです。
>
> 先だっての投稿は、そういう意味でのアドバイスです。
> 「もっと動画を見る」のではなく、このページの演習をくり返して自分のものにしてください。
> 「もっと演習して」ではなく、この課題を解決するためのヒントを必死になって探すつもりで演習をくり返してださい。
>
>
>
>
>
おお、できましたか!
自力でできると、また格別ですね。
良い経験になったかと思います (^^*
基礎編フォローアップペーシックで扱っているお題はどれもシンプルですが、組み合わせれば実務上のさまざまな課題を解決できます。
「自力で組み合わせできない」という場合は学んだはずのスキルがまだ手についていないということです。そういうときは、そういう意識で復習に取り組んでいただければと思います。
もちろん、このオリジナル課題も、
> 今やっとできました。
で終わらせないで、何度かくり返して解いて、自分の身体になじませてください。
すると、「さらにひと工夫」というようなものも作れるようになります。マクロの上達というのは、そういうステップのくり返しです (^^
コードについてひとつだけコメントすると、migi, migiiという2つの変数は名前が似すぎているのでどちらか変更したいですね。
たとえば、 migii のほうは、「tenkisaki」とか「saki」とかかな。
ではでは。
ひきつづき、学習お楽しみください☆
こんばんは。
> 発展編を受講すれば、別のプログラムを使ってもっと速度を上げるような方法を学ぶことができますか。
はい、そうです。
乱暴な例えですが、基礎編は、バイクに例えると原付のようなものです。
最低限のことを学び、とりあえず一般道を自由に走れるようになり、小回りを効かせて近所での用事はだいたいこなせるようになるというところまでです。
発展編1, 発展編2, 外部連携, と、次第により高速に処理できる手法を学んでいきます。
> vlookup関数を使わずにVBAで書くとこのようなことになることは理解できます。このVBAで書くと、一つずつ、はじめから検索することになると思いますが、検索したいデータが膨大(例えば1万件)になるとかなり時間がかかることになると思います。発展編を受講すれば、別のプログラムを使ってもっと速度を上げるような方法を学ぶことができますか。
Alt→E→R
無意識に使えるよう練習します。
手が勝手に動くようになったら勝ちです。
> ショートカットキーによるやり直し
> Alt→E→R
> 無意識に使えるよう練習します。
(昔の私も、さくっと解いていたようですが・・・(;´・ω・))
2つのForNextとif文を使いこなす点で
しそ巻きカウントの手法をマスターしたという実感が湧きました。
一つ気がついたのは、
ある目的値の該当が見つかったら、もう比較を続ける必要がないので
そのIF文を終わらせて、次の比較値に進むようにすれば
処理は速くなるだろうなということです。
今回は加算していく比較ではなく、ただ1つの該当値を見つけるための比較だからです。
(IF文を抜ける文法自体は忘れましたが、手法として思いつきましたので
書いてみました)
gooska
順調なようでなにより☆
> 一つ気がついたのは、
> ある目的値の該当が見つかったら、もう比較を続ける必要がないので
> そのIF文を終わらせて、次の比較値に進むようにすれば
> 処理は速くなるだろうなということです。
> 今回は加算していく比較ではなく、ただ1つの該当値を見つけるための比較だからです。
> (IF文を抜ける文法自体は忘れましたが、手法として思いつきましたので書いてみました)
基礎編ではあえて紹介していませんが、 Exit For を使います。
for 1
for 2
if ... then
処理
exit for 'for 2 から抜ける(ので、for 1の次のカウンター値から再開)
end if
next 2
next 1
ForNext文については元々よく利用していましたが、
当時と違うことは、それほど頭で考えなくても書けることだと思います。
だいぶ体に染み込んできてくれているようです。
順調そうでなによりです。
ひきつづきお楽しみください!
IDの一致は理解できた。
それをIF文で作る
典型パターンです。
「できて当然!」と心の底から思えるようになるまで習熟してください。
> 左の表と右の表の変数を作ることが基本
> IDの一致は理解できた。
> それをIF文で作る
もし、キャンペーン応募が同じ人から複数件あったとして、左の表の同じセルに「、」を打って複数件足していくような場合を想定して下記のようなコードを書きました。
しかし、F5で実行を押すたびに左の票の数が足されていってしまいます。修正箇所としてどの点を直せばよろしいでしょうか。
ご教授宜しくお願い致します。
Sub sakusei()
Dim hida
Dim migi
Dim goukei
For migi = 11 To 23
For hida = 4 To 29
goukei = Range("C" & hida).Value
If Range("E" & migi).Value = Range("A" & hida).Value Then
goukei = goukei & "," & Range("F" & migi).Value
End If
Range("C" & hida) = goukei
Next
Next
End Sub
以下の動画くらいまでやってからまた相談いただければと。
表を解析して1行のリストを作る、1行のリストを解析して表にする、その1,その2
https://forum.pc5bai.com/lesson/page/157
https://forum.pc5bai.com/lesson/page/158
>お世話になっております。一つこの例題について伺いたいことがあります。
>もし、キャンペーン応募が同じ人から複数件あったとして、左の表の同じセルに「、」を打って複数件足していくような場合を想定して下記のようなコードを書きました。
>しかし、F5で実行を押すたびに左の票の数が足されていってしまいます。修正箇所としてどの点を直せばよろしいでしょうか。
>ご教授宜しくお願い致します。
復習と理解度の確認になりました。
過去のコメントもできるだけ参考にしています。先輩ユーザーの皆様も、
今回はすいすいとけた方が多かったみたいですね(^▽^)/
最近は苦労して自主補習もしていたので、たまにさくっと行けると自信がついて、
嬉しいです!(≧▽≦)
私はまだ実務で試すことができないので、成果を実感されている方々が羨ましいです。
by gooska
この問題は、本来「やや難」なはずなんですけどね。
やはり、ここまでの問題を着実に解かれている方には簡単なようですね。(言い換えると、着実に力をおつけです、という)
このケースでは、VLOOKUP関数を呼び出すことでもできますが、自分で仕組みを作った方が応用範囲が広いと思いました。
この仕組みを使えば、同一検索値で複数データを表示することも可能ですね(関数で同じことをやろうとし、苦労したことがあります)。
どちらもできるようになり、その場に応じて使い分けていきたいと思います。
> 自分で仕組みを作った方が応用範囲が広いと思いました。
地力もつきますね。
worksheetfunction.vlookup のような既成品を使うのもよいですが、この程度のアルゴリズムは自力で導けるようになっておくと、あとあと楽です。
(匿名さんはもうとっくにそんな域にいらっしゃいますが)
ウチは足腰鍛えること重視してますので、特に基礎編では、既成品はなるべく渡さず、超基本の道具だけでガシガシ構造文を書いて実装することを推奨していますw
12回目で、理解に少々時間がかかったのですが、
解ると、こっちは、すんごい簡単ですね。再生せずに出来ました。
面倒で嫌だった定型業務がまた1つ解決しました^^
マッチングの基本パターンです。
これが分かれば、自由に応用できますね。応用の容易さも、VLOOKUP関数の比ではありません。
12回目について補足(?)すると、
For ...
Next
という構文セットのあとにループの中で調べた結果を書き出す、というのは、基本パターンです。
(「構造化プログラミング7つ道具」という僕のオリジナル教材があります。そこに書いています。いずれ折を見て紹介します。)
そういう意味では、「第10回」と「第12回」型は同じです。
https://forum.pc5bai.com/lesson/page/150
>これ、VLOOKUPですね。関数使うよりカンターン♪♪
>12回目で、理解に少々時間がかかったのですが、
>解ると、こっちは、すんごい簡単ですね。再生せずに出来ました。
>面倒で嫌だった定型業務がまた1つ解決しました^^
>これが分かれば、自由に応用できますね。応用の容易さも、VLOOKUP関数の比ではありません。
実務で使用しました。
列の入れ替え、範囲選択不要、セル右下Wクリックするもブランクでストップというストレスも無し、
コピーして値貼り付けも不要で、条件を追加するのは自由とvlookup関数より、
楽に、早く、確実に処理が終わりました。ありがとうございます。
参考までに教えて頂きたいのですが、
こういう処理の場合、Cellsを使うと実行速度が速くなったりするのでしょうか。
多くても3列15000行程度なので、大した差は無いのでしょうが少し気になります。
>実務で使用しました。
>列の入れ替え、範囲選択不要、セル右下Wクリックするもブランクでストップというストレスも無し、
>コピーして値貼り付けも不要で、条件を追加するのは自由とvlookup関数より、
>楽に、早く、確実に処理が終わりました。ありがとうございます。
いやー、たまらないですね (^^*
>参考までに教えて頂きたいのですが、
>こういう処理の場合、Cellsを使うと実行速度が速くなったりするのでしょうか。
>多くても3列15000行程度なので、大した差は無いのでしょうが少し気になります。
要は、頻繁にセルを探す作業がある場合ということでしょうか。
書いて実行して比べるのがいちばん早くて分かりやすいと思います。
僕もどっちのほうが早いかは多少興味ありますので、よかったら書いたプログラムと実行結果を教えてください。
僕は Cells はぜんぜん使わないのです。
プログラムを書くときには、 Range で書いたほうが直感的で早いというのと、非表示になっているシートにある複数セルで指定される範囲を表現するのにとても面倒だというのがその理由です。
あと、パフォーマンスの違いについて考えるときの方針について。
Range と Cells のパフォーマンスの違いは、マシンスペックやほかによけいなプログラムが走っているかいないかとか、そういうことによって吸収されてしまう程度に軽微です。
(For Each構文で書けば、 For Next 構文で書くよりはだいぶ早いです。あと、RangeのFindメソッドを使う)
でも、そこの改善に夢中になるより、やっている仕事の進め方を根本から変えるとかしたほうが全体としてのインパクトはデカいです。
よほどのパフォーマンスの違いになるのでなければ、僕はプログラムを書くときにかかる工数が少ないことがいちばん重要だと考えています。
匿名さんは当然ご存知のとおり、この点に気がついてそこそこのところで満足して手を離せるかどうかが、エクセルマニアで終わるか業務改善をできる人になるかの違いだと思います。
>Range と Cells のパフォーマンスの違いは、マシンスペックやほかによけいなプログラムが走っているかいないかとか、
>そういうことによって吸収されてしまう程度に軽微です。
そうですよね^^ 良かった。感じていた通りのお言葉でした。
某T先生の無料講義でcells大推奨だったのですが、理由については速さとしか解説してもらえず
ネットで調べても場所の取得が、めちゃ面倒なだけという印象だったんですよね。
私もRange で直感的に書くほうが、思考と作業のズレでストレスを感じずに済み良いと思います。
18回目の課題も、めちゃ便利ですね。
重複だけなら、データタブから重複の削除で済むのですが、区域の取得をどうしたら良いか分からず
先週まで、目視と手作業で処理していました。データの数が少ないので諦めていたのですが、小川先生、凄すぎです。
面倒な作業が、日々加速的に楽しくなっています。
>某T先生の無料講義でcells大推奨だったのですが、理由については速さとしか解説してもらえず
エクセルのことばかり見ていると、部分最適にばかり目がいってしまいますね (^^;
以下の記事も参考になるかと思います。
http://www.exvba.com/blog/?p=4378
「某T先生」の視点は、この記事で言うところの「作業担当者にとってどうか」という視点です。
「作成者にとってどうか」と言えば Range でしょう。
18回目の課題は、実は、発展編1のあとに演習で扱う「伝票作成マクロ」と基本のアルゴリズムは同じです。
http://www.exvba.com/demo_denpyo.php
18回目の課題を楽しいと思っていただけるようでしたら、かなり楽しんでいただけると思います v(^^*
>>Range と Cells のパフォーマンスの違いは、マシンスペックやほかによけいなプログラムが走っているかいないかとか、
>>そういうことによって吸収されてしまう程度に軽微です。
>
>そうですよね^^ 良かった。感じていた通りのお言葉でした。
>某T先生の無料講義でcells大推奨だったのですが、理由については速さとしか解説してもらえず
>ネットで調べても場所の取得が、めちゃ面倒なだけという印象だったんですよね。
>私もRange で直感的に書くほうが、思考と作業のズレでストレスを感じずに済み良いと思います。
>
>18回目の課題も、めちゃ便利ですね。
>重複だけなら、データタブから重複の削除で済むのですが、区域の取得をどうしたら良いか分からず
>先週まで、目視と手作業で処理していました。データの数が少ないので諦めていたのですが、小川先生、凄すぎです。
>面倒な作業が、日々加速的に楽しくなっています。
それはそうですね。いただいたご意見、反映させたいと思います。ひきつづきよろしくお願いいたします。
>ダウンロード資料の中に問題文を入れた方が、繰り返しの勉強もしやすいと思います。