GoGoマクロのブログ

初心者向けマクロ講座「Go!Go!マクロ」の筆者三太郎の公式ブログです。

GoGoマクロ

エクセル仕事の自動化が誰でもできる本

「マクロの記録」を利用するべき理由

2021-03-29 06:38:50 | マクロ作成のコツ

コードの利用方法で特に重要な点は、一定した書き方のコードを利用する

ということです。

 

ネットで捜したサンプルコードは、その書き方も、レベルも、人それぞれ

なので、実にまちまちです。サンプルコード好きの人が陥るのは、その都度

そのまちまちな書き方の構文をいちいち新たに学ぶ必要が生じるからです。

 

また、同じ人であっても気分によってまちまちに書く事も多いです。ネット

で探したものの殆どは、書き方も、レベルも、皆まちまちで、且つ、初心者

向きのコードでは決してありません!

 

しかも、これまで何度も言ってきたようにプログラマというのは総じて言うと

みなプライドが高く見栄っ張りな性分がありますので、

素人に簡単に理解されてしまうようなコードを書いて公開したりはしません。

わざわざ難しい表現を使って、自分の実力を(自分がいかに難しい書き方を

知っているのかということを)誇示するために公開するものです。

 

その点、「マクロの記録」で記録されるコードというのはいつでも一定です。

同じ操作をすれば必ず同じコードを書いてくれますし、初心者レベルで一番

やさしい書き方でいつも書いてくれます。それが機械のよいところです。

人間のような変なプライドや見栄や策略めいたものは一切ありませんので、

安心です。

 

コメント

「文字列操作」に強くなろう!

2020-12-22 14:44:36 | マクロ作成のコツ

「よく使う文字列操作の標準関数一覧」のいの一番に挙げてるのが、

「Trim関数」・・・文字データの目に見えない前後のゴミを取り除く

というものです。

私は言ってみればプロの本社区のプログラマーですので、特にこの関数をよく頻繁に使います。

数あるVBA標準関数の中でも、一番によくこれを使ってる言っていいかと思います。

つまり、これは具体的には

    a = ActiveCell.Value
    If a = "三太郎" Then
        MsgBox "私です!"
    End If

といったコードを書いたとします。

けど、もしここの変数の a に入る ActiveCell.Value(選択セルの値)が、

    ActiveCell.Value = "     三太郎"

だったり、

    ActiveCell.Value = "三太郎     "

だったりした場合には、このメッセージボックスの

    MsgBox "私です!"

は、表示されないことになります。特にこの下方の

    ActiveCell.Value = "三太郎     "

の方は、セルのデータとして見た場合、見た目には全くこれはわかりませんから、気づきません。

加えて、何万行もある大量データのシートの中にこれあったら、絶対にこれは(お尻に空白文字が詰まってる)気づけませんよね!?

なので、上記の様なコードを組む際に、

    a = Trim(ActiveCell.Value)
    If a = "三太郎" Then
        MsgBox "私です!"
    End If

とします。

私はプロの職業プログラマーですから、お客様の(ソフト開発依頼主の会社の)データを扱うプログラムを日夜組むのを本業の仕事としていますから、

このコードの様に、仕事で組むマクロ作りでのデータ取得時には、必ずこのTrim関数を噛ませるようしているわけです。

依頼主の会社のデータ、すなわち他人のデータ、(すなわち自分では保障できない不確かなデータ)を扱うことが多いからです。

自分や自分の会社のデータだけを主に扱う皆さんの場合は、言ってみればそれは確かなデータ(たぶん!)ですから、これは特に噛まさなくても全然大丈夫とは思いますが、

他人のデータは自分には何の保障も確証もないわけですから、言ってみればその全てが不確実なデータと言えます。

私の30有余年に渡るシステム屋の経験則から言いますとですが、「このデータには絶対まちがえはない!」そう言い切る顧客のデータほど、いい加減なものが多いです。(笑)

なので皆さんも、

例えば、普段からちょっと信用できなそうな取引先から毎月来る怪しいデータや、仲の悪い隣の部署の担当者からもらったデータやー、など扱うマクロを作る際には、

ちょっとこのひと手間を加えて、

    a = ActiveCell.Value

    a = Trim(ActiveCell.Value)

こう書く習慣を付けておくのがよいかと思います。

基本、他人は信用できません!ですから(笑) 人を見たらドロボーと思え、じゃないですけれど、

他人のデータを見たら、何かしらの不備や欠陥はあるものと思え!ですね。

特に、厳密さが売り物のプログラマー職の心得としてはそのようになりますので、自分や自分の会社の確かなデータだけ扱ってる人以外の人は、文字データの取得時になるべくこのTrim()というのを意識して入れておく、そうしてください。

Excelの場合、それはセルからのデータ取得時だけの話ですから、それさえやっておけば、あとはその変数を使い回す度に、前回も言いましたいちいち

    If a Like "*経理部*" Then

って、このようなちょっと書き間違いをし易い書き方はしなくても、

    If a = "三太郎" Then

だけで、毎回すっきり済むようなるわけです。

言うなれば、

これはプログラミングでの「リスク管理」にもなりますので、このコロナ時代もそうですが、会社でも個人でも、この様なリスクヘッジの考え方いうのは今後ますます重要になってくるかと思います。

コメント

ExcelのVBAで最も重要な構文を一つ挙げなさい!

2020-10-30 19:32:57 | マクロ作成のコツ

さて、

あなたならこれ何を挙げますか?(一つだけですよ!)

本の購入者の皆さんは、先日にお配りした[2020年最新版の
構文集]のテキストファイルをちょっと開いてみてください。

実に沢山のExcelVBA構文(一行一行のコード)の中で、
どれが一番重要なのか?と考えて、ちょっと捜してみて
ください。

ヒント.

「マクロの記録」では記録できないもので、且つ
頻繁によく使う構文


答えは、30秒後!(笑)

  ・
  ・
  ・


正解は、

 n = Cells(Rows.Count, "B").End(xlUp).Row '行の最後

これです!

この答えに相応しい構文いうのは、これしかないです。


そもそものExcelというソフトの特性をよく良く鑑みて
みれば解る通り、「ExcelのVBAで最も重要な構文」とは、
この一文に尽きます。これしかないのです。
これなくしては、Excelのマクロは作れないと言っても
過言ではありません!

(屁理屈を言えば、これ無くてもいくらでもマクロは
作れはしますが笑、けどこれ使わない人は必ず難しい
VBAで書く羽目になりますから、初心者がそれをやって
しまうと、けっしてマクロの上達はできませんよ!)

私なんかは、余りに頻繁にこの構文を使いますので、
いちいち構文集開くのすら面倒なのでIMEに単語登録
をして、これは使っているくらいです。

(単語登録のやり方がもしわからないという人は、
「IMEの単語登録」でネット検索してみてください。)

で、これ正確に言うと「指定した列のデータのある
最後の行番号を取得する(上記例の場合だとB列の)」
為の構文になりますが、

これが、特に重要だと言う理由は、
Excelというソフトの特性と言いますか、Excelデータ
の構成いうのが、大概は縦長(且つ可変)だから・・・
です。

一方の、横長(且つ可変)のExcelデータいうのは、
滅多にはありませんね。

つまり、エクセルの機能には、

横方向(列方向)に、オートフィルターする機能はない。
横方向(列方向)に、集計機能は使用できない。
横方向(列方向)に、ソートもオプション使うしかない。

というわけです。

これがまさしく、Excelという表計算ソフトの特性に
なるわけですから、要するに、Excel表の横方向には
大概が項目名(固定数の)が並ぶわけです。

もし、項目が固定数じゃなくて可変(毎回、横方向
のデータ数が変わる)というデータ構成の表は実に
最悪ですから、殆ど見かけない思います。

故に、

Excelは縦方向の処理がしやすい様にと考えて出来て
いるソフトであるわけです。これ気付いてましたか?

だからこその、

 n = Cells(Rows.Count, "B").End(xlUp).Row '行の最後

この構文が最も重要であるわけです。ExcelのVBAに
数々ある構文の中でも、これが最も重要な一文だと
断言します。

だから、本講座ではメルマガでもセミナーでも教材でも、
この一文の重要性を言ってきましたし、必ず毎回この文
を使ってきた次第です。

けれど、

それを、この本質的な理屈を、知らない人が多過ぎる!

Excelソフトの、そこで扱われるExcelデータの特徴を
全然わかってない人が余りにも多い思うのです。で、
皆その意識もなくVBAを組んでしまっているわけです。

つい先日にも、

 For Each r In Range("$F16:$M16")

と、このようなループの書き方している人からの相談を
受けましたが、まかり間違っても、初心者が誰かに教わ
ったこの様な書き方をマネしては絶対になりません!

これはダメです。

ダメです。

です。

この相談者の方もそうでしたが、誰かのこんな書き方を
マネしている限り超簡単な基本的処理ですらマクロ作れ
ない破目に、必ず陥ります。注意してください。


なお、付け足しにはなりますが、

先ほど横長のデータは縦長に比べてレアケースだと言い
ましたが、けど、横長のデータを扱う場面もないことは
ないとは思いますので、その場合には「横/縦変換」が
手っ取り早くて便利です。

具体的には、横/縦変換したデータを中間的な作業シート
を用いて縦方向で処理をして、それをまた縦/横変換して
元に戻す、というやり方です。

この方法で、先ほど挙げた縦方向にしか使えないExcelの
各種機能がそのまま使えますので(マクロの記録でもー)、
非常にこれならラクですね。

念のため、その手順を書いておきます。

[マクロの記録]→[列を選択]→[コピー]→[ワークシート
を開く]→[貼り付け位置を右クリック]→[形式を選択して
貼り付け]→[行/列の入れ替え]→[OK]

記録されたマクロのコード例)

Sub Macro1()
    Rows("1:2").Select
    Selection.Copy
    Sheets.Add After:=ActiveSheet
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
End Sub

(※なお、縦/横変換して戻す時も、上記の列を行選択に
変えてもう一度マクロの記録からやればよいだけです。)


あと、もう一つお勧めしたいのがこれです。

最後の行の下にデータを追加する方法

今あるデータの下へ次々とデータ追加をする際に、この
とっとした応用も知っておくと大変便利ですね。


と言うことで今回のテーマ、最も重要な構文は?
と問われた場合には、

 n = Cells(Rows.Count, "B").End(xlUp).Row '行の最後

必ず真っ先に、この1行が頭に浮かぶ!(書ける必要は
全くないですが、)というようにしておいてください。

これは、ほんと重要ですよ。これぞ、キング オブ ザ・
「エクセルVBA」ですね!

 

本日は、以上です。

 

コメント

複数のシートを一括でPDF出力する!

2020-10-29 07:36:01 | マクロ作成のコツ

最近のテレワークの普及もありまして、電子化
(ペーパーレス)の流れの中で、ますますPDFへの
ニーズが高まって来ている感があります。

そこで本日は、コロナ禍でタイムリーな
タイトルのこのテーマを取り上げてみます。


で、Excelのデータ(請求書等)をPDFファイルに出力
するいうのは至って簡単ですね。

1枚だけなら印刷機能で手で出せばいいだけです。

この場合、マクロが便利なのは連続での出力です。

顧客数が数十件、数百件、数千件と多くなってくると、
Excelの請求書を1枚1枚手でPDFファイルに落して行く
というのも大変です。

なので、今日ご紹介する下記の内容はそれを1発で、
瞬時に全て自動で出したいという人にはおすすめの
コンテンツになります。

PDFファイルに自動出力するマクロの簡単な作り方


で、これも要するに、ほぼ「マクロの記録」だけです。

そこから、連続で全シートを一発でPDFファイルに
出す所から、それを

 PDFファイルをシート名で自動出力するマクロにも、
 PDFファイルを自動採番で自動出力するマクロにも、

容易に色々と応用していけるわけです。

で、ここでの学習ポイントは、


 "C:\Users\santa\Documents\Book1.pdf"

 "C:\Users\santa\Documents\" & ActiveSheet.Name


 "C:\Users\santa\Documents\Book1.pdf"

 "C:\Users\santa\Documents\" & i


など、この手の「書き換え方」いうのをマスターすれば
よいだけです。

あとは、文字列や変数名を&マークで繋けていく書き方を
どんどん書いて早く慣れる、その繰り返し練習です。

理屈の勉強に固執してしまう人はダメですね。

野球でも、素振りやキャッチボールしないで上手くなる
選手なんて居ませんから、基本的なやり方を習ったら、
あとは考えるより練習あるのみです!

これらの書き換えに慣れてきてこれが得意になってくると、

あとは、先日にメルマガ読者の皆さんに配布した
「固定部分を可変に直す」との組み合わせにて、

初心者でも簡単、容易に「マクロの記録」からの応用が、
得意になっていきます。マクロの習得はその流れですね。


以上、コロナ禍で今後ますますの「デジタル化社会」を
迎えるにあたり、今日ご紹介した上記PDF出力のこの方法
覚えておくと、何かと便利に使えるかと思います。

 

コメント

もっとスマートなコードを書けるようになりたいです。

2020-10-01 09:47:00 | マクロ作成のコツ

よくこのタイトルのような質問を受けます。

これは、気持ちはよくわかりますが、
それはもう少し先に考えることであって、

まだまだ初中級者のレベルの段階では
むしろ余りスマートさにはこだわらずに

結果オーライ主義という感じでやっていったほうが
間違いなく、上達は早いものです。

それは、言うなれば

自分のデスクの上に山積みになった資料や
パソコンの中にもごちゃごちゃになって
雑多に置いてあるデータやファイルが、

普段からそのように身の回りの整理整頓が
中々できていないでごちゃごちゃしてる人が、

「ちゃんと整理してからでないと仕事をしてはいけないよ!」

と、もし上司にそう言われたら
何も仕事が進まなくなってしまうのと一緒なので、

それを(そんな過酷なミッションを)、
自らで自分自信に科してしまうと、

必ずマクロが作れなくなっていきます。

PCの中や机の上がきちんと整理できた状態で
バリバリ仕事の出来る人になりたいのは
理想ではあるんですけど、

それは将来の目標であってまだ先の話なので、
現段階では、

不恰好でいいからどんどん作る!

それに徹していってくださいね。

不恰好に思えるコードをもっとスマートに書き直すために
かかる時間を考えたら、

その時間で別の便利なマクロがもう2個や3個は
作れてしまうだろうと思いますので、、

そのほうがよっぽど自分の為にも、自分の成長になります。
そのマクロで自動化して得られた時間もお得に使えます。

つまり、

スマートなプログラムのコードを書くというのは、
簡単なようで、それはたとえプロであっても
そんなに出来ているプログラマーというのは少なく、

PC内のデータ整理と同様に、
実に高度な技術と精神力を要するものだと
ご理解ください。

 

コメント

変数のタイミング知ってる?

2020-06-21 08:07:22 | マクロ作成のコツ

Go! Go! エクセルマクロをはじめよう!

【質問コーナー】

> n = Cells(Rows.Count, "A").End(xlUp).Row
> この構文もどこに入れていいのか不明です。


ここのn、すなわち変数いうのは、入れ物ですね。

例えば、

なにも入れてないコップ(入れ物)の水は飲めません!

 

コップでも何でも同じですが、入れ物というのは、
必ず中に何かを「入れてから使う」というものです。

変数も、必ず入れてから(代入して)使うものです。

必ず、変数=○○ が先です。

で、

> n = Cells(Rows.Count, "A").End(xlUp).Row

これ(データの最後の行数をnに代入する)
をループで使う場合なら、

For i = 1 To n
n = Cells(Rows.Count, "A").End(xlUp).Row

この順番で書いてしまうと、最初の

    For i = 1 To n

この n にはまだ何も入れていませんから、
空のコップを飲もうとしているよいうなものです。

だから、

入れ物 n に何かを入れるのはこの前でなければ
なりません。入れるのが先です。

つまり、

n = Cells(Rows.Count, "A").End(xlUp).Row ←コップに水を入れる
For i = 1 To n ← その入れた水を飲む

です。
「コップの水は、入れてから飲む」この順番です。


この基本さえ分かって単純に(現実で)考えたなら、
何も難しいことはない思いですね。

 

 

■初心者(入門者)に最適な隠れた名書です !

エクセル仕事の自動化が誰でもできる本(日経BP社)

 
コメント

VBAでよくある勘違い

2020-06-10 11:03:44 | マクロ作成のコツ

「VBAの基礎を分かっていないから思うようなマクロが組めない・・・」

って、よく勘違いしている人をネット等でも見かけますが、、

VBA言語に詳しくなれば思い通りにマクロが組める?
なんてことは、断じて有り得ませんよ。

どんなに日本語が詳しい人でも、それで小説が書けますか?

Excelマクロのプログラミングの場合も、ストーリー(ロジック)が肝心です。
言語は二の次、三の次。

ストーリーが上手くなければ小説は面白くはならないけれど、
下手な日本語であっても面白いストーリだったら
その小説は読んで面白いわけです。

ただの言葉遊びに長けた人の書いた文章なんか、
面白くも何ともないのと一緒で、

ただVBA言語に詳しいだけの人が書いたマクロは、
仕事でなんの役にも立ちません!

だから、特にの皆さんは、言語に詳しくなんかならなくて大丈夫ですから、
ストーリー(ロジック)が立てれることに力を入れて
マクロの勉強はして行ってくださいね。 

 

▼関連記事

「マクロの上級者」と「VBAの上級者」その違いとは・・・

 

コメント

固定→可変のコツで、らくらくマクロ作りしましょう!

2020-06-03 19:24:14 | マクロ作成のコツ
これぞ「マクロ作りの肝!」という話をしてみたいと
思います。


以前にも書きましたが、「マクロ」っていうのは
主にCAD(設計図を描く為のソフト)の世界で発展を
遂げてきたものであります。

読者の皆さんは、Excelの操作が大変だ!面倒だ!だから
マクロの勉強でもしてみるか、ということで、このような
メルマガを読んでくれているのだろうと思いますが、、

こう言っては何ですが、設計図を描くCADソフトの大変さ
と言ったら到底、Excel操作の比ではありません!

Excelが誕生するずっと以前から、そうしたCADの操作に
苦労してきた人達の間で、広く使われて広まったと言うのが
マクロ(操作の自動化)になるわけです。

で、よくExcelVBAの世界では、「マクロの記録」をただの
辞書だという認識で使ってる人が多くおられますが、、

それだと、辞書持ち歩いての学校英語の勉強と一緒なので、
ただ辛いだけですね。

それ故に、Excelの世界ではどうにもマクロが広まらない、
Excelではマクロの利用者極めて少ない現状になってる、
その原因なのだろうと思われます。


話戻しますが、

それで「マクロの記録」(CADで言う所のコマンド記録)
をうまく組み合わせて便利に使う方法いいますのが、Excel
の誕生以前から皆がやってきたマクロ作りの作法です。

その為の(マクロの記録をただの辞書ではなくー、便利な
活きた道具にする為の)肝となりますのが、以下にお話し
する

記録したコードの「固定部分の可変化」というものです。

今回お配りする構文集の最新版には、その様な、すなわち
「固定の部分」を「固定じゃない様に変える」その書き方
集というのをまとめて新たに掲載しましたので、これは

「固定→可変」の方法をまとめた構文集(コード集)です。

つまり、これが「マクロの記録」をフル活用してらくらく
マクロ作りをする為の肝となる、Excelが生まれるずっと前
の昔から、皆がやってきた正しいマクロの作り方の方法
になります。

で、「固定→可変」とは何か?と言うことなんですが、

この最新版にどんなものを載せのたかを、具体的に詳しく
以下に説明します。

まず、たとえば、ループを回す際の回数の場合です。

 For i = 1 To 20

これは、20回の固定です。ループは1~20回、回ります。

 For i = 1 To 100

これも100回の固定です。同様にループは100回回ります。

で、データ数がその都度変わるという場合には、これを

 For i = 1 To 100
↓
 n = Cells(Rows.Count, "B").End(xlUp).Row
 For i = 1 To n

この様に、いつもここのレッスンでやっているこの
構文(指定した列のデータのある最後の行までループを
回す処理の意味。)

これが、行方向に関するループ処理での「固定→可変」
のコードの基本的な直し方になりますので、

これで、データ数が毎回変わるシートを処理する際にも、
プログラムの修正は一切不要、そのまま(別のデータで)
データ処理が自動化できるようになります。


また、シートが固定名の場合には、たとえば、データの
並べ替え(ソート)をマクロの記録で記録した場合に、

 ActiveWorkbook.Worksheets("Sheet1").Sort・・・

といったコードが記録されてきますが、

ここに出てくるシート名の部分の"Sheet1"、
これは固定の名称となっていますので、このままだと
"Sheet1"上のデータしかソートはできないマクロです。

ですから、
ここも「固定→可変」にちょっと以下の修正をして

 ActiveWorkbook.Worksheets("Sheet1").Sort
↓
 ActiveWorkbook.ActiveSheet.Sort

(Worksheets("Sheet1")をActiveSheetに直すだけ)

数か所ある"Sheet1"の部分を探してこう直してやれば、
いま開いてるシートのデータに対してのソート処理を自動化
できるマクロに簡単に変身させることができます。

これが、シート名の「可変方法」の一つです。

でもう一つ、シートの「可変方法」として背番号を使います。

エクセルのBookに存在する各シートには、(名称に関わらず)
左から順番に内部的な番号が割り振られています。
一番左側にあるシートがSheets(1)です。

この番号を使って、たとえば

 ActiveWorkbook.Worksheets("Sheet1").Sort・・・
↓
 Sheets(i).Sort・・・

(ActiveWorkbook.Worksheets("Sheet1")をSheets(i)に直すだけ)

これで、iで回すループの中で、全てのシートを次々とソート
していく為のマクロが容易に組めます。これもシート名の
「可変化」です。

ちなみに、シートの数は Sheets.Count で取得できますので、
下記の使用例(構文集に掲載)を参考に、これで「シート数
の可変」に対応したマクロも容易に組むことが出来る思います。

使用例)
Sub Macro1()
    n = Sheets.Count
    For i = 1 To n
        Sheets(i).Select
        MsgBox ActiveSheet.Name
    Next i
End Sub

こうすると(シートの背番号を使うことで)、沢山のシートで
同じ処理をしたいと言った場合にも、マクロで全シートの一発
処理が可能となりますから、同様なデータのシートが沢山ある
Bookを扱っている人には、これは大変便利ですね。

初心者の方は、シートを複数作って(適当にシート名変更して
みてー)、ぜひこれ試してみてください。


以上のデータ数やシート数の「固定→可変」の例の他にも、

・Book数の可変のやり方だったり、
・図形やグラフについての可変だったり、

も、色々構文を載せています。

コメント

初級マクロ検定の結果発表

2020-05-26 06:27:21 | マクロ作成のコツ
遅くなりましたが、10日の日曜日に実施いたしました
「初級マクロ検定」の結果報告です。

今回も、想定合格率を6割に設定して作ったレベルの問題を
出題いたしましたが、結果、5割を少々下回る

合格率45.8% の結果となりました。

予想外に低調な合格率となってしまったその原因ですが、
それは実に今回明確でした。

不合格者の半数近くに皆同じちょっとしたミスが見られ
まして、もし、そのちょっとした共通の間違えさえなければ、
今回の合格率は7割を超えたかと思われます。ので、、

本日は、不合格者の皆さんに多く見られたミス初級者が間違えやすい部分について、述べてみたい思います。

その箇所と言いますのは、ひと言で言えばプログラミング
のバグでよく見られる「初期化」のミスです。

以下に、これ詳しく解説します。


「初期化」とは、すなわち「使い始める前の状態に戻すこと」の意味に
なりますが、プログラミングの場合、主にこれは
変数(データの入れ物)を使う場合によく使われる
言葉になります。

ただ、ここで皆さんと勉強しているプログラミングというのは
Excelのプログラミングになるわけですから、
そのデータの入れ物は主にExcelのシートの中だということになります。

これこそが、一般のプログラミングマクロのプログラミングとの最大の違いだと言っても過言ではありません!

すなわち、今回の初期化はシートの初期化
「シートの状態を元に戻すこと」との意味になります。

それで、今回の試験問題に関して具体的には、

一度マクロを実行して処理した結果(C列に出した出力データ)
が、2回目以降のマクロ実行時に、それを最初に削除しておく
必要があるわけですが、

データ数が固定、もしくは数減らないという前提条件があって
出力欄の全データは必ず上書き、もしくは新規の書き込みだけ
との保証がある場合には、わざわざ前回の出力データのクリア
というのは必要がありません。

ですが、今回のように「データ数が減る場合も想定せよ」との
場合になると、出力データのクリアというのが必修であるわけ
です。

で、不合格者に多かったこの部分のプログラムが、

    n = Cells(Rows.Count, "A").End(xlUp).Row
    Range("C1:C" & n).Select
    Selection.ClearContents

といったものです。これ、実に惜しいです。

この場合に消す必要のある前回の出力データの数は(データの
最後の行になる n に入れるのは)、A列(入力列)ではなくて
C列(出力列)の行数になります。

よって、正解はこの1行目の列名指定の部分を、ただ単に

    n = Cells(Rows.Count, "A").End(xlUp).Row
↓
    n = Cells(Rows.Count, "C").End(xlUp).Row

(AをCに変えただけ)これだけです。

けど、

これは、コード的には上記ほんの1文字違いの些細なミスのよう
でもありますが、プログラミングの根幹を成すロジック(処理の
考え方)としては、バグの原因になりやすい大きなミスと言える
間違いです。

プログラムのロジックとしては、これは言うなれば、

n = Cells(Rows.Count, "A").End(xlUp).Row '今回の入力数
m = Cells(Rows.Count, "C").End(xlUp).Row '前回の出力数

となりますので、この2つの変数(入れ物)は分けて考えた方が
いいわけです。


で、

この様な考える時(ロジックの思考時)に是非おすすめしたい
方法が、とにかく「紙に書く」という方法です。

私の本をお持ちの方は是非169ページにある「上達のヒント」
というページをみて頂きたいですが、

初心者がこの様な図形でのフローチャートを書くというのは
中々難しい思いますから、次の170ページにある説明を参考に
して日本語の文章で(箇条書きで!)書く、

且つ、これは何も紙上でなくてもいいですから、プログラム
の中に「コメント文で書く」すればよいわけです。
たとえばですが、

 'これ、どこまで消せばいいのか?

って、自分のプログラムのどこかに書き込んでみるのです。

ロジックは書かないと絶対にダメです。頭の中にあるだけだと、
「設計図のない家はうまく建ちません!」ですから、それは、
いつまで経ってもマクロ作りが上達しない人の一つの大きな
原因にもなっています。

ぜひ、このようなロジックの考え方は紙に(コメント文に)
書いて、「文字にして考える」というクセを付けるようして
ください。頭の中だけで考えてやっていると、必ずミスが起
こります。

で、この場合には、

 'これ、どこまで消せばいいのか?

こうコメント文で書き込んでおけば、必然的に

 'これ、どこまで消せばいいのか?→それはC列の全部だ!

ってなりますから、そしたら、わざわざ「データの最後の
行まで」とする必要性なんかないのに気付く思います。
C列のデータは全部消しちゃえばいいだけだ~、と。

よって、ここは「マクロの記録」でC列削除を記録して
自動でできる(マクロの記録→列名をクリックしてC列全体を
選択→Delキー押す→記録の終了、この手順で)

〇
    Columns("C:C").Select
    Selection.ClearContents

このコードを用いれば、たったこの2行のそのまんまで済みます
から、マクロの記録だけやれば何の修正の一つも必要ないです
から、

×
    n = Cells(Rows.Count, "C").End(xlUp).Row
    Range("C1:C" & n).Select

こんな面倒は一切必要なかったことに気付き、一瞬で作れる
プログラムになるわけです。

急がば回れ!ちょっと立ち止まって設計図を紙に書いてみる
(コメント文で書き込んでみる)、素早く効率よくマクロを
作る為のコツがこんなところにもあるわけですね。


以上、本日は今回の検定で特に合否の明暗を分けました
「初期化」に関する解説でした。


なお、合格者の皆さんには先週に「合格証書」をお送り
致しました。合格した皆さん、おめでとーう!!

惜しくも不合格だった皆さんは、今回の説明を実践して
ややこしい処理は「コメントに書く」この練習して頂いて、
次回(たぶん秋頃に)またチャレンジをお待ちしてます!!

 マクロ検定の紹介ページへ
コメント

本購入者 プレゼント!<マクロ構文集の電子ファイル>

2020-05-25 06:49:35 | マクロ作成のコツ
当マクロ講座の公式テキストとも言える本が出まして、丁度
3カ月が経ちました。とにかく、私の人生でも初めてとなる
「人生初の書籍出版」となりました。

けれど、正直、期待に反して何故だか全く売れてません!(笑)

当講座で教材を出せば、ほんと数万円もする教材が飛ぶように
売れていくわけなんですが、何故だか今回、この2千円の安い
本は全然売れない・・・。

まぁ、このようなコロナ時期でタイミング悪かったということ
もあるかとは思いますが、「本は中身で売れるんじゃない。」
という噂を、今回まじまじと実感した次第です。(本選びは
難しいー)

それにしても、企画していた全国20か所の(いや、35か所!)
出版記念のセミナーやらワークショップやら、全部中止を余儀
なくされたのが、痛恨の極みであります。(泣)
日本全国巡りたかったぁーーーーー!!!!!


そんなこんなの中ですが、

私を信じて(!?)この本を買ってくださった読者の皆さん方に、
ぜひ感謝の気持ちを込めましての何かお礼を!と思いまして、

何か良いものはないかな~と考えていましたら、感想のメール
をくださった何人かから、最後の付録に載っている「マクロの
初級構文集」いうのはとても便利だ、とのお褒めの言葉を頂戴
しましたですが、(そこっ?笑)

それで、その2ページを全部Excelに手で打ち込んでコピーして
使ってると言う人まで現れまして、それは、全部打つのも大変
ですし、打ち間違えもあるでしょうし、事前に言ってくれたら
原稿の元電子のファイルであげたのにー、と思いまして、、

で、本の購入者の皆さん全員にその構文集を元の電子ファイル
(Excelの)にてプレゼントしたいと思います。手間なくこれ
使ってくださいね。

それと、

それに加えて、初・中級構文集の[最新2020年版]を作りました
ので、それも一緒にプレゼント致します。

今回の[2020年版構文集]には、新たに当講座のマクロ作りの
真骨頂でもある、

「固定→可変」の変換例の一覧
(「固定の部分」を「固定じゃない様に」変える書き方集)

いうものを、今回新たに追加して載せました。

これで、「マクロの記録」のそのままでは使えない(セル名
やシート名、その他もろもろの)固定された部分の修正が
楽になる(殆どコピッペでできるよになる・・)思います。

これさえあれば大概のマクロは、
「マクロの記録+α」で素早く組めるようなりますから、
これは、可也の必見!ですよ。(たぶん!)


先日の検定試験でもそうですが、
プログラミングというのはVBAでもどんな言語でもそうですが、
構文を覚える必要というのは全く無いわけです。
そうした機能があるということだけを覚えていれば、それで
いいだけです。

それで、素早くプログラムを組む為に自分が良く使うであろう
1行1行の構文を並べてテキストファイルなんかに保存した構文
集を作って自分のパソコン上に置いておけば良いだけですね。

いちいちネットで調べていたら、探し当てるまでに&それ理解
するのに、更には必要ない情報まで沢山入ってきてしまうので、
余計な時間ばかりが掛かってしまう事になりますから、必要な
時に自分が見慣れた場所から(コンパクトに並べた一覧から)
コピッペして構文は使い回す、というのが素早いわけです。

「初・中級VBA構文集 2020最新版」

 目次
●セルの選択
●セルの操作
●シートの操作
●文字列の操作
●日付の操作
●ブックの操作
●テキストファイルの操作
●図形の操作
●時間管理
●エラー処理
●高速化
●その他メモ
●固定を可変に直すパターン集 ←※今回新規追加の項目です


なお、この本購入者プレゼント企画は今月いっぱいまで(6/1
にダウンロード一斉配布予定)となりますので、ご希望の方は
必ず今月末までに、お早めに下記からご応募ください。

但しなんですが、

誰が本買ったかいうのは私にはわからないですから、この応募
画面に簡単なクイズを出しています。本見て答えを書き込んで
ご応募ください。
(本を持ってる人であれば誰でも簡単に答えられる超簡単な
クイズ!です。)
(また、Kindle等の電子版のの購入者でも大丈夫です。)

本購入者プレゼント企画応募フォームへ
※終了しました。

何ごとにも、固定であれば簡単だけど、固定じゃないから
難しいわけですね。

だから、「固定→可変(固定じゃなく)」することこそが、
マクロで(自動化で)最も重要なわけです。

だから、当講座では本でも教材でも、マクロ作りのレッスン
勉強で、その「固定じゃなくする方法」を重点的に勉強して
いるわけです。(主にはループの中で、です。)

それでこそ、「マクロの記録」がただの辞書ではなく、
生きた使い方というのができるようなって行くわけですね。
「マクロの記録」をただの辞書だと考えてしまうと、
せっかく便利な機能が生きてこなくなってしまいますから。


それでは、コツを掴んで、素早く手間なく便利に楽しく、
今後もマクロ作りやっていきましょう!!
コメント (1)