パソコン仕事5倍塾
35,000人を指導した東大卒・元日本IBM社内講師が直伝
MENU
morimotoさんの投稿
(投稿ID: 4716)
Sub GWtoshinarabiake() '20200509 'ここでは商品順に並び変え、各商品を転記する Worksheets("自粛練習").Activate '商品を転記 Dim tate As Integer Dim key As String Dim gyo As Integer Dim mgyo As Integer mgyo = Range("a" & Rows.Count).End(xlUp).row tate = 3 key = "" '年で並び替え Call Range("a1" & ":" & "f" & mgyo).Sort( _ key1:=Range("e2"), order1:=xlAscending, _ Header:=xlYes) For gyo = 2 To mgyo If key <> Range("e" & gyo).Value Then key = Range("e" & gyo).Value Range("H" & tate).Value = key tate = tate + 1 End If Next gyo End Sub Sub toshishohinnarabikae() '年→商品で並び替え Worksheets("自粛練習").Activate Dim mgyo As Integer mgyo = Range("a" & Rows.Count).End(xlUp).row Call Range("a1" & ":" & "f" & mgyo).Sort( _ key1:=Range("b2"), order1:=xlAscending, _ key2:=Range("e2"), order2:=xlAscending, _ Header:=xlYes) End Sub Sub GWexecise1() 'sum関数で商品-年ごと算出 Worksheets("自粛練習").Activate Call GWtoshinarabiake Call toshishohinnarabikae Dim gyo As Integer Dim mgyo As Integer Dim tate As Integer '転記先のタテ位置 Dim yoko As Integer Dim key As String '年 & 商品のkey Dim key1 As String '年のkey Dim key2 As String '商品のkey Dim toshi As String '年 Dim shohin As String '商品 Dim srow As Integer 'sum関数の始期 Dim erow As Integer 'sum関数の終期 mgyo = Range("a" & Rows.Count).End(xlUp).row tate = 3 yoko = 0 key = "" key1 = "" key2 = "" srow = 2 For gyo = 2 To mgyo toshi = Range("b" & gyo).Value shohin = Range("e" & gyo).Value If gyo > 2 Then If key <> toshi & shohin Then key = toshi & shohin If key1 <> toshi Then 'gyo>2の条件下でkeyが変わりtoshiも変わった とき key1 = toshi If key2 <> shohin Then 'gyo>2の条件下でtoshiもshohinも変わっ たとき erow = gyo - 1 Range(Chr(73 + yoko) & tate).Value = "=sum(F" & srow & " : F" & erow & ")" srow = gyo yoko = yoko + 1 tate = 3 '---タテ位置を3にリセット Range(Chr(73 + yoko) & 2).Value = key1 & "年" End If Else 'gyo>2の条件下でkeyが変わりshohinが不変のとき key2 = shohin erow = gyo - 1 Range(Chr(73 + yoko) & tate).Value = "=sum(F" & srow & " : F" & erow & ")" srow = gyo tate = tate + 1 '下へシフト End If End If Else 'gyo=2のとき Range(Chr(73 + yoko) & 2).Value = toshi & "年" key = toshi & shohin key1 = toshi key2 = shohin End If Next gyo 'For Nextを出た後にラスト分転記 erow = gyo - 1 Range(Chr(73 + yoko) & tate).Value = "=sum(F" & srow & " : F" & erow & ")" End Sub
小川慶一さんのコメント
(コメントID: 6569)
morimotoさんのコメント
(コメントID: 6585)
(コメントID: 6586)
Sub kansu() Dim srow As Integer Dim erow As Integer srow = 2 erow = 14 Range("F" & srow & " : F" & erow).Select 'ここはこびとちゃんに怒られずちゃんとなる 'では(かっこ)の部分を関数式に挿入してみる 'Range("G" & 15).Value = "=sum("F" & srow & " : F" & erow)" 'これだとコンパイルエラー 修正候補:ステートメントの最後 とエラー Range("G" & 15).Value = "=sum(F" & srow & " : F" & erow & ")" 'このように書くとうまくいく End Sub
(コメントID: 6587)
(コメントID: 6599)
(コメントID: 6600)
(コメントID: 6598)
たった1ヶ月で人生が劇的に変わりました
佐藤信さん
役員クラスの方から高い評価を受けるようになりました。
佐賀県 - 岩本徹さん
今までまったく知らなかったショートカットキーを使いまくっています。
東京都 - 鷹觜慶さん
年齢60才間近、営業で外回りの時間が多い私でも退社時間が1-2時間程度早くなりました。
東京都 - 宗内隆明さん
受講前もすでにパソコン得意でしたが、そんな私でも受講して本当に良かったと思えた講座です。
東京都 - 佐伯とも子さん
ここまで包括的に仕事に役立つ深い学びを受けれた講座は初めてでした
東京都 - 飯田倫子さん
2024年05月01日 14:04
2024年04月30日 17:13
2024年04月27日 15:36
2024年04月25日 07:00
2024年04月23日 21:36
2024年05月01日 18:39
2024年05月01日 18:17
2024年05月01日 17:47
2024年05月01日 15:18
2024年05月01日 15:01
2022年02月24日 10:59
2019年12月23日 05:57
2019年09月20日 12:29
表示できる投稿はありません。
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
2022年02月02日 00:00
2022年02月02日 03:00
2022年02月02日 06:00
2022年02月02日 09:00
2022年02月02日 12:00
2024年02月15日 18:30
2024年02月09日 17:05
2024年01月19日 13:00
2023年12月31日 17:00
2023年12月21日 14:00
2024年05月02日 10:38
2024年05月02日 05:00
2024年05月01日 18:30
2024年04月27日 23:02
2024年02月28日 14:53
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文を発行、といろいろあります。
とはいえ、基礎編レベルの手法をスラスラできるようにならないと、上級レベルの手法の取得にも限界があります。
「やってみます」ではなく、「できて当然」というレベルに至るまでくり返し演習してください。