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

コメント紹介
   └ エクセルマクロ・VBA基礎編フォローアップ ベーシック
       └ If文とForNext構文を組み合わせる

If文とForNext構文を組み合わせる

[11334] 2019-04-11 14:45:18 受講生さんからの投稿です。

お世話になります。ご無沙汰しております。
For Nextステートメントについて質問があるのですが、For NextステートメントはRange("A" & i )のように書いてはいけないと今日言われました。
Cells( 1 , i ) のように書きなさいと。
理由としてはRangeでかくと
① 処理が遅い
② そんなコードを書いていると笑われる
との事です。

私は小川先生の講座で1年以上VBAについて勉強してきましたのでこの書き方に違和感はありませんでした。
ちなみにCellsの書き方も知っています。
そこで、小川先生がこの書き方でやってきているのは初心者に理解しやすいようにですか?上級者向けの講座ではCellsを使っているのでしょうか?
Rangeの書き方でも行の処理ならできるので良いかなと思っていたのですが今日、思いっきりその書き方はダメだよと言われました。
と、言うのも現在、東京都が行っている職業訓練というものでExcel VBA実践コースというのを受講しています。
2月から3ヶ月間のコースでまもなく終わりを迎えます。
その講師の先生から言われました。
その先生の教え方はものすごくわかりにくく、受講者のほとんどが授業を聞かずに自分たちでテキストを読み込んだり、ネットで調べながら勉強していたほどお世辞にも優秀な講師とは言えないです。
どこがダメか具体的に教えて欲しいといっても処理速度が遅いのと田中先生(Office田中)が言っていたからとしか説明してもらえませんでした。
私の中では信頼の置けない講師の方なので腑に落ちなくて・・・。
小川先生に直接質問させて頂きました。
今後もっと複雑なコードを書くようになったらRangeでの書き方はしなくなっていくのでしょうか?
ご教授、お願いいたします。

 


[11335] 2019-04-11 17:38:44 小川慶一さんからの投稿です。

受講生 さん:

ははは。

自分の言葉に責任を持って、信念を持って教育してくれる人から学びましょう。
そうでない人の言葉はすべて戯言です。

借り物の言葉に真実はありません。
もし借りてきたその言葉が全否定されることがあっても、今度は、自分のせいではなく、その人が借りた言葉を発した人(この場合は、その某先生)のせいにするだけです。取り合うだけ無駄。
そんな地縛霊以下の存在に惑わされぬよう ヾ(´ー`)ノ


> ① 処理が遅い

だいたい、そういうことを言う人に限って、マシンで余計なサービスが動いていて、そっちで処理に時間を取られているという...。
とか、ショートカットキーぜんぜん使ってなくて、マクロの実行までによけいに時間がかかっている、とか (^^;

そもそも、処理速度のことを言うなら、「VBAを使う」という選択自体ダメです。

「アルゴリズムがイケてなくて処理が冗長」とかならともかく、RangeがCellsかの違いなんて、あったとしても、どんぐりの背比べ。

そんなところでチューニングに凝っても、そんなの過剰最適ですし、僕はそんな微々たる差には関心を持てないです。

RangeかCellsかで悩んでいる間に、事務仕事全般で改善できることはもっともっといっぱいあるはずです。
その先生は、VBAのことしか頭になくて、「業務改善と何か」とか、そういうことにはさっぱり意識が向かないのでしょう。

あとは、知識をひけらかしたいだけ、とか。


> ② そんなコードを書いていると笑われる

うーん、どうですかね。


Cellsを使うことのメリットとしては、横方向へのくり返しも簡単に書けるというのはあります。
Rangeなら、そのためには、Offsetを使いますね。理由の説明は略しますが、横方向へのくり返しならRangeよりCellsのほうが良さそうですね。

でも、DPRに基づいて仕事をしているとしたら、そもそも横方向へのくり返し自体滅多にすることはないです。
なので、上記の理由は、「DPRに基づいて仕事をしていたならそもそも滅多に生じないことのための準備」ということになります。

一般的に、ダメな人作ったダメな資料ほど、横方向へのくり返しを必要とします。
「Cellsは横方向へのくり返しが便利!」という人もいますね。そういう人は、たぶん、普段見ているもの、取り扱っているものがダメなのでしょう。

一方、RangeはRangeで、複製セル範囲を簡単に指定でき、かつ、そのセル範囲をメモリに格納できるので、そういうときにはCells(を組みあせて範囲選択する)より記述が容易で、かつ、(おそらく)記述にかかる負荷に比して高速です。(Cellsでも複数セルを含む範囲を指定するはできます。けど、書き方が面倒くさい)


僕が基礎編でRangeを使っている理由はいろいろなのですが、そのひとつとして、「自動記録で得られるコードはほぼRangeで記述されているから」ということが挙げられます。
(決して、「『大村あつし』や『渡辺ひかる』といった大御所が2000年代に書いた教科書ではCellsではなくRangeが使われていたから」とかではありません (^^; )

「自動記録で得られるコードはほぼRangeで記述されている」にもかかわらずCellsも教えるとしたら、受講生は、CellsとRangeの両方を習得しなくてはいけません。
一方、Rangeだけで教えたら、Cellsについて学ぶストレスを初心者に与えないで済みます。

そして、Cellsでできることは、Rangeでもできます。

初心者はただでさえ他にも覚えることが多いのですから、RangeとCellsの両方を教えると大きな負荷になります。
言い換えると、Cellsを覚える代わりに、初心者は、別の何かを覚える余裕がなくなります。

では、「他の何か」をを覚える代わりにCellsを覚える必要があるのか?Rangeで目的果たせるならそれでいいじゃない、と僕は思います。

そもそも、初心者にとっては、冗長かとか高速かとかいうこと以前に、「まずは、思い通りに動くコードを書けるようになる」ということが重要なのですから。
そういう意味でも、パフォーマンスのことは二の次です。


>上級者向けの講座ではCellsを使っているのでしょうか?

いえ。上級者向けでもRangeです。
複雑になればなったで、Rangeのほうがかえって僕は便利と感じます。


あと、VBAでコーディングスタイルのことで人に直接喧嘩を売ってくる人は、たいてい、VBA以外は書けないか、ほとんど書けない人ですね。
世界に対する見聞が狭いです。狭い世界しか見えてないから、そこでの細かい違いばかりが気になるのでしょう。


..ということで、いろいろな角度からいろいろ書いてみました。


あと、以下のブログ記事も参考になるかな、と。

○[質問] 同じ機能を実現するマクロの書き方が複数ある場合、どの書き方が良いか分からなくて迷います。
https://www.exvba.com/4378/

↑記事の内容を思い切り要約して一行にまとめると「万人を満足させる書き方なんてない」ということです。


以上のとおりです。
お役にたてれば、と。





> お世話になります。ご無沙汰しております。
> For Nextステートメントについて質問があるのですが、For NextステートメントはRange("A" & i )のように書いてはいけないと今日言われました。
> Cells( 1 , i ) のように書きなさいと。
> 理由としてはRangeでかくと
> ① 処理が遅い
> ② そんなコードを書いていると笑われる
> との事です。
>
> 私は小川先生の講座で1年以上VBAについて勉強してきましたのでこの書き方に違和感はありませんでした。
> ちなみにCellsの書き方も知っています。
> そこで、小川先生がこの書き方でやってきているのは初心者に理解しやすいようにですか?上級者向けの講座ではCellsを使っているのでしょうか?
> Rangeの書き方でも行の処理ならできるので良いかなと思っていたのですが今日、思いっきりその書き方はダメだよと言われました。
> と、言うのも現在、東京都が行っている職業訓練というものでExcel VBA実践コースというのを受講しています。
> 2月から3ヶ月間のコースでまもなく終わりを迎えます。
> その講師の先生から言われました。
> その先生の教え方はものすごくわかりにくく、受講者のほとんどが授業を聞かずに自分たちでテキストを読み込んだり、ネットで調べながら勉強していたほどお世辞にも優秀な講師とは言えないです。
> どこがダメか具体的に教えて欲しいといっても処理速度が遅いのと田中先生(Office田中)が言っていたからとしか説明してもらえませんでした。
> 私の中では信頼の置けない講師の方なので腑に落ちなくて・・・。
> 小川先生に直接質問させて頂きました。
> 今後もっと複雑なコードを書くようになったらRangeでの書き方はしなくなっていくのでしょうか?
> ご教授、お願いいたします。

 


[11336] 2019-04-11 21:17:30 受講生さんからの投稿です。

小川先生

お世話になります。
ご返信ありがとうございました。

お話し聞けて良かったです。
正直、書き方を否定された時はその講師にめっちゃ腹が立ちまして(笑)
とっさに先生に質問してしまいました。
でも使い方の違いがわからない私は言い返すこともできず…。
すっごく悔しかったです。

この3ヶ月、その講師から学んだことは本当にわずかなもので
質問しても回答はほとんど的をえていないのにこちらがわからないと
逆切れをしてくるような方だったのでテキストを読み込み練習問題と並行して
ガラパゴスタディで購入した動画を繰り返し見て学んでいました。
職業訓練とは名ばかりでほぼ独学でした。

お役所仕事なのはわかりますが、講師の質を見直すべきだとつくづく感じました。
受講生の中でもともとVBAの経験がある人は独学で勉強し、まったく初めての人はVBAは
自分にはレベルが高すぎた。と途中であきらめてしまっていました。
良い講師であったのならそうはならないと思うのですが。

小川先生とは真逆でVBAエキスパートの資格命!みたいな方でした(笑)
なのでわからない人の気持ちもわからない。
というか、実務で使うことは重視せず、資格の取得のみに力を入れているみたいな感じなのかなと。
教える側の人間になってはいけない人だわ。と思いながら過ごしてきました。

これからも自信を持ってRangeで書いていきます!
職業訓練を修了したら仕事復帰をすることになるので実務を積むチャンスです。

転職をきっかに職業訓練に参加したのですが、必要なのは長い時間かけて学校に通うことではなく、
日々の実務の中で少しずつ勉強したマクロを使って業務の効率化していくことだなとわかりました。
火事場の馬鹿力じゃないですが、切羽詰まらないと身に付き方も違うなと思いました(^_^;)
残り少しですが少しでも実務に直結できるようなコードが書けるように動画を見ます。
また、動画に関して質問があった際はさせて頂きますのでご教授お願いします。

 


[11340] 2019-04-12 00:58:09 田中 宏明さんからの投稿です。

受講生 さん:

RangeとCells、どちらもRangeオブジェクトです。

詳しくは以下の通りです。
・RangeはWorkSheetのプロパティであって、セル範囲をプロパティとして持つことができるRangeオブジェクト
・CellsはWorkSheetまたはRangeのプロパティであって、親オブジェクトの全セルを包むRangeオブジェクトで、更に引数で1つのセルを指定できるRangeオブジェクト

これは頭が混乱して仕事が進まなくなるので、小川先生の導きに従うのみですね。

 


[11343] 2019-04-12 15:01:36 小川慶一さんからの投稿です。

田中 宏明さん:

>親オブジェクトの全セルを包むRangeオブジェクトで

親オブジェクトの全セルを「含む」でしょうか?

ともあれ、

> ・RangeはWorkSheetのプロパティであって、セル範囲をプロパティとして持つことができるRangeオブジェクト
> ・CellsはWorkSheetまたはRangeのプロパティであって、親オブジェクトの全セルを包むRangeオブジェクトで、更に引数で1つのセルを指定できるRangeオブジェクト

その言葉の意味をスラスラ理解できたらもはや基礎編レベルではないですねw



> 受講生 さん:
>
> RangeとCells、どちらもRangeオブジェクトです。
>
> 詳しくは以下の通りです。
> ・RangeはWorkSheetのプロパティであって、セル範囲をプロパティとして持つことができるRangeオブジェクト
> ・CellsはWorkSheetまたはRangeのプロパティであって、親オブジェクトの全セルを包むRangeオブジェクトで、更に引数で1つのセルを指定できるRangeオブジェクト
>
> これは頭が混乱して仕事が進まなくなるので、小川先生の導きに従うのみですね。

 


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

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

トップへ