5倍速!メールマガジン
外部アカウントで登録
受講生の声
新着の講座投稿
新着の講座コメント
新着のノート投稿
投稿一覧へ新着のノートコメント
表示できる投稿はありません。
サイト運営者紹介
小川 慶一講師/教材/システム開発者紹介
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
表示できる投稿はありません。
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
morimotoさんの投稿
(投稿ID: 4716)
現在発展編1学習中です。先日基礎編アドバンス演習18で
詳しい添削していただきありがとうございました。
今回は演習20でまたもsum関数で計算算出するコートができました。
まず商品で並び替えして、商品を転記
そして年→商品で並び返し
最後年が変わる前後でsum関数の始期、終期を出して
式挿入しました。仕事でこのようなsum関数を使う場面が多いので
動画18に続いて自装してみました。添削のほどお願いしたく
よろしくお願いします。
小川 慶一さんのコメント
(コメントID: 6569)
morimotoさん:
いただいたプログラム、提供したサンプルとかなり異なりますね。
このプログラムに対して何をして欲しいのかがわかりません。
見てほしい点は何か?3つまでに絞って回答ください。
特に絞り込んで見てもらいたいポイントがないなら、僕からコメントとしては、全体を眺めたうえでのコメントとして、「動いたならそれで良いのではないでしょうか」とお返事するくらいです。
> 今回は演習20でまたもsum関数で計算算出するコートができました。
この動画解説では、Sum関数は使っていません。
マクロの中でワークシート関数のSum関数をセルに埋め込むようなコードを書くことを推奨したこともありません。
morimotoさんのコメント
(コメントID: 6585)
さて記入しましたコードにつきましては、演習18で小生のコードを添削いただきましたので、その延長として今回作成しました。提供いただいた分につきましても練習をしております。大変ありがとうございます。
そしてお伺いしたいことが、コメントに関数の組み込むは非奨励とありましたが、どうしても解消したくて質問しました。理由としましては、
マクロで表を仕上げた後、例えば、2005年のあま酒の額に訂正が入ったと
なったときに表の額をさえ訂正すれば仕上げた表にも反映させたいというようにしたいからです。あれこれ調べましたが、何一つ得られるものは見つかりませんでした。それは奨励されてことを反映しているかもしれません。
morimotoさんのコメント
(コメントID: 6586)
そこで非奨励とはあるものの"=sum(F" & srow & " : F" & erow & ")"の
部分は、「こういうように書くもの」と覚えるものなのか、何か別途
書き方の手法といったものがあるのか、是非お伺いしたいです。周りに
聞く人が全くいませんのでどうかよろしくお願いします。
[/code]
小川 慶一さんのコメント
(コメントID: 6587)
[1] 元データが編集されたときに自動的に編集内容が反映されるようにしたい
[2] そのためにプログラムを書いた(が、期待どおりの動作をしない部分があった)
ということですね。
[1] について。
「イベント」機能を使って実装するのが本来のやり方です。
「イベント」機能を使うと、セルが編集されたときに、自動的に(あなたが[F5]キーを押さないでも)マクロが実行されるようになります。
http://www.exvba.com/ef.php
関数を埋め込むのがなぜ良くないかというと、以下の2つの理由からです。
[a] コーディング、メンテナンスともに面倒になる
[b] エクセル関数自体、エクセルの動作が重くなる主要因である
[c] そもそも元データの範囲・行数が確定していない状況ではワークシート関数は不向き
[a] コーディング、メンテナンスともに面倒になる
「DPR」の話として説明するなら、「エクセルマクロ」と「エクセルワークシート関数」を混在させることは、「P」をいたずらに煩雑化させることになります。
煩雑さの代償は、要求される知識の広さ、コーディングの面倒さ、メンテナンスの面倒さです。
コーディングの面倒については、現に今お困りなようですし、改めて説明するまでもないでしょう。
メンテナンスについても同様です。
書くのが面倒ならば、メンテナンスも面倒です。
さらに言うと、こういう仕組みを作ると、メンテナンスする人に要求される技術の範囲が広がります。
「エクセル関数」と「エクセルマクロ」の両方の技術に通じている必要があります。
今はSum関数だから良いかもしれませんが、「VLookUp関数」とか「IsError関数」とか「DSum関数」とかをさらにゴチャゴチャと詰め込んだ関数を埋め込むマクロを書こうとしたら、それらの関数についての知識も必要になってきますね。
だったらマクロだけで同様の処理を書けるようになるほうが楽です。
メンテナンスに必要な知識も、マクロについてのものだけで済みます。(メンテナンスについて言うと、エクセルシートを見に行ってセルに埋め込まれた関数の適正さ、表示される値の適正さを確認するというのもまた工数なのですが、ここでは説明を省略します)
「『VLookUp関数』とかは今は使うつもりはないよ」と思われるかもしれませんが、ではそれより前のどこでやめるか?ということです。
Sum関数くらいなかまわないのか?VLookUp関数を使うのはやりすぎなのか?もしそうなのだとしたら、その中間はどこなのか?
そういう論法で考えようとすればいろいろ考えられるかもしれませんが、そもそも最初からきっぱりと別技術たるエクセルワークシート関数は持ち出さないのがベストです。Sum関数すら導入を忌避すべきです。
煩雑さを避け、要求される知識を制限するためです。
[b] エクセル関数自体、エクセルの動作が重くなる主要因である
これも同様で、どこまでやるか?ということです。Sum関数ですら、セルに埋め込まれている関数が増えれば増えるほどエクセルの動作は重くなります。
[c] そもそも元データの範囲・行数が確定していない状況ではワークシート関数は不向き
このサンプルでは簡単のためにデータ範囲を2005年1月-の所定の範囲にしています。
が、こういう仕事では、元の表が更新されるとなったら、実務では範囲も行数も異なることが普通です。
そういう場合、関数は無力です。
(なので、エクセルの通常機能でこの手の処理をする場合は、ピボットテーブルを使うのがむしろ普通です)
[2] について。
「コンパイルエラーになる」ということで示された以下のコードは、その次の行に書いたように直せば問題なく動くものと思います。
Range("G" & 15).Value = "=sum("F" & srow & " : F" & erow)"
Range("G" & 15).Value = "=sum(F" & srow & " : F" & erow & ")" '修正版
この手の課題の解消に20秒以上かかるようなら、変数を含む複数の文字列を結合して新たな文字列を作るための基礎技術が不足しています。
基礎編第2章のドリルを実際にVisual Basic Editorを使って手を動かして練習してください。
くり返し、何のストレスもなくできるようになるまで行う必要があります。
https://forum.pc5bai.com/lesson/page/116
https://forum.pc5bai.com/lesson/page/117
https://forum.pc5bai.com/lesson/page/118
https://forum.pc5bai.com/lesson/page/119
https://forum.pc5bai.com/lesson/page/120
morimotoさんのコメント
(コメントID: 6599)
[1]につきまして今発展1ですが、終了したら発展2の前に非常に関心のあるイベント・フォームの学習をするので楽しみに宿題としておきます。
そしてマクロに関数式を組み込む不便性ですが、ご指摘で不便さがわかりました。sumやcount程度であれば小人ちゃんもがんばってくれると思いますが、関数式だけでもたくさん
あります。それをマクロで関数を実装するのはマクロ作成とちょっと違う感じがしますよね。マクロで関数に見合った実装すればそれで事が足りますよね。たいへんイメージがつきました。そして変数を含む複数の文字列結合----解消しました! 関数式を入れ込むときは何か違う書き方でやるのだと思ってましたが、変数と文字列結合 "と& を基本通りすればできました。疑問点が解消してすっきりしました。
morimotoさんのコメント
(コメントID: 6600)
おなじみの式 goukei=goukei+range("A" & gyo).value
で組み込めるかやってみます!。
小川 慶一さんのコメント
(コメントID: 6598)
マクロでの大抵のワークシート関数の代替(というか、それ以上の)処理はできますからね。
> 関数式を入れ込むときは何か違う書き方でやるのだと思ってましたが
学んだ原理原則を押し通せないか?と、ベタな方法から試すことが大切です。
>おなじみの式 goukei=goukei+range("A" & gyo).value
>で組み込めるかやってみます!。
goukei = goukei + 新たに見つけた値
というやり方は、基礎編レベルの手法です。
集計の方法も、発展編1講座レベルなら .Find メソッド、発展編2講座レベルなら scripting.dictionary、外部連携講座レベルならSQL文を発行、といろいろあります。
とはいえ、基礎編レベルの手法をスラスラできるようにならないと、上級レベルの手法の取得にも限界があります。
「やってみます」ではなく、「できて当然」というレベルに至るまでくり返し演習してください。