
理解してから書くよりも、まず書いてみる。その結果をみてから考えて書きなおすという繰り返しが大事です。
並べ替え済みのリストから重複しないリストをつくる仕組みと、For Next構文の始まった直後と終わった後に特別な仕掛けをつくる仕組みをよくみて何度もマクロを書いてみてください。
この講座を含む定額コースに参加するか、この講座を購入することで、講座を利用できるようになります。
定額コースに参加すると、そのコースの利用期間中はいつでも講座を利用できます。
講座を購入すると、いつでも講座を利用できます。
学習記録としてメモを残す
質問や感想を投稿する
投稿時に 記号が \ に変換されてしまいますが、気にせず投稿してください。※投稿に必要な権限がありません。
このページへの投稿/コメント
小川先生こんにちは。
毎朝、30分程度、動画を見ながらマクロの勉強を継続しています。
6回繰り返し練習して、ようやく答えを見ずにマクロを完成させることができました。
少しずつですが、マクロを書くことに慣れてきました。
ここで質問があります。
シート「Sheet2」の課題で、「担当区域」列に、tiku = ""と書くと、業者別に担当区域ごとに記載されるとのことですが、tiku=""というマクロを書くと、なぜこのような現象が起こるのか仕組みがどうしても理解できません。
算数に苦手意識があるためかもしれません。
つきましては、このような現象が起こる仕組みをご教示いただきますようお願いします。
○出現回数を数える。CountIf関数がやっていることをマクロで書くと?
https://forum.pc5bai.com/lesson/page/150/
上記の課題では、「しそ巻き無料」、「飲み物無料」、「かんぴょう巻き無料」のそれぞれの出現回数を調べました。
「しそ巻き無料」は5件、「飲み物無料」は3件、「かんぴょう巻き無料」は6件出現しましたね。
そのとき、個々について数を数え終えたら、「いくつあったか」ということを記憶するために用意した変数 goukei の値を 0 に戻しました。
goukei = 0
でないと、「しそ巻き無料」は5件というところは正しく出力されるのですが、「飲み物無料」は8件(5+3=8)、「かんぴょう巻き無料」は14件(5+3+6=14)と出力されてしまいます。
tiku = ""
についても発想は同様です。
「岩手化学」の担当区域を出力したら、変数 tiku の値をブランクに戻します。
でないと、「甲府重工」の担当区域を出力するとき、「岩手化学」と「甲府重工」の担当区域をあわせたものが出力されてしまいます。
さらには、「秋田信託」の担当区域を出力するとき、「岩手化学」と「甲府重工」と「秋田信託」の担当区域をあわせたものが出力されてしまいます。
...
(6:25秒くらいでの出力結果がまさにこれです)
ということなので tiku = "" をどこかでやらなくてはならないのですが、ではいつやるか?といえば、各企業の「岩手化学」の担当区域を出力した直後というのは簡明なタイミングのひとつです。
実際に手作業していると思うとよりイメージしやすいかもしれません。
手のひらサイズのメモ帳を左手に、右手に鉛筆を持って、表を上からチェックしていきます。
最初は、「岩手化学」の担当区域をメモ帳に転記していく。ひととおりチェックを終えたら、集計表に記載します。
集計表への記載を終えたら、そのメモの記載内容はもう用なしです。メモ帳の内容を消しゴムで消すか、メモ帳のページを破いて捨てるかして、まっさらなページを用意します。
次は、「甲府重工」の担当区域をメモ帳に転記していく。ひととおりチェックを終えたら、集計表に記載します。
集計表への記載を終えたら、そのメモの記載内容はもう用なしです。メモ帳の内容を消しゴムで消すか、メモ帳のページを破いて捨てるかして、まっさらなページを用意します。
その次は、「秋田信託」の担当区域をメモ帳に転記していく。ひととおりチェックを終えたら、集計表に記載します。
集計表への記載を終えたら、そのメモの記載内容はもう用なしです。メモ帳の内容を消しゴムで消すか、メモ帳のページを破いて捨てるかして、まっさらなページを用意します。
...
手作業であれば、上記のような感じになりますね。
(変数からの)転記が済んだら(変数に記憶させた値はもう用なしなので)変数を初期化します。
すなわち、 tiku = "" (変数の中身を、まっさらな状態に戻す)ということです。
あとに登場する別のお題との関連を意識しつつ解くと、また違った学びが得られます。当初は何とも思わなかった手法や考え方が、実はとても重要だったと気づくかもしれません。
紹介されても「こんなの使わないかな」と一回目には感じられたショートカット操作に対して、「実は、すげー重要なのでは?!」と思うこともあるかもしれません。
分かりやすい説明ありがとうございます。
手作業していることをイメージすると理解しやすくなりました。
「しそ巻き無料」で使ったgoukei = 0と同じ考えという説明で腑に落ちました。
上記の考えでいくと、tiku="0"でも結果は同様になりそうですね。
仕組みへの理解はできたようで、まずは良かったです。
> 上記の考えでいくと、tiku="0"でも結果は同様になりそうですね。
試してみてください。
結論を書くと、そうはなりませんので...。
実際に試して結果を見てみると、また学びが深まるかと思います v(^^*
結果は正しく出力されています。
以下プログラムです。
Sub mondai2()
Dim gyo
Dim tenki
Dim kuiki
tenki = 2
For gyo = 2 To 27
If Range("A" & gyo).Value <> Range("A" & gyo - 1).Value Then
Range("E" & tenki).Value = Range("A" & gyo).Value
Range("F" & tenki).Value = Range("B" & gyo).Value
kuiki = Range("C" & gyo).Value & "地区"
tenki = tenki + 1
Else
kuiki = kuiki & "," & Range("C" & gyo).Value & "地区"
End If
Range("G" & tenki - 1).Value = kuiki
Next
End Sub
完成した時、自分では上手く出来たと思ったんですが、
小川先生のマクロと比較するとパッと見はすっきり見えるものの、
A列を1行進むごとにG列に担当区域を書き込んでいくのは
データ量が増えると処理が重くなったりするのだろうかと思ったりもしています。
小川先生からみてどうでしょうか?
> A列を1行進むごとにG列に担当区域を書き込んでいくのはデータ量が増えると処理が重くなったりするのだろうかと思ったりもしています。
> 小川先生からみてどうでしょうか?
そこは、まさに大きな問題です。
3万件とかのデータになると、パフォーマンスに大きく影響します。
なので、「最終的にセルに投入されているべき値を確定させてから、一回きり、値を投入する」というのが好ましいアプローチになります。
ご回答いただきありがとうございました。
> 今後、実務で活用していくことを考えると
そうですね。
ひきつづき、いろいろな書き方のバリエーションを学んでいってください (^^
システムからエクエルにデータを落とします。
2.この元データと入力済データを比較し異なっていたら
データを赤くする。
この2の段階をVBAで作りたいと思っています。
問題なのはこの中のtaikin1 とtaikin2 を比較する部分です。
単純に半日勤務課か一日勤務かなら問題はないのですが、
出勤時間が午前中で退勤時間が午後になる場合、
システムの仕様で退勤時間が12:00 になり
備考欄に文字列で退勤時間を入力するようになっています。
この午前・午後にわたる半日勤務のとき、
データが赤くなるときとならないと気が合って困っています。
この部分に★で印をつけてありますので
原因の説明と対処方法を教えてください。
こんばんは。
質問.txt をダウンロードしました。
ソースコードを
...
で囲ったものだけのようですが、このソースコードだけではわかりません。(★マークも見つけられませんでした)問題を再現できるなるべく小さいサイズのサンプルデータとプログラムを準備し、再現方法をお知らせください。
(このサンプルデータとプログラムの準備の過程で、ご自身で問題解決できるかもしれません)
実務に関するサポートは、以下のサポートポリシーに基づいて行います。
特に、「サポートの方法及び利用時の注意点について」の項目に注意してご利用ください。
https://www.exvba.com/support.php
よろしく、お願いいたします。
追記です。
> 問題を再現できるなるべく小さいサイズのサンプルデータとプログラムを準備
「なるべく小さいサイズ」にするのは、できる範囲でで構いません。
念のために(あとで質問をされる方のための参考という意味も含めて)書きますが、問題を再現できないサイズのプログラムになってしまう場合も、対応できません。
たとえば、以下のような、コードの断片しかないために、[F5]での実行ができないようなもののことです。
For gyo = 1 to 10
If kyukakubun1 <> kyukakubun2 Then
If kyukakubun1 <> "" And kyukakubun2 = "" Then
kyukakubun2 = kyukakubun1
Range("y" & gyo).Value = kyukakubun2
Range("y" & gyo).Font.Color = vbBlue '☆ここでの出力結果が気に入らないです
よろしくお願いいたします。
よろしくお願いします。
おまちしていますね (^^
> 元データと入力済みデータ、プログラムをつけて質問しなおします。
> よろしくお願いします。
もう一度送ります。
よろしくお願いします。
こんばんは。
ファイルを開いてみましたが拡張子 .xslx のファイルでマクロが入っていません。
問題を再現できるなるべく小さいサイズのサンプルデータとプログラムを準備し、再現方法をお知らせください。
よろしくお願いします。
まだよくわからないですが、
違っていたらまた言ってください。
キャリア、202010、業者,10と入れれば
プログラムがマクロがスタートします。
おはようございます。
> ファイルの送り方が違っていたみたいです。
そうではなくて、エクセルVBAに関する基礎的な知識が不足しているようです。
今回も、添付ファイルをダウンロードしてみたところ、拡張子 .xlsx のファイルでした。
拡張子 .xlsx のファイルにはエクセルマクロは含められません。
どのようなファイルの送り方をしたとしても、送ったファイルが .xlsx であれば、あなたの目的は成功するはずがありません。
ファイルを配布する前に、そのファイル単体での検査をしましょう。
また、以下の文章も、日本語として成立していませんね。
> プログラムがマクロがスタートします。
全体的に、投稿前の事前のチェックが甘いと感じます。
慎重に確認したうえでの再投稿、お待ちしています。
> ファイルの送り方が違っていたみたいです。
> まだよくわからないですが、
> 違っていたらまた言ってください。
> キャリア、202010、業者,10と入れれば
> プログラムがマクロがスタートします。
元データと入力済データは.slsxですけど・・・。
どのようにファイルを送れば
よろしいのでしょうか?
小川慶一さん:
> 受講生 さん:
>
> おはようございます。
>
> > ファイルの送り方が違っていたみたいです。
>
> そうではなくて、エクセルVBAに関する基礎的な知識が不足しているようです。
>
> 今回も、添付ファイルをダウンロードしてみたところ、拡張子 .xlsx のファイルでした。
>
> 拡張子 .xlsx のファイルにはエクセルマクロは含められません。
> どのようなファイルの送り方をしたとしても、送ったファイルが .xlsx であれば、あなたの目的は成功するはずがありません。
>
> ファイルを配布する前に、そのファイル単体での検査をしましょう。
>
>
> また、以下の文章も、日本語として成立していませんね。
>
> > プログラムがマクロがスタートします。
>
> 全体的に、投稿前の事前のチェックが甘いと感じます。
>
> 慎重に確認したうえでの再投稿、お待ちしています。
>
>
>
> > ファイルの送り方が違っていたみたいです。
> > まだよくわからないですが、
> > 違っていたらまた言ってください。
> > キャリア、202010、業者,10と入れれば
> > プログラムがマクロがスタートします。
こんにちは。
ダウンロードできたのは「10月業者_入力済データ(チェック用).xlsx」というファイルだけです。
そして、このファイルの中には、プログラムは見つかりません。
以下の動画で示したとおりです。
https://www.dropbox.com/s/bo6cz4an8bfzxvd/movie_210518_xlsx_only.mp4?dl=0
> 元データと入力済データは.slsxですけど・・・。
> どのようにファイルを送れば
> よろしいのでしょうか?
サポートのためには、問題を再現できるだけの情報が必要です。
プログラムが入ったファイルが必要なのはもちろんですが、プログラムが読み出す元データのあるファイル、プログラムが値を出力する書き出し先のシートがあるファイルが異なるようでしたら、それら2つも合わせて送付する必要があります。
つまり、この場合であれば、以下の、合計3点のファイルが必要です。
・プログラムが入ったファイル
・プログラムが読み出す元データのあるファイル
・プログラムが値を出力する書き出し先のシートがあるファイル
(本文末尾に【追記】あり)
複数ファイルを送付するための方法としては、たとえば、送付したいファイルをzip形式に圧縮してひとつのファイルにして送付するやり方が考えられます。
> マクロのエクセルは.slmxを送っています。
> 元データと入力済データは.slsxですけど・・・。
表記は正確に行うよう、十分に気をつけてください。
.slmx ではなく .xlsm 、.slsx ではなく .xlsx かと思います。
(もし本当に送付したファイルが拡張子 .slsx や .slmx のファイルだというなら別ですが、少なくともこちらでダウンロードできたファイルの拡張子は、 .xlsx でした)
前回も書きましたが、全体的に、投稿の準備に慎重さを感じられません。
最低限、投稿前に、自分が書いた文章全体を読み返しましょう。
たとえば、以下の点について、投稿前に再度チェックしましょう。
・使っている用語は正しいか?
・主語や述語、目的語が抜けていて、誤解を与える可能性のある文章になっていないか?
・「が」「を」「に」「の」「と」等の「助詞」を使い間違えて、文意の通らない文章になっていないか?
・文章全体で、言っていることに矛盾がないか?
こういうチェックをする習慣がないと、プログラムを書くとき/プログラムの内容を確認するときにも、チェックがどうしてもいい加減になってしまいます。
「マクロを書くことだけでなく、質問の投稿をすることも、マクロの練習になる」と思って取り組むと良いでしょう。
[参考] エクセルマクロ習得に関係する4つの能力
https://www.exvba.com/4skills.php#language
【追記】
より好ましくは、元データのあるシート、出力先のシート、プログラムを拡張子 .xlsm のひとつのファイルにまとめて送付することです。
さらに言えば、以下も考えられます。
くり返し述べている「問題を再現できるなるべく小さいサイズのサンプルデータとプログラムを準備」するということの例です。
・元データのあるシートで、関係ない情報を極力削除する
・元データと出力先を同じシートにまとめる
・くり返し作業で100件の元データを処理するマクロであれば、データのサイズを小さくして、元データの件数を10件程度に抑える
・問題の再現に必要なプログラム以外はすべて削除する。
「問題を再現できる最低限のサイズのサンプルを作る」というのは、問題解決のための重要な能力です。
やれる範囲でやってみてください。
こんにちは。
その後、いかがでしょうか。
困難を感じているところがあるようでしたら、相談してくださいね。
>受講生 さん:
>
>こんにちは。
>
>ダウンロードできたのは「10月業者_入力済データ(チェック用).xlsx」というファイルだけです。
>そして、このファイルの中には、プログラムは見つかりません。
>
>以下の動画で示したとおりです。
>https://www.dropbox.com/s/bo6cz4an8bfzxvd/movie_210518_xlsx_only.mp4?dl=0
昨日基礎編ベーシックを一度終えたのですが、理解に不安があったので、動画8から2週目を行いました。
問題11、12、16(一瞬悩んだ)、18(2)が、少し悩みながらの回答でしたが、初回のような頭から煙が出そうという状態にはならずに済みました。
昨日の時点では、18(2)は手を動かしても自力回答できる気がしなかったのですが。。。
本日再挑戦して見たところ、悩みつつも手を動かしていたらいつの間にか解けててびっくりしました。( ゚д゚)
こちらの4問は引き続き、時間を置いてから再挑戦しつつ、アドバンスドに進みたいと思います。
昨日は初めて、マクロを書いている夢を見ました。(⌒_⌒;
おはようございます。
マクロの演習は数学の文章題を解くのと似たようなところがあります。
例題は、「見た瞬間、計算問題のように勝手に手が動いて解ける」という状態になるまで練習するのが良いです。すると、実務で初見の課題に出くわしても不思議と解放が頭に浮かぶようになります。数学で基礎が定着していると模試や入試で文章題を解けるようになるというのといっしょです。
> 昨日は初めて、マクロを書いている夢を見ました。(⌒_⌒;
僕はこのところ実務では Python ばかり書いているのですが、この間は、ついに、 Python を書いている夢を見ました。
デバッグのときのPC操作までかなり鮮明でした。
エクセルマクロ覚えたてで毎日書くのが楽しくて仕方なかったときも、そんな夢は見なかったように思います...。
ひきつづき、よろしくお願いいたします。
案の定、アドバンスドでつまづいたので、ベーシックを最初から復習することにしました。(^^;
過去ログ見ると全体を2時間で解答している方もいるようで。(゜ロ゜)
自分はまだまだだと思いました。それでは行ってきます。。。(`・ω・´)
> たかちゃんさん:
>
> おはようございます。
>
> マクロの演習は数学の文章題を解くのと似たようなところがあります。
> 例題は、「見た瞬間、計算問題のように勝手に手が動いて解ける」という状態になるまで練習するのが良いです。すると、実務で初見の課題に出くわしても不思議と解放が頭に浮かぶようになります。数学で基礎が定着していると模試や入試で文章題を解けるようになるというのといっしょです。
>
>
> > 昨日は初めて、マクロを書いている夢を見ました。(⌒_⌒;
>
> 僕はこのところ実務では Python ばかり書いているのですが、この間は、ついに、 Python を書いている夢を見ました。
> デバッグのときのPC操作までかなり鮮明でした。
> エクセルマクロ覚えたてで毎日書くのが楽しくて仕方なかったときも、そんな夢は見なかったように思います...。
>
> ひきつづき、よろしくお願いいたします。
>
順調ですね。
基礎編ベーシックは、メチャメチャ重要です。上手な方ほどそうおっしゃいます。
楽しんでくださいね (^^*
その後、全体で3周復習。苦手な所は個別で何回か復習しました。
先程3周目を終えましたが、解答がパッと思いつくまでになりました。
ヽ(・∀・)ノ
Excel for MAC 2016 では、コードに日本語が含まれているとカーソルがづれて表示するという残念な仕様なんです。
お陰様で、早く解答できるようになったので、イライラして仕方がなかったです。(`△´)
VBA書くならWindowsのパソコンが良いですね。(最新のExcelで改善されているのかもしれませんが。。。)
これで自信を持ってアドバンスドに進めます。(^^)
> たかちゃんさん:
>
> 順調ですね。
> 基礎編ベーシックは、メチャメチャ重要です。上手な方ほどそうおっしゃいます。
> 楽しんでくださいね (^^*
こんにちは。
> その後、全体で3周復習。苦手な所は個別で何回か復習しました。
おー、早いですね!
> 先程3周目を終えましたが、解答がパッと思いつくまでになりました。
> ヽ(・∀・)ノ
> これで自信を持ってアドバンスドに進めます。(^^)
すばらしいです v(^^*
ひきつづき、お楽しみください☆
動画と同じような型の転記処理をしているのですが、
転記元は動画と同じ行数程あり、
転記先は10行の表が横にいくつも並んでる状態です。
10行目を終えるとまたすぐ隣の列の1行目から始めたいのですが、どのようにかけばうまくいくでしょうか?
ご教授頂くと幸いです。
発展編1で.Offsetプロパティというものを扱います。
Sub OffsetSample()
Range("A1").Offset(5, 0).Value = 1 'A1から見て5つ下
Range("A1").Offset(0, 3).Value = 2 'A1から見て3つ右
Range("A1").Offset(5, 3).Value = 3 'A1から見て5つ下の3つ右
End Sub
「所定の回数作業をしたら右に移動する」ということでしたら、やり方はいろいろありますが...。
たとえば、基礎編本編第1章で扱った「割り算の商と余り」を利用できます。
Sub WarizanShoAmari()
Dim hensu
Dim sho
Dim amari
For hensu = 0 To 100
sho = hensu \ 8
amari = hensu Mod 8
Range("A1").Offset(amari, sho).Value = hensu
Next
End Sub
> こんにちは。こんな時期なので、仕事にVBAすごく活用して評価されてます。ありがとうございます。
>
> 動画と同じような型の転記処理をしているのですが、
> 転記元は動画と同じ行数程あり、
> 転記先は10行の表が横にいくつも並んでる状態です。
> 10行目を終えるとまたすぐ隣の列の1行目から始めたいのですが、どのようにかけばうまくいくでしょうか?
> ご教授頂くと幸いです。
> ゲストさん:
>
> 発展編1で.Offsetプロパティというものを扱います。
>
>
Sub OffsetSample()
> Range("A1").Offset(5, 0).Value = 1 'A1から見て5つ下
> Range("A1").Offset(0, 3).Value = 2 'A1から見て3つ右
> Range("A1").Offset(5, 3).Value = 3 'A1から見て5つ下の3つ右
> End Sub
> > 「所定の回数作業をしたら右に移動する」ということでしたら、やり方はいろいろありますが...。
> たとえば、基礎編本編第1章で扱った「割り算の商と余り」を利用できます。
>
>
Sub WarizanShoAmari()
> Dim hensu
> Dim sho
> Dim amari
> For hensu = 0 To 100
> sho = hensu \ 8
> amari = hensu Mod 8
> Range("A1").Offset(amari, sho).Value = hensu
> Next
> End Sub
> >
> > こんにちは。こんな時期なので、仕事にVBAすごく活用して評価されてます。ありがとうございます。
> >
> > 動画と同じような型の転記処理をしているのですが、
> > 転記元は動画と同じ行数程あり、
> > 転記先は10行の表が横にいくつも並んでる状態です。
> > 10行目を終えるとまたすぐ隣の列の1行目から始めたいのですが、どのようにかけばうまくいくでしょうか?
> > ご教授頂くと幸いです。
>
大変ありがとうございます。
頂いた回答からで恐縮ですが例えば、現在の動画の式、
Sub createlist2()
Dim hida
Dim migi
Dim tiku
migi = 2
For hida = 2 To 27
If Range("A" & hida - 1).Value <> Range("A" & hida).Value Then
Range("E" & migi).Value = Range("A" & hida).Value
Range("F" & migi).Value = Range("B" & hida).Value
If migi > 2 Then
Range("G" & migi - 1).Value = Mid(tiku, 2)
End If
tiku = ""
migi = migi + 1
End If
tiku = tiku & "," & Range("C" & hida).Value & "地区"
Next
Range("G" & migi - 1).Value = Mid(tiku, 2)
End Sub
で6行目の【都城産業】から
隣の列に移動したいのですが、頂いた下記のoffsetを使う式のところで8を6に変えるというところまでは分かったのですが、この式を上記の式にどう挿入していいかで、行き詰まっています。
お時間のある時で、なんとかご回答お願いできたらと思います。
長文で大変申し訳ございません。
Sub WarizanShoAmari()
Dim hensu
Dim sho
Dim amari
For hensu = 0 To 100
sho = hensu \ 8 →6に変える
amari = hensu Mod 8 →6に変える
Range("A1").Offset(amari, sho).Value = hensu
Next
End Sub
おはようございます。
試しに適用してみるにはこのページで紹介している課題では複雑過ぎです。
もっと簡単な課題でまずは試してみてください。
このため、エディタの書式タブで、左右の間隔や上限の間隔を調整しようとしても、入力できません。プログラムは書式の設定ができないのでしょうか。
テキストエディタに貼りつけて印刷するのがおすすめです。
(もっとも、慣れてくると、印刷の必要を感じることも減ってくるかな、とは思います)
> プログラムの印刷を行う場合に、左端一ぱいのところから印刷されて、大変見にくし、ファイルリングに穴をあけると、左端が見えなくなります。
> このため、エディタの書式タブで、左右の間隔や上限の間隔を調整しようとしても、入力できません。プログラムは書式の設定ができないのでしょうか。
結果、3度復習したことになりましたが、マクロが思ったような動きにならない場合でも慌てずに修正できるようになり、ベーシックレベルの変数の考え方・使い方は完全に整理できたと思います。最初のころを考えると信じられません。
また3度目の復習ではなんとかベーシックのマクロを2時間程度で組めるようになりました。再度、アドバンスドにチャレンジします。
> また3度目の復習ではなんとかベーシックのマクロを2時間程度
は、全ての課題という意味です。読み返したら誤解を受ける怖れががあると思ったので、追記しました。
> フォローアップアドバンスドでつっかかったので、ベーシックが本当にすらすらできるか不安になり、再復習しました。
> 結果、3度復習したことになりましたが、マクロが思ったような動きにならない場合でも慌てずに修正できるようになり、ベーシックレベルの変数の考え方・使い方は完全に整理できたと思います。最初のころを考えると信じられません。
> また3度目の復習ではなんとかベーシックのマクロを2時間程度で組めるようになりました。再度、アドバンスドにチャレンジします。
こんにちは。
>結果、3度復習したことになりましたが、マクロが思ったような動きにならない場合でも慌てずに修正できるようになり、ベーシックレベルの変数の考え方・使い方は完全に整理できたと思います。最初のころを考えると信じられません。
こういうの大事です。
手元がしっかりしていればいるほど、応用問題を解くときに頭が高度な思考だけに集中できるようになります (^^
全体を2時間なら、なかなか早いほうかと思います。
今、「基礎編マラソン」というコンテンツを作っています。各課題の回答時間を登録して、その合計でランキングをつける、というものです。できあがったらご案内します。
これは、、、難しい!初期化、変数を増やすタイミング、for next構文の最初と最後の処理、条件分岐等。。。まだ身についていないところの総復習が必要と感じた。
まずはフォローアップ ベーシックを1周できました。わかりやすい講義をありがとうございました!!!
くり返しましょう!
すべてスラスラ解けるところまで!
> [感想]
> これは、、、難しい!初期化、変数を増やすタイミング、for next構文の最初と最後の処理、条件分岐等。。。まだ身についていないところの総復習が必要と感じた。
>
> まずはフォローアップ ベーシックを1周できました。わかりやすい講義をありがとうございました!!!
Sub XXX()
Dim kuiki
Dim gyosha
gyosha = 1
Dim gyo
For gyo = 2 To 27
If Range("A" & gyo - 1).Value <> Range("A" & gyo).Value Then
gyosha = gyosha + 1
Range("E" & gyosha).Value = Range("A" & gyo).Value
Range("F" & gyosha).Value = Range("B" & gyo).Value
kuiki = Range("C" & gyo).Value & "地区"
Else
kuiki = kuiki & "," & Range("C" & gyo).Value & "地区"
End If
If Range("A" & gyo).Value <> Range("A" & gyo + 1).Value Then
Range("G" & gyosha).Value = kuiki
End If
Next
End Sub
-------------------------
今回の2つ目の問題を↑のように解いてから動画を見ました。
このマクロであれば最初と最後の処理を必要としないので良いような気もするのですが、なんとなく格好が悪い気もします。
最初と最後の処理をするマクロを自分で導くのは正直自分には難しそうと尻込みしてしまいますが、自分で導くためのプロセスを順を追って動画で紹介して下さっているので、とても勉強になりました。何回もこの動画を見直して練習したいと思います。
まずは、自力で考えて解けたということはすばらしいです☆
このやり方もパターンなので、マスターされると応用範囲広いです。
ご提示のコードだと、たとえば100万行のデータだとしたら、条件分岐が200万回生じますね。
そのロスをどう解釈するか?です。
時間がかかっちゃいました。別にさぼってたわけでないのですが、歴史の勉強のようにざっと一通りしてみてというのがイヤで時間がかかってもじっくりしたいので予定より大幅に遅れましたが、後半もこだわってこだわってやっていきたいです。変なvbaスクールにいってた時期があり、いまさらですがほんとお金を含め無駄でした。はやくこのサイトを探しだせればよかったんですが。。。
ボヤいても仕方ないのでまたつづきがんばります。
改めまして、前半終了おめでとうございます v(^^*
時間 <<< じっくり楽しむ
という方針で取り組まれていた、ということですね。
よいようにお楽しみください。僕としては、楽しみつつ、スキルアップも実感しつつ、としていただいているのであれば、それでよいかと思います。
> やっとやっと基礎フォローアップも前半が終わりました。
> 予定より時間がかかっちゃいました。
> 別にさぼってたわけでないのですが、歴史の勉強のようにざっと一通りしてみてというのがイヤで時間がかかってもじっくりしたいので予定より大幅に遅れましたが、後半もこだわってこだわってやっていきたいです。
> 変なvbaスクールにいってた時期があり、いまさらですがほんとお金を含め無駄でした。
> はやくこのサイトを探しだせればよかったんですが。。。
> ボヤいても仕方ないのでまたつづきがんばります。
まずはおつかれさまです v(^^*
>あまり共通なコードを変数に置き換えが苦手
いずれ、そこの考え方&手作業のパターンをしっかりできるようになっていないと太刀打ちできないより高度な問題がでてきます。
そこは「苦手だ」て言ってられませんので、しっかりマスターしてください。
ここのでの演習すべて、「共通なコードを変数に置き換える」ということを意識して再復習されることを強く推奨します。
すでにコメントいただいているとおり、ここまでの問題だけでも、実務でも相当活用できる演習をご提供しています。
ですし、より高度な課題を解けるようになるためのプロセスとしても、結果としてそのほうが近道になるかと思います。
> 何とか自分の今までの知識と浅い経験(あまり共通なコードを変数に置き換えが苦手)でたどり着きました。(tiku=,,,と置き換えするのがつい「なぜ置き換えたんだろう???そのまま長がったらしくコードかけば行けるはずだ??!!と深みに落ちてしまって)。ともあれ自分が次回似たようなケースでコードを作り上げれたらいいなってところです。何度も紙に書きました。f8で動きも見ました。道中過程ほんとにイヤになるものですが、解消したらまずはホッとするもんですね。
>でも、、、使っている知識は高級なものでなく基礎編の範囲ですからね。
>ここは地道なランニングと思いがんばります。
ですね。
ここで腕力しっかりつければ、あとはどれも似たようなものに見えるかと思いますよ。
発展編1受講生限定グループに最近参加された方のコメントを紹介します。
>はじめまして、本日グループに参加いたしました????。
>5月に基礎編を購入し、先月末に発展編1を申し込み現在学習中です。
>
>基礎編を「う~んうん????」言いながら学んだ割りに、発展編はスムーズな感じがしていて、どんなことができるようになるか楽しみです。
>どうぞよろしくお願いいたします。
↑morimotoさんも、そんなプロセスの真っ最中かもしれません。
このページのコメントNo.566, No.567をご確認ください。
↓以下は、くり返し構文の典型的なパターンの集合ですね。
・ループ冒頭での明示的な変数の初期化
・最初だけ特殊な作業(今回は、作業をスキップ)
・ループを抜けた直後に特殊な作業
↓こうとも言えるかも。
For
If
If ループの最初じゃなかったら
直前までのデータ追記処理の後始末
データ追記先変更などなど
End If
End If
データ追記処理
Next
直前までのデータ追記処理の後始末
上記の視点を意識しつつ、改めてマクロを自分で書いてみたり、他のみなさんの投稿やそれらへのフィードバックも読み返したりしてみてください☆
> 2日考えましたが解決に至りませんでした。できそうでできないという感じでした。tiku="" やif migi>2 と例外が生じたとき例外処理をするという考えは大切にしたいと思います。実務ではおそらく教科書的なきれいに収まるコードになることはむしろ少ないかもしれませんので、おかしなときは例外処理と頭の隅に置きながた、他のコメント等みさせてもらい、もう一回コード書こうと思います。でも、、、使っている知識は高級なものでなく基礎編の範囲ですからね。ここは地道なランニングと思いがんばります。
Sub mondai2()
Dim hida
Dim migi
Dim Kuiki
migi = 2
For hida = 2 To 27
If Range("A" & hida).Value <> Range("A" & hida - 1) Then
Range("E" & migi).Value = Range("A" & hida).Value
Range("F" & migi).Value = Range("B" & hida).Value
Kuiki = Range("C" & hida).Value & "地区"
Range("G" & migi).Value = Kuiki
migi = migi + 1
Else
Kuiki = Kuiki & "," & Range("C" & hida) & "地区"
Range("G" & migi - 1).Value = Kuiki
End If
Next
End Sub
重複した業者名が続くと『区域』を毎回書き直すのがカッコワルイと感じてはいますが、最初と最後の特殊な制御は不要になるので、メンテナンスはしやすく、これはこれでアリなのではと思っています。一方、処理が重くなったり遅くなったりするというデメリットもあるかも知れないのですが・・・どうでしょうか。
> 重複した業者名が続くと『区域』を毎回書き直すのがカッコワルイと感じてはいますが
> 最初と最後の特殊な制御は不要になるので、メンテナンスはしやすく、これはこれでアリなのではと思っています。
↑
デメリットをふまえたうえで、メリットもあるということですね。
とても建設的な意見かと思います。
上記デメリットが強調される局面もありえます。
[a] カッコワルイ
[b] 工数が多い(変数に値を格納する、変数の値を読み出す、より、セルに値を入れる、セルの値を読み出すことのほうが高コストです)
なので、両方のやり方をできるようになれればよりよいです。
というか、「最初と最後の特殊な制御」は、パターンなので、ここでマスターしておかないと、先々行き詰まります。ので、できればしっかりマスターしておきたいところ。
なお...。 [a] はメリットにもなりえます。
マクロ初心者に「ホラホラ!」と言いつつマクロが動作している様子を見せるときには、どんどんセルの値が更新されるほうがキャッチー なので(^^;
今回は「担当区域」を先に考えてやりました。以前に動画を見たときに、確か、migi=2 とか使ってたな、と思って進めていくと、途中で、自分の書き方だとmigi=1でないとうまくいかないと思ったり、あとから「業者名」「フリガナ」を入れたので、『"e" & migi』には1を足さないとダメだな、など、動かしながらやってると、特に意図もなく、1を足してみたり引いてみたりして、結果的に答えにはたどりついています。
例えば、E~G列は、2行目から始まるので、migi=2とするのが通常かなと思います。しかし、意図せず1を足したり引いたりして結果に結び付けばよいのでしょうか?自分が書いたあと、もう一度動画を見ると、自分のはなんだか不格好だなと思います。
初心者のうちは、このような形でもよいのでしょうか?
Sub ren()
Dim hida
Dim tiku
Dim migi
migi = 1
For hida = 2 To 27
If Range("a" & hida).Value <> Range("a" & hida - 1).Value Then
Range("e" & migi + 1) = Range("a" & hida).Value
Range("f" & migi + 1) = Range("b" & hida).Value
tiku = Range("c" & hida) & "地区"
migi = migi + 1
Else
tiku = tiku & "," & Range("c" & hida).Value & "地区"
End If
Range("g" & migi).Value = tiku
Next
End Sub
おはようございます。
まず...。
>動かしながらやってると、...結果的に答えにはたどりついています。
↑
こういうことをやりきれる力は、とても重要です。実務ではそういうことのくり返しです。
そのうえで...。
> 例えば、...migi=2とするのが通常かなと思います。もう一度動画を見ると、自分のはなんだか不格好だなと思います。
↑
ということでしたら、もう一度何も見ないでやってみましょう (^^
慣れてくると、一発で最大効率のマクロを書けるようになります。
基礎編フォローアップは、重要パターンをほぼほぼ網羅しています。
何周もくり返していただいて構いません。
以下に、「パソコン仕事5倍塾」塾生からの投稿を転載します。
マクロでの効率化により、会社に数十億円規模の売上アップに貢献した方のものです。参考にしてください。
>ポータルサイトではご無沙汰です。
>東京クラスの○○です。
>久々のサイトを覗いてみたらすごい投稿になっていますね!
>
>近況というか日々の報告ですが、workは毎日続けてます。
>会社の帰りは、電車に座れた時は基礎編フォローの問題をひたすら解いてます。
>皆さんより早く基礎編を終了した人間の感想としては、基礎編を勉強し始めて半年で感じたのは「身に付いたな~」でした。
>そして、ここ数ヶ月で感じるのは「染み付いたな~」という感覚です。
>
>△△さんも似たようなことを書いていたかな?(実際書いてなかったらごめんなさい)
>問題を見る⇒完成形が想像できる⇒コードが想像できる⇒あまり迷いが無くコードがかけるようになる
>
>そうすると、実際の業務で「あ~これ あの問題に似てるな~」と応用が利くようになりました。
>
>基礎編は本当に「重要」というより「もんげー役に立つ」ものです。
>
>私も会社でちょくちょくマクロを書いて、いわゆる「業務改善」というものをやっています。
>ちょくちょくそのマクロを報告していきたいと思います。
・for next 構文で気をつけることは、データのはじめと終わりに
自分の求める処理がされているか。
・失敗しながら何度もやってみる。
成功者ほどたくさん失敗している!byドラッカー
「ループの前や後に特定の処理を入れる」というのは、よくあるパターンです。
> これまでの複合技!
> ・for next 構文で気をつけることは、データのはじめと終わりに
> 自分の求める処理がされているか。
> ・失敗しながら何度もやってみる。
> 成功者ほどたくさん失敗している!byドラッカー
添削と返信ありがとうございました。
(コメント:8489)
インデントも気をつけたいと思います。
ひきつづき、お楽しみください☆
> 小川先生
>
> 添削と返信ありがとうございました。
> (コメント:8489)
> インデントも気をつけたいと思います。
問題ありませんでしょうか。
発展編で出てくるDebug.Printでtikuの中身の様子も確認済です。
Sub Createlist01()
Dim hida
Dim migi
Dim tiku
migi = 2
For hida = 2 To 27
If Range("A" & hida - 1).Value <> Range("A" & hida).Value Then
Range("E" & migi).Value = Range("A" & hida).Value
Range("F" & migi).Value = Range("B" & hida).Value
If migi > 2 Then
Range("G" & migi - 1).Value = Mid(tiku, 2)
Debug.Print tiku
tiku = "" '[※]
Debug.Print tiku
End If
migi = migi + 1
End If
tiku = tiku & "," & Range("C" & hida).Value & "地区"
Next
Range("G" & migi - 1).Value = Mid(tiku, 2)
End Sub
おもしろいですね。
見本では、発展編1で学ぶ「変数の初期化」をあえてしているというニュアンスです。
ご提案いただいたやり方だと、変数の値を""にする処理の回数が1回少ないです。
どっちが良いか微妙なところです。
それぞれニュアンス、メリットが異なります。
next の手前の以下は、もう一段右にインデントしてください。
tiku = tiku & "," & Range("C" & hida).Value & "地区"
現在、エクセルマクロ・VBA基礎編フォローアップ を学習していますが、6月末でキャンペーン終了ということなので、不安すぎて、まだ基礎編フォローアップに苦戦しながらも、先走り発展編1を購入しましたが、いつになれば取り掛かれるのかわかりません。
でも、少しずつでは、ありますが毎日学習を進めていっています。
現在、基礎編フォローアップ動画18の問題2で戸惑っています。
問題1は理解できたのですが、IF文の中のtiku=””の意味が、まったく理解できずに、マクロを書くことができません。
何度も間違っても、うまくいきません。
> 現在、基礎編フォローアップ動画18の問題2で戸惑っています。
> 問題1は理解できたのですが、IF文の中のtiku=””の意味が、まったく理解できずに、マクロを書くことができません。
> 何度も間違っても、うまくいきません。
>
4:28ごろ、上手くいかない例を示していますね。
ここまでは、どういう問題が起きているのか、理解できていますか?
以下のようになってしまっていますね。
セルG2: G2に書かれるべき値
セルG3: G2, G3に書かれるべき値 (G2に記入した分が余計)
セルG4: G2, G3, G4に書かれるべき値 (G3に記入した分が余計)
セルG5: G2, G3, G4, G5に書かれるべき値 (G4に記入した分が余計)
セルG6: G2, G3, G4, G5, G6に書かれるべき値 (G5に記入した分が余計)
...
この「書かれるべき値」を入れているのが変数tikuです。
であれば、どうすべきか?
各行での情報を記入する処理を終えたら、変数tikuの値を""にすればよいわけです。
そのタイミングで、
tiku=""
していますね。
こういう風に変数の値を自分で宣言直後の状態に戻することを、「初期化」と言います。
では、「各行での情報を記入する処理を終えたタイミング」とはいつか?というと、それは、以下の[1], [2]の処理をした直後、となります。
[1] 左の表で、前後の値が異なっていたことを検知した
[2] 最後のデータ入力を終えた
まずは、この説明でどうでしょう。
変数の初期化は、以下の問題の回答でもやっています。
以下は、スラスラ解けますか?
https://forum.pc5bai.com/lesson/page/150
あと、
> 問題1は理解できたのですが、
というのが、多少不安です。
「理解できた」だけの蓄積だといずれひっかかります。「問題を見た瞬間、勝手に手が動いて、ほとんど頭を働かさなくても勝手に解ける」というくらいまで練習してください。
先の問題が「理解できない」状況は、たいてい、前の問題での学びを「理解できた」程度の学習でとどめていることによって起こります。
数学でも、期末試験で間違えた問題があったとして、黒板で先生が解説したのを見て「理解した」と思っただけの人は、模試や入試で同じ問題が出た時に必ず間違えます。そのときに解けるようになっている人は、手に馴染むまで復習した人です。
見当違いかもしれませんが、あとあと他の方がこのやりとりを見たときに参考になるようにという意味もこめて、あえて以上書いてみました。
他の受講生の方のコメントもいろいろ参考になると思いますよ。
このページ内なら、たとえば以下:
>3858 : 佐藤 あゆむさんのコメント (2015-02-17 07:40:17)
>9回目から復習をしてきて18回目まで戻ってきました。
>それでも書くのに悩んだ12回と18回は、また復習しますヽ(*´v`*)ノ
>3827 : 小川慶一の回答 (2015-02-13 06:38:57)
>匿名 さん:
>
>For Next構文の入りにそれが初回処理かどうか判断して条件分岐するというのは常道です。
>これもパターンなので、第17回で紹介したやり方と対にして覚えます。
>
>>もう一度、最後の方の難しかったところを観てから、次の「発展編1」に進もうと思います。
>
>素晴らしいです。絶対正解です。
>
>知識に触れることをむやみに追うより、体得するプロセスを重視したほうが近道です。
>3784 : 佐藤 あゆむさんのコメント (2015-02-09 08:00:07)
>今回は2日間粘って[2]を完成させました。
>2635 : 浜口 智之さんのコメント (2014-10-04 19:13:14)
>今までの回で、書いていく中で、色々試して失敗しましたが、その失敗の方法が今回使えたりと、たくさん失敗する意義を感じる最終回でした。
>今の頭の状態で、もう一度、第一回目から、新たな発見と知識の定着のため、マクロを書いてみようと思います。
>566 : 池本利恵さんのコメント (2013-04-30 00:00:00)
>こんにちは~☆
>
>完走できました~♪
>嬉しいです~(*^^*)
>
>問題1は簡単でしたが、問題2は昨日からたくさん書いて書いて失敗しまくりました(^^;
>動画をみてからは、先生とおなじように1個ずつ動かして、自力でできるまで何回も書きまくりましたo(^^)o
>先生と同じように書いているうちにわかってきました。
>というか、書かないとわかんないし、書いたほうがはやいですね。
>
>自力でいろいろやってみて、
>問題1の2行部分のマクロ(の変数と仕掛け)を活用したほうがいいということにはなったけれど、
>
>問題1の仕掛けで上と行が違ったらどうする、という部分と、上の行と違わなくてもデータをひろって並列したいという部分をどうやって両立させるのかがわからなかったです。わからないなりに書いていると、そこは考えなくても両立してて、上の行と違わないときにデータをひろってきているらしい。でも、いらないデータもひろってくるらしい、1行とぶらしい、というところまでいきました。
>
>なので動画をみて、同じマクロをかいたら、考え方がすんなり頭に入りました(^^)
>
>・ひろってきたいデータの重複をさけるために、
> データをいれたあとにchiku = ""
>・1行ずれるから -1
>・でも開始したい一番上の行が2ならそれが-1になってしまって、開始したい行の上まで影響するから if文で2>
>・最後たりないからfor next構文のあとにもう一回加える
>
>この4つ、かなりおもしろかったです。
>そうふうにいろいろ試すんだな~と、パターンというより考え方を学びました。
>563 : 星野智幸さんのコメント (2013-03-20 00:00:00)
>2月に受講した星野です。
>フォローアップセミナー完走できました。ホッ。
>見ないでやれるようになったら、素敵なので、二周目はじめました。
>一周目は、自分で1時間くらい考えてから解答を見て、実際やってみるというパターンでやりました。ただ、独力でできた問題は少なかったことは悔しかったです。
>559 : 山根信行さんのコメント (2013-02-08 00:00:00)
>最終回でこんな難題とは。
>2問目は解けませんでした。
>解説動画見るとおしいとこまでいってたのにそのあとさらにぐちゃぐちゃにしてしまいました。
>変数=""を入れてれば解けてたのに悔しいです。
>
>悔しいのでこのパターンを10回書いて寝ます。
>557 : 佐藤 尚子さんのコメント (2012-12-30 00:00:00)
>やっと2週目ができました!
>この№.18も何をやっているかわかって(^_^;
>ホッとしました。
>「理解してから書こうとするより、何度も書いて失敗しながら進んでいく方が早い」との話があり、その通りだと思いつつも、解らないとそこで書くのをやめてしまいそうになるので、もしまた解らないと思ったら、前に戻ってやり直しつつ進めていきたいと思いました。
>550 : 加藤美智子さんのコメント (2012-11-07 00:00:00)
>問題[2]の「担当区域」を正解になるよう色々にやって見る!(動画を見た後でしたが…(~_~;))
>やって見ると色々発見がありました。
>何度もやってみたいと思いました。
>1218 : 受講生さんのコメント (2012-09-09 17:10:00)
>基礎編の総まとめのような感じでした。
>ものづくりと同じ考え方なんだと納得した次第です。小川先生の書きながら考える姿勢を動画で見ることができたのが最高に参考になりました。
【基礎編フォローアップ動画18の問題2で戸惑っています。
> 問題1は理解できたのですが、IF文の中のtiku=””の意味が、まったく理解できずに、マクロを書くことができません。
> 何度も間違っても、うまくいきません。】と質問をしました。
先生の回答で下記のことが、凄くわかりやすいのですが、
先の問題が「理解できない」状況は、たいてい、前の問題での学びを「理解できた」程度の学習でとどめていることによって起こります。
数学でも、期末試験で間違えた問題があったとして、黒板で先生が解説したのを見て「理解した」と思っただけの人は、模試や入試で同じ問題が出た時に必ず間違えます。そのときに解けるようになっている人は、手に馴染むまで復習した人です。
現在、何度も繰り返し復習をしていますが、初期化のsumifの編でやったことも繰り返しやっています。
この学習方法は的を得ているのでしょか?
> お世話になります。
> 先生の回答で下記のことが、凄くわかりやすいのですが、
ありがとうございます。
> 先の問題が「理解できない」状況は、たいてい、前の問題での学びを「理解できた」程度の学習でとどめていることによって起こります。
> 数学でも、期末試験で間違えた問題があったとして、黒板で先生が解説したのを見て「理解した」と思っただけの人は、模試や入試で同じ問題が出た時に必ず間違えます。そのときに解けるようになっている人は、手に馴染むまで復習した人です。
>
> 現在、何度も繰り返し復習をしていますが、初期化のsumifの編でやったことも繰り返しやっています。
> この学習方法は的を得ているのでしょか?
僕が上で書いたことを箇条書きにしますね:
・「理解できた」程度の学習でとどめていては不十分です。
・手に馴染むまで復習することが大切です
受講生さんがやっていると言われていることを箇条書きにしますね:
・この問題を何度も繰り返し復習をしている
・初期化のsumifの編でやったことも繰り返し復習している
上記2つを比較すると、僕と受講生さんとは、違うことを言っているということに気づけますね。
上記を比較すると分かることは、以下のとおりです。
僕は「手に馴染むかどうか」を判断基準にしている。一方、受講生さんは、「繰り返しているかどうか」は基準になるか?と質問している。
よって、「この学習方法は的を得ているのでしょうか?」という問いへの答えは「いいえ」です。
くり返さなくても、手に馴染んだならばOKです。
一方、手に馴染まないならば、何度繰り返しても意味はありません。手に馴染んだかどうかだけを判断基準にしてください。ある問題を繰り返しても手に馴染まないならば、何かを変える必要があるでしょう。例えば、繰り返し方を変える。あるいは、もっと基本的な問題からやりなおす(前の問題での学びを「理解できた」程度の学習でとどめていないか?の確認をする)、等々。
先生が回答くださった内容ですが、以前に舞い戻って、復習をしています。【ある問題を繰り返しても手に馴染まないならば、何かを変える必要があるでしょう】ということなのですが、立ち戻って、前の問題をやってみると、
変数の宣言のところが、出来ない状態や、全く思いつかない状況のところが、あります。何に、フォーカスすればいいのか、前途多難です。
【くり返さなくても、手に馴染んだならばOKです。
一方、手に馴染まないならば、何度繰り返しても意味はありません。手に馴染んだかどうかだけを判断基準にしてください。ある問題を繰り返しても手に馴染まないならば、何かを変える必要があるでしょう。例えば、繰り返し方を変える。あるいは、もっと基本的な問題からやりなおす(前の問題での学びを「理解できた」程度の学習でとどめていないか?の確認をする)、等々。】
結局、理解できた程度だということは、わかるのですが・・・・
> 変数の宣言のところが、出来ない状態や、全く思いつかない状況のところが、あります。何に、フォーカスすればいいのか、前途多難です。
> 結局、理解できた程度だということは、わかるのですが・・・・
8430でコメントしたとおりです。
「何に、フォーカスすればいいのか」ということですので、改めて、書きますね。
フォーカスすべきことは、「手に馴染んだか」どうかだけです。
そこだけを意識して、「問題を見た瞬間、勝手に手が動いて、ほとんど頭を働かさなくても勝手に解ける」というくらいまで練習してください。
容易に暗唱できる「かけ算九九」くらいまで。
> 変数の宣言のところが、出来ない状態や、
↑
「問題を見た瞬間、勝手に手が動いて、ほとんど頭を働かさなくても勝手に解ける」という状態にないですね。
「容易に暗唱できるかけ算九九」にはまだ遠いですね。
ですから、手を動かして、勝手に解けるようになるまで練習してください。
> 全く思いつかない状況のところが、あります。
↑
もっと前の問題を「問題を見た瞬間、勝手に手が動いて、ほとんど頭を働かさなくても勝手に解ける」状態にしていることが大前提です。
そのうえで、解説なんども見て、何度も手を動かして実際に書いてください。
誰かに教えるつもりで自分に説明してみるというのも良いですよ。
人に説明しようしてみると、何が分からないのか、何が曖昧になったままなのか、自分でよく分かります。
この度の返信をいただいた内容を、真摯に受け止めて、
努力していくことといたします。
まだまだ、掛け算の九九の域には到底達していないので、
努力が全く足りていないことを痛感いたしました。
フォーカスする点を見つけることが、できました。
どうも的確なコメント、アドバイス有難う御座いました。
当初、僕がこのページでしたコメント8430に戻ります。
「他の受講生の方のコメントもいろいろ参考になると思いますよ」ということで、過去の受講生の挑戦の記録を示しました。
マクロ上達するには、あとは、実務でガンガン書くことですね。
1月もしっかりやればかなり変わります。応援しています☆
先刻 「音声が聞き取れないと」送信しましたが 私の不注意が原因でした。大変お騒がせして申し訳ありませんでした。
いま確認していますが、特に他のものと音声の大きさ違うようには感じられませんね。
お使いのPCやスマートフォンの設定、あるいは、再生画面で設定できる音量の問題かもしれません。いかがでしょう?
>動画その18の音声が小さくて聞き取れなのですが、大きくならないのでしょうか?
まさに今回私が作ったプロセスそのものだったので、こうやって試行錯誤していけば
いいんだな、ということです。
私もまず何かが目標セルに入るところから始まり、少しずつ修正していきました。
午前中あげたものも、どうしてこれならうまくいくのかよくわからないけど
結果をみるとうまくいった!みたいな感じでした。
(つまり、いろいろ分かっておりません(笑))
要求度の高い問題なので、繰り返し挑戦して、覚えていきたいと思いました。
午前中UPしたコードには無駄な行がありましたので、修正を加え、私の完成形は
以下のようになりました。
先生のと少し違うのですが、結果はうまくいっているのでいいのかな(*´∀`*)
A列が重複データでないときは、左のリストは1行下に記述され、
重複データのときは、左のリストは変数kuikiに追加格納されていく
という方法です。
Sub rensyu032904()
'第18問の[2]解答 K列含む
Dim gyo '元データ行位置
Dim gyosya '作成リストの行位置
gyosya = 1
Dim kuiki '区域を格納する変数
For gyo = 2 To 27
If Range("A" & gyo - 1).Value = Range("A" & gyo).Value Then
kuiki = kuiki & "," & Range("C" & gyo).Value & "地区"
Range("G" & gyosya).Value = kuiki
ElseIf Range("A" & gyo - 1).Value <> Range("A" & gyo).Value Then
gyosya = gyosya + 1
Range("E" & gyosya).Value = Range("A" & gyo).Value
Range("F" & gyosya).Value = Range("B" & gyo).Value
kuiki = Range("C" & gyo).Value & "地区"
Range("G" & gyosya).Value = kuiki
End If
Next
End Sub
by gooskaお返事遅くなりました。そして、今改めてコードを読んでみるとどうでしょうか。
K列は模索中です。考える訓練に、もう少し自分で考えてみます。
明日の大事な要件のため、今日はこれまでにします。
またよろしくお願い致します。
Sub rensyu0328018()
'第18問の[2]解答,I,J列のみ
Dim gyo '元データ行位置
Dim gyosya '作成リストの行位置
gyosya = 2
For gyo = 2 To 27
If gyo = 2 Then
Range("E" & gyosya).Value = Range("A2").Value
Range("F" & gyosya).Value = Range("B2").Value
gyosya = gyosya + 1
ElseIf Range("A" & gyo - 1).Value <> Range("A" & gyo).Value Then
Range("E" & gyosya).Value = Range("A" & gyo).Value
Range("F" & gyosya).Value = Range("B" & gyo).Value
gyosya = gyosya + 1
End If
Next
End Sub
by gooska試行錯誤して、なんとか目標値を得られるコードになりました。
一部上書き処理しているなど、直しどころ満載だと思いますが
K列はちゃんと出たようなので、最初のステップクリアかな(;´・ω・)
今はこれ以上直す時間がないため、夜に動画で模範解答を拝見しようと思います。
Sub rensyu032903()
'第18問の[2]解答 K列含む
Dim gyo '元データ行位置
Dim gyosya '作成リストの行位置
gyosya = 2
Dim kuiki
For gyo = 2 To 27
If gyo = 2 Then
Range("E" & gyosya).Value = Range("A2").Value
Range("F" & gyosya).Value = Range("B2").Value
Range("G" & gyosya).Value = Range("C2").Value & "地区"
ElseIf Range("A" & gyo - 1).Value = Range("A" & gyo).Value Then
Range("E" & gyosya).Value = Range("A" & gyo).Value
Range("F" & gyosya).Value = Range("B" & gyo).Value
kuiki = kuiki & "," & Range("C" & gyo).Value & "地区"
Range("G" & gyosya).Value = kuiki
ElseIf Range("A" & gyo - 1).Value <> Range("A" & gyo).Value Then
gyosya = gyosya + 1
Range("E" & gyosya).Value = Range("A" & gyo).Value
Range("F" & gyosya).Value = Range("B" & gyo).Value
kuiki = Range("C" & gyo).Value & "地区"
Range("G" & gyosya).Value = kuiki
End If
Next
End Sub
by gooskaまた動画見て思うことあれば、どうぞ。
お待ちしております。
>前回のカンマ区切り形式の応用がカギですね。
試行錯誤して、なんとか目標値を得られるコードになりました。
一部上書き処理しているなど、直しどころ満載だと思いますが
K列はちゃんと出たようなので、最初のステップクリアかな(;´・ω・)
今はこれ以上直す時間がないため、夜に動画で模範解答を拝見しようと思います。
Sub rensyu032903()
'第18問の[2]解答 K列含む
Dim gyo '元データ行位置
Dim gyosya '作成リストの行位置
gyosya = 2
Dim kuiki
For gyo = 2 To 27
If gyo = 2 Then
Range("E" & gyosya).Value = Range("A2").Value
Range("F" & gyosya).Value = Range("B2").Value
Range("G" & gyosya).Value = Range("C2").Value & "地区"
ElseIf Range("A" & gyo - 1).Value = Range("A" & gyo).Value Then
Range("E" & gyosya).Value = Range("A" & gyo).Value
Range("F" & gyosya).Value = Range("B" & gyo).Value
kuiki = kuiki & "," & Range("C" & gyo).Value & "地区"
Range("G" & gyosya).Value = kuiki
ElseIf Range("A" & gyo - 1).Value <> Range("A" & gyo).Value Then
gyosya = gyosya + 1
Range("E" & gyosya).Value = Range("A" & gyo).Value
Range("F" & gyosya).Value = Range("B" & gyo).Value
kuiki = Range("C" & gyo).Value & "地区"
Range("G" & gyosya).Value = kuiki
End If
Next
End Sub
by gooskaしかし、なぜ出来ているのか、説明もできないです。イマイチ理解度が低いような気がします。
[2]に関しては、こんな感じです。若干小川先生の書いたものと違う(if文が一つだけ)のですが、これでいいのでしょうか?
Sub test2()
Dim migi
Dim hida
Dim ku
migi = 1
For hida = 2 To 27
If Range("A" & hida - 1).Value < Range("A" & hida).Value Then
migi = migi + 1
Range("E" & migi) = Range("A" & hida).Value
Range("F" & migi) = Range("B" & hida).Value
ku = ""
End If
ku = ku & "," & Range("C" & hida).Value & "地区"
Range("G" & migi).Value = Mid(ku, 2)
Next
End Sub
ku = ku & "," & Range("C" & hida).Value & "地区"
の行にブレークポイントを入れて、ステップインモードでこのマクロを実行してみましょう。
G列がよく見える状態の画面レイアウトにして。
それで、僕の書いたコードもG列がよく見える状態の画面レイアウトにして動作させてみると、何か気付くかも。
>小川先生の書いたプログラムをちら見しながら、なんとか、正しい結果が出るプログラムになりました。
>しかし、なぜ出来ているのか、説明もできないです。イマイチ理解度が低いような気がします。
>[2]に関しては、こんな感じです。若干小川先生の書いたものと違う(if文が一つだけ)のですが、これでいいのでしょうか?
>
>Sub test2()
>
> Dim migi
> Dim hida
> Dim ku
> migi = 1
> For hida = 2 To 27
> If Range("A" & hida - 1).Value < Range("A" & hida).Value Then
> migi = migi + 1
> Range("E" & migi) = Range("A" & hida).Value
> Range("F" & migi) = Range("B" & hida).Value
> ku = ""
> End If
> ku = ku & "," & Range("C" & hida).Value & "地区"
> Range("G" & migi).Value = Mid(ku, 2)
> Next
>End Sub
>
コードを書き、動作確認もできました。
タイトルにある「1行のリストを解析して表にする」もやってみました。こちらの方が、断然楽でした(「地区」を消す際に、Replace関数を使用しました)。
>「業者名・フリガナ」と「担当区域」がずれないようにするために、3つ全てを「初回でなかったら」と処理してしまい、ループを抜けた後に3つを書き出すのもありかなと思いました。
>コードを書き、動作確認もできました。
よいんじゃないですかね (^^
>タイトルにある「1行のリストを解析して表にする」もやってみました。こちらの方が、断然楽でした(「地区」を消す際に、Replace関数を使用しました)。
こちらもよろしいかと (^^
お世話になっております。
閲覧期間残り一月のところで、基礎編およびフォローアップ編を、閲覧、勉強しおえました。(使えるようになったかは別として)
覚えたマクロで、自分の業務でも使い始めました。ただ、マクロを完成させるのに時間がかかって、今の時点では、これまでちまちまやっていた時間と
さほど変わらない状況です。そのため、マクロを考えるのは、自宅でやっています。ただ完成したマクロを何度も実行してニヤニヤしています。
そんな状況ですが、現在、壁にぶち当たっている問題があります。
それは、野菜の品種名と出荷日のリストがあって、それを、縦に品種、横が出荷日の表に、その品種の出荷日ごとの出荷点数をうちだすというもの
ですが、知恵が浮かびません。
野菜は20種類ほどあって元のリストは重複しておりますし、合計300点あります。出荷日は20日間あります。
重複しない野菜のリストは、教えていただいたマクロでできました。また、品種別の出荷点数も、ネットでみつけたマクロでとってくることができました。
しかし、品種別、さらに出荷日別の点数を打ち出すマクロができません。
以前、どなたかの質問で、その内容は発展編で学んでほしいという回答を見ましたので、今回の質問が基礎編を超えるようなら、仕方ありませんが
基礎編レベルで解決できることでしたら、教えてください。
よろしくお願いいたします。
体調を崩しており、お返事遅くなってしまいました。申し訳ありません。
いただいたご質問の件。
基礎編レベルのスキルでもできないことはないですが、煩雑ですね。
発展編ならすっきり片付くかと。
でも、その前に、ピボットテーブル使えば一発では?という気も。
「元の表は、ピボットテーブルを適用できないようなぐちゃぐちゃなものだ」ということでしたら、そのぐちゃぐちゃなものをピボットテーブルを使える表に整形するマクロを作り、それを使って「四角い表」にしてから、手作業でピボットテーブルを作ります。
以下の無料講座もぜひ参考にしてください。
http://www.exvba.com/dpr.php
>小川先生
>お世話になっております。
>閲覧期間残り一月のところで、基礎編およびフォローアップ編を、閲覧、勉強しおえました。(使えるようになったかは別として)
>覚えたマクロで、自分の業務でも使い始めました。ただ、マクロを完成させるのに時間がかかって、今の時点では、これまでちまちまやっていた時間と
>さほど変わらない状況です。そのため、マクロを考えるのは、自宅でやっています。ただ完成したマクロを何度も実行してニヤニヤしています。
>そんな状況ですが、現在、壁にぶち当たっている問題があります。
>それは、野菜の品種名と出荷日のリストがあって、それを、縦に品種、横が出荷日の表に、その品種の出荷日ごとの出荷点数をうちだすというもの
>ですが、知恵が浮かびません。
>野菜は20種類ほどあって元のリストは重複しておりますし、合計300点あります。出荷日は20日間あります。
>重複しない野菜のリストは、教えていただいたマクロでできました。また、品種別の出荷点数も、ネットでみつけたマクロでとってくることができました。
>しかし、品種別、さらに出荷日別の点数を打ち出すマクロができません。
>以前、どなたかの質問で、その内容は発展編で学んでほしいという回答を見ましたので、今回の質問が基礎編を超えるようなら、仕方ありませんが
>基礎編レベルで解決できることでしたら、教えてください。
>よろしくお願いいたします。
>
書き出すタイミングが動画と違ったので、For Next構文の始まった直後と終わった後に特別な仕掛けをつくる仕組みがなくてもテストしてたら思い通りに動いていました。
今回はうまくいったけれど、初回処理と最後の処理を気をつけるというのは よく出てきそうなので、しっかり覚えようと思います!
Sub seikei()
Dim hida
Dim migi
Dim tiku
migi = 2
For hida = 2 To 27
If Range("A" & hida).Value <> Range("A" & hida - 1).Value Then
Range("E" & migi).Value = Range("A" & hida).Value
Range("F" & migi).Value = Range("B" & hida).Value
migi = migi + 1
tiku = ""
End If
tiku = tiku & "," & Range("C" & hida).Value & "地区"
Range("G" & migi - 1).Value = Mid(tiku, 2)
Next
End Sub
まずは動けばOKです。
ですが、これだと、書き出しを実行する回数が見本より多いですね。
>G列に書きだすのは、hidaを調べていくときだなと思って、if文の中にいれませんでした。
>書き出すタイミングが動画と違ったので、For Next構文の始まった直後と終わった後に特別な仕掛けをつくる仕組みがなくてもテストしてたら思い通りに動いていました。
>今回はうまくいったけれど、初回処理と最後の処理を気をつけるというのは よく出てきそうなので、しっかり覚えようと思います!
>
>
>Sub seikei()
> Dim hida
> Dim migi
> Dim tiku
> migi = 2
> For hida = 2 To 27
> If Range("A" & hida).Value <> Range("A" & hida - 1).Value Then
> Range("E" & migi).Value = Range("A" & hida).Value
> Range("F" & migi).Value = Range("B" & hida).Value
> migi = migi + 1
> tiku = ""
> End If
> tiku = tiku & "," & Range("C" & hida).Value & "地区"
> Range("G" & migi - 1).Value = Mid(tiku, 2)
> Next
>End Sub
>
>まずは動けばOKです。
>ですが、これだと、書き出しを実行する回数が見本より多いですね。
とのことですので、修正してみました。
Sub seikei()
Dim hida
Dim migi
Dim tiku
migi = 2
For hida = 2 To 27
If Range("A" & hida).Value <> Range("A" & hida - 1).Value Then
Range("E" & migi).Value = Range("A" & hida).Value
Range("F" & migi).Value = Range("B" & hida).Value
migi = migi + 1
tiku = ""
End If
tiku = tiku & "," & Range("C" & hida).Value & "地区"
If Range("A" & hida).Value <> Range("A" & hida + 1).Value Then 'If文を追加しました
Range("G" & migi - 1).Value = Mid(tiku, 2)
End If
Next
End Sub
>鈴木優子 さん:
>
>まずは動けばOKです。
>ですが、これだと、書き出しを実行する回数が見本より多いですね。
>
>>G列に書きだすのは、hidaを調べていくときだなと思って、if文の中にいれませんでした。
>>書き出すタイミングが動画と違ったので、For Next構文の始まった直後と終わった後に特別な仕掛けをつくる仕組みがなくてもテストしてたら思い通りに動いていました。
>>今回はうまくいったけれど、初回処理と最後の処理を気をつけるというのは よく出てきそうなので、しっかり覚えようと思います!
>>
>>
>>Sub seikei()
>> Dim hida
>> Dim migi
>> Dim tiku
>> migi = 2
>> For hida = 2 To 27
>> If Range("A" & hida).Value <> Range("A" & hida - 1).Value Then
>> Range("E" & migi).Value = Range("A" & hida).Value
>> Range("F" & migi).Value = Range("B" & hida).Value
>> migi = migi + 1
>> tiku = ""
>> End If
>> tiku = tiku & "," & Range("C" & hida).Value & "地区"
>> Range("G" & migi - 1).Value = Mid(tiku, 2)
>> Next
>>End Sub
>>
>あとは、誰にとってよいプログラムか?という問いによって最適なコードかどうかの答えが変わるレベルかと思います。
参考「[質問] 同じ機能を実現するマクロの書き方が複数ある場合、どの書き方が良いか分からなくて迷います。」
http://www.exvba.com/blog/?p=4378
>小川先生
>
>>まずは動けばOKです。
>>ですが、これだと、書き出しを実行する回数が見本より多いですね。
>とのことですので、修正してみました。
>
>
>Sub seikei()
> Dim hida
> Dim migi
> Dim tiku
> migi = 2
> For hida = 2 To 27
> If Range("A" & hida).Value <> Range("A" & hida - 1).Value Then
> Range("E" & migi).Value = Range("A" & hida).Value
> Range("F" & migi).Value = Range("B" & hida).Value
> migi = migi + 1
> tiku = ""
> End If
> tiku = tiku & "," & Range("C" & hida).Value & "地区"
> If Range("A" & hida).Value <> Range("A" & hida + 1).Value Then 'If文を追加しました
> Range("G" & migi - 1).Value = Mid(tiku, 2)
> End If
> Next
>End Sub
>
フォローアップセミナーのNO.018の最終問題_ 2は5時間ぐらいあれこれと悩みました。
基礎編についてはほぼ理解できたと思います。
次のステップの順序としては、どの講座を受けるのが理想でしょうか?
G列に書き出すタイミングが上手く表現できず悩みました。
以下が出来上がったプログラムソースです。
code
Sub list2()
Dim memo, migi, gyo
migi = 2
For gyo = 2 To 27
If Range("a" & gyo).Value <> Range("a" & gyo - 1).Value Then
Range("e" & migi).Value = Range("a" & gyo).Value
Range("f" & migi).Value = Range("b" & gyo).Value
Range("g" & migi - 1).Value = memo & "地区"
memo = Range("c" & gyo).Value
migi = migi + 1
Else
memo = memo & "地区" & "、" & Range("c" & gyo).Value
End If
Next
Range("g" & migi - 1).Value = memo & "地区"
End Sub
/code
>基礎編についてはほぼ理解できたと思います。
よかったです☆
次は、「発展編1」へどうぞ。
http://www.exvba.com/hatten1.php
G列への書き出し。
以下もおもしろい書き方ですね。
基礎編のフォロー動画も、もう一度ひととおりやるとまた新しい発見があるかもしれません。
2巡目で新しい発見がありました!という方もけっこういらっしゃいます。
自分のスキルアップを実感するという意味でも楽しいので、ぜひやってみてください☆
>初めてコメントする森と申します。
>フォローアップセミナーのNO.018の最終問題_ 2は5時間ぐらいあれこれと悩みました。
>基礎編についてはほぼ理解できたと思います。
>次のステップの順序としては、どの講座を受けるのが理想でしょうか?
>
>G列に書き出すタイミングが上手く表現できず悩みました。
>以下が出来上がったプログラムソースです。
>
>
>
>code
>Sub list2()
> Dim memo, migi, gyo
> migi = 2
> For gyo = 2 To 27
> If Range("a" & gyo).Value <> Range("a" & gyo - 1).Value Then
> Range("e" & migi).Value = Range("a" & gyo).Value
> Range("f" & migi).Value = Range("b" & gyo).Value
> Range("g" & migi - 1).Value = memo & "地区"
> memo = Range("c" & gyo).Value
> migi = migi + 1
> Else
> memo = memo & "地区" & "、" & Range("c" & gyo).Value
> End If
> Next
> Range("g" & migi - 1).Value = memo & "地区"
>End Sub
>/code
>
お返事、遅くなりました。
お役に立てているようで、とてもうれしく思います。
> 基礎編だけでもかなりのことができると伺いましたので、今後はまず仕事上の懸案事項への活用をトライしてみるつもりです。
それは、本当にそうですので。
どんどんご活用ください。門田さんがどんな成果をあげられるか、とても楽しみです。
>基礎編フォローアップ動画講座、全18回、本日をもって学習を終了することができました。マクロ言語の学習は全く初めての経験でしたので全てが新鮮で大変楽しく学習することができました。学習者に寄り添い、かつ実践的な講座をご提供いただき大変ありがとうございました。基礎編だけでもかなりのことができると伺いましたので、今後はまず仕事上の懸案事項への活用をトライしてみるつもりです。将来、おそらく発展コースでの学習の必要性が出てくるものと思われますが、基礎編で学んだ成果を試して見たいと考えております。これまでのご指導に感謝いたします。ありがとうございました。
この講座で学んだ事を駆使して作成しましたが、F8では正常なのにF5実行をするとデータがうまく転記されません。
何が原因でしょう?
おはようございます。
それだけでは分かりません。ファイルひととおり送って、どのファイルのどのマクロを実行したとき、何行目で何というエラーが出たのか(または、そもそもエラーは出ないけど転記されない、なのか?等々)報告ください。
というか、その報告のための調査を自分でしっかりしている間に解決しそうな気もしますが。
まずは、よろしくお願いいたします。
>こちらの講座とは関係ありませんが、会社で至急複数ブックのデータ転記マクロを作成することになりました。
>この講座で学んだ事を駆使して作成しましたが、F8では正常なのにF5実行をするとデータがうまく転記されません。
>何が原因でしょう?
一応上手く処理されましたが、
どこかおかしいところや注意すべき箇所はありますでしょうか?
Sub test()
Dim cGyo As Long
Dim cHida As Long
Dim cMigi As Long
Dim sTiku As String
cHida = 2
cMigi = 2
For cGyo = 2 To 27
If Range("A" & cGyo).Value <> Range("A" & cGyo + 1).Value Then
Range("E" & cHida) = Range("A" & cGyo).Value
Range("F" & cHida) = Range("B" & cGyo).Value
Range("G" & cMigi) = Mid(sTiku & "," & Range("C" & cGyo).Value & "地区", 2)
cHida = cHida + 1
cMigi = cMigi + 1
sTiku = ""
Else
sTiku = sTiku & "," & Range("C" & cGyo).Value & "地区"
End If
Next
End Sub
この構造文のパターンは、発展編1ででてくる「伝票作成」のマクロでもそっくりそのまま登場します。
これです↓。
http://www.exvba.com/demo_denpyo.php
楽しみにしていてください。
それでも書くのに悩んだ12回と18回は、また復習しますヽ(*´v`*)ノ
次は「Web連携」をやりつつ毎日一つはマクロを書いていきます^^/
「Web連携」が終わった後は、マクロの苦手な部分も克服できていることに期待。
それから発展編1に移ろうと思います^^
今回書いたコード↓
Sub create_ward()
'review: 2015/2/16
Dim i, mke, ward
mke = 2
For i = 2 To 27
If Range("A" & i - 1).Value <> Range("A" & i).Value Then
Range("E" & mke).Value = Range("A" & i).Value
Range("F" & mke).Value = Range("B" & i).Value
ward = Range("C" & i).Value & "地区,"
mke = mke + 1
Else
ward = ward & Range("C" & i).Value & "地区,"
End If
Range("G" & mke - 1).Value = Left(ward, Len(ward) - 1)
Next
End Sub
>9回目から復習をしてきて18回目まで戻ってきました。
>それでも書くのに悩んだ12回と18回は、また復習しますヽ(*´v`*)ノ
ガンガン練習してください☆
Web連携講座は、ITリテラシーつけるにはとてもよいですよ。
いただいたコード。
Range("G" & mke - 1).Value = Left(ward, Len(ward) - 1)
の処理を26回やっています。それだとちょっとムダが多いかな。
入力先のセルごとに上記処理は1回までで済むように改変してください。
以下、極端な例で考えると分かるかと思いますので。
いまは for i = 2 to 27 ... next だからそれほどでもないけど、業者は15件しかない地区は3,000ある、とかだったら2,9000回の入力は直後に上書きされるだけのムダな記入になります。
それではまずいですよ。
>9回目から復習をしてきて18回目まで戻ってきました。
>それでも書くのに悩んだ12回と18回は、また復習しますヽ(*´v`*)ノ
>次は「Web連携」をやりつつ毎日一つはマクロを書いていきます^^/
>「Web連携」が終わった後は、マクロの苦手な部分も克服できていることに期待。
>それから発展編1に移ろうと思います^^
>
>今回書いたコード↓
>
>Sub create_ward()
> 'review: 2015/2/16
> Dim i, mke, ward
> mke = 2
> For i = 2 To 27
> If Range("A" & i - 1).Value <> Range("A" & i).Value Then
> Range("E" & mke).Value = Range("A" & i).Value
> Range("F" & mke).Value = Range("B" & i).Value
> ward = Range("C" & i).Value & "地区,"
> mke = mke + 1
> Else
> ward = ward & Range("C" & i).Value & "地区,"
> End If
> Range("G" & mke - 1).Value = Left(ward, Len(ward) - 1)
> Next
>End Sub
>
Sub list2()
Dim gyo
Dim migi
Dim kuiki
migi = 2
For gyo = 2 To 27
If Range("A" & gyo - 1).Value <> Range("A" & gyo).Value Then
Range("E" & migi).Value = Range("A" & gyo).Value
Range("F" & migi).Value = Range("B" & gyo).Value
migi = migi + 1
End If
If Range("B" & gyo - 1).Value <> Range("B" & gyo).Value Then
kuiki = Range("C" & gyo).Value & "地区"
Else
kuiki = kuiki & "," & Range("C" & gyo).Value & "地区"
End If
Range("G" & migi - 1).Value = kuiki 'G列が1行ずれてしまったので、migi -1で調整した。
Next
End Sub
急遽、migi-1なんてやらかしていますが…(^_^;)それでも、何とか一通りフォローアップ動画も観終わりました。
もう一度、最後の方の難しかったところを観てから、次の「発展編1」に進もうと思います。
ありがとうございます。
For Next構文の入りにそれが初回処理かどうか判断して条件分岐するというのは常道です。
これもパターンなので、第17回で紹介したやり方と対にして覚えます。
>もう一度、最後の方の難しかったところを観てから、次の「発展編1」に進もうと思います。
素晴らしいです。絶対正解です。
知識に触れることをむやみに追うより、体得するプロセスを重視したほうが近道です。
発展編1の知識がなくても条件反射的に仕上げられる仕事は多いですし、体得できているもののレベルが高いほうが発展編1の知識も入るのが早くなります。
今から仕事なので帰宅したら小川先生のマクロを検証しつつなぞろうと思います。
Sub createlist2()
Dim i, j, ward
Range("E2").Value = Range("A2").Value
Range("F2").Value = Range("B2").Value
j = 3
For i = 3 To 26
If Range("A" & i - 1).Value <> Range("A" & i).Value Then
Range("E" & j).Value = Range("A" & i).Value
Range("F" & j).Value = Range("B" & i).Value
j = j + 1
End If
Next
'作成日: 2015/02/09。↓2日考えてやっと完成
j = 2
Range("G2").Value = Range("C2").Value & "地区"
For i = 2 To 26
If Range("A" & i) <> Range("A" & i + 1) Then
ward = 0
j = j + 1
ward = Range("C" & i + 1).Value & "地区,"
Range("G" & j).Value = ward
Else
ward = ward & Range("C" & i + 1) & "地区,"
Range("G" & j).Value = ward
End If
Next
For i = 3 To 11
Range("G" & i).Value = Left(Range("G" & i).Value, Len(Range("G" & i).Value) - 1)
Next
End Sub
そして、動画で示した見本と比べてどうでしたでしょうか?
私が一番悩んだのは地区の部分をどうやって入れるかということでした。
どうしても一段後にずれるようなので、とりあえずA2の岩手化学が一つしかないのを幸いに、
岩手化学をForNextから出して先行させ、残りの地区を入れていくという算段を立てました。
小川先生は、その一段ずれる部分をIf migi>2Thenで吸収していますね。
流れを変えたい部分を大きな流れの中に組み込んで分岐させる、という発想は私にはありませんでした。
流れを変えたいから、全体としての大きな流れとはまた別の流れを作ってしのごうと考えましたから。
今後は、マクロを書く中で「この流れをかえたい」という部分を全体の流れにうまく組み込んで書けるようになりたいです(*゚▽゚)*
For Next構文の入りにそれが初回処理かどうか判断して条件分岐するというのは常道です。
ムダに知識を増やすより、こういう手法を知っているか、自分のケースに当てはめて自由に活用できるかということが重要です。
Sub risuto()
Dim hidari
Dim migi
Dim tantou
migi = 1
For hidari = 2 To 27
If Range("A" & hidari - 1).Value <> Range("A" & hidari).Value Then
migi = migi + 1
tantou = " "
End If
Range("E" & migi).Value = Range("A" & hidari).Value
Range("F" & migi).Value = Range("B" & hidari).Value
tantou = tantou & "." & Range("C" & hidari).Value & "担当"
Range("G" & migi).Value = Mid(tantou, 2)(A)
Next
End Sub
以前も書きましたが、きちんと動くコードをください。
以下のものであれば、追記するのは (A) ではなく '(A) であるべきです。
以後、お気をつけください。
>質問 以下のコードの場合は、(A)が2だと最初に" . "ピリオドがつきます。3だと消えます。なぜでしょうか。
mid関数の仕様について復習。
「東京都渋谷区」という文字列があったとします。
そのとき、
mid("東京都渋谷区", 1) → "東京都渋谷区"
mid("東京都渋谷区", 2) → "京都渋谷区"
mid("東京都渋谷区", 3) → "都渋谷区"
mid("東京都渋谷区", 4) → "渋谷区"
mid("東京都渋谷区", 5) → "谷区"
ですね。ここまでは大丈夫ですか?
では問題。
(A) の段階で、 変数 tantou には何という文字列が入っていますか?
その一文字目は何?ニ文字目は何?三文字目は何?四文字目は何?五文字目は何?
以下の回答スペースをを用意します。ここに自分で【手書きで】書き込んでください。
変数 tantou の一文字目:
変数 tantou のニ文字目:
変数 tantou の三文字目:
変数 tantou の四文字目:
変数 tantou の五文字目:
そのうえで、上記の mid 関数の仕様についてもう一度復習すれば、おそらく分かるでしょう。
分かったか、分からないで挫折したか、したらまたご連絡ください。
ゲームをやっていて時間を忘れてしまうような、あの感じです。
今までの回で、書いていく中で、色々試して失敗しましたが、その失敗の方法が今回使えたりと、たくさん失敗する意義を感じる最終回でした。
今の頭の状態で、もう一度、第一回目から、新たな発見と知識の定着のため、マクロを書いてみようと思います。
発展編でもお世話になると思いますが、よろしくお願いします。
基礎編の分かりやすい動画解説、ありがとうございました。
よかったです!ひきつづきお楽しみください☆
実務でもどんどんマクロを書いて、どんどん質問してください。
今度の発展編1でお会いできるのを楽しみにしていますね。
まだ基本的なことしかやってませんが、プログラミングって結構やれるではないかと感じるようになり、もっと色んなことができるようになりたいと思うようになりました。
ありがとうございました。次の発展編でもよろしくお願いします。
コメントありがとうございます。
>学生時代プログラミングの授業でVBAを少しやりました。ただその時は全く分からずただプログラミングは難しいものなのだっていう印象しか残りませんでした。
>まだ基本的なことしかやってませんが、プログラミングって結構やれるではないかと感じるようになり、もっと色んなことができるようになりたいと思うようになりました。
わかります。僕も、独学では相当に苦労したので(汗
> ただその時は全く分からずただプログラミングは難しいものなのだっていう印象しか残りませんでした。
「プログラムは手順書」という言い方を踏襲して形容すると、それは、「そのとき教わった相手の方の手順が悪かった」ということです。
ご自身の元々の能力の問題とかそういうものではないです。
この段階でそう感じられているのであれば、かなりやれると思いますよ。
もっといろんなことができるよう、ぜひ、プログラミングの世界をより深く学んでください。
ひきつづきお楽しみを☆
お世話になっております。
今やっとフォロー動画をすべて終了致しました。
最後の方はなかなか考えさせられました。面白かったです。
発展編1に移ろうと思います。
引き続きよろしくお願い致します。
お楽しみいただけているようで何よりです。
ひきつづきよろしくお願いいたします☆
本日ようやく動画解説を見終わる
ことができました。
解説もありましたように最後の設問の
For~Nextの最初と最後の書き込みに
手間取ったのですが、以下のような
回答を作成していましたが、
これに冠する小川さんの解説は、また
しても(^^;自分では思いつかないような
手順というかアプローチの仕方でしたので
非常に勉強になりました。
最終問題ですので全体を総括させて
いただきますと、
知らないうちに非常に短期間に業務でも
マクロを活用できるようになりましたので
非常に投資効果の高いセミナーだったと
いえるかと思います。
ありがとうございました。
発展編とのギャップがどのくらいあるかは
わかりませんが、何度か復習した後、できるだけ
はやく発展編も受講させていただきたいと
思っております。
(実は、密かに、Excelマクロによる分析を
多用する業務に移ることを目論んでおりますので(^^、)
もっともっと勉強していきたいと思います。
今後ともよろしくお願いいたします。
---
Sub kakikae()
Dim migi
migi = 2
Dim kuiki
kuiki = 0
Dim hida
For hida = 2 To 27
If Range("a" & hida).Value <> Range("a" & hida - 1).Value Then
Range("e" & migi).Value = Range("a" & hida).Value
Range("f" & migi).Value = Range("b" & hida).Value
kuiki = Range("c" & hida).Value & "地区"
migi = migi + 1
Else
kuiki = kuiki & "," & Range("c" & hida).Value & "地区"
End If
Range("g" & migi - 1).Value = kuiki
Next
End Sub
---
全動画踏破おめでとうございます☆
>知らないうちに非常に短期間に業務でも
>マクロを活用できるようになりましたので
>非常に投資効果の高いセミナーだったと
>いえるかと思います。
よいですね!そう言っていただけて、僕もとてもうれしいです v(^^*
>(実は、密かに、Excelマクロによる分析を
>多用する業務に移ることを目論んでおりますので(^^、)
行けますよ!数ヶ月も経ったころには、すっかり環境も変わっているかもしれません。
ひきつづき、マクロガンガン活用して楽しんでください。
フォロー期間もまだまだありますし、実務でマクロを書いているときに問題にぶつかったときにも、遠慮なく質問等してください。