Excelマクロ 「エクセルの神髄」100本ノック参加します(その2)

プログラミング

神髄さんからの挑戦状、100本ノックの続きです。

前回は6本目までやりました。

エクセルの神髄」さんのツイッター連動企画100本ノックです。

VBA100本ノック:マクロVBAの特訓|エクセルの神髄
VBAを習得するには実戦あるのみ。書籍を読んだり、WEBページを見ているだけでは自分のものになりません。知識だけでは実戦で使いこなせません。実際に書いて動かす。VBA100本ノックを通して自分のものにしてください。

ツイッターでのタグ検索結果はこちら

x.com

それでは早速7本目からいってみよう!!

7本目:日付データの扱い

7本目は日付(らしき)文字列からその月の月末を出力する課題です。

日付かどうかの判定をCDateに任せた横着仕様ですが結構使える感じでした。

6行目の「.(ピリオド)」区切りの日付書式が日付と判定されなかったのでここら辺を救いたい場合には判定前に加工が必要ですね。(区切り文字の「.」を「/(スラッシュ)」や「-(ハイフン)」に置換するなど)

8本目:点数の合否判定

8本目は点数から合否判定を行う課題です。

ツイートに書いてある通り、合計はそのまま加算して各項目は1つずつ判定しています。

これぐらいの内容であればExcel関数を使った方が良いかなと思います。(このVBA100本ノック自体VBAの勉強なのでVBAで組む事になれるためにやりました)

9本目:フィルターコピー

9本目は合格者の名前一覧を別シートへ出力する課題です。

データを配列へ格納し、データ内をFor文でループして合格者の氏名を別シートへ出力するように組みました。

解説ではタイトル通りフィルターを使った方法が解説されているのでその方法を使った方が処理時間もソースコードも短くなるのでこの実装方法はお勧めしません。(今回は12件くらいなので違いが出てこないですが件数が増えるとかなり違ってきます)

10本目:行の削除

10本目は不要行の削除を行う課題です。

今回は9本目の解説を参考に削除対象行を特定しました。

条件が複数項目にまたいでいるのでフィルター条件に注意する必要があります。

削除は行数の小さい順から行うと削除した行以降がずれてしまうのでFor文のループを行の大きい方から小さい方にして大きい方から行削除するようにしています。

11本目:セル結合の警告

11本目はセル結合しているセルを特定し、警告のメモ(旧コメント)を入れる課題です。

範囲のセルをFor Eachでループし、結合セルはMeargeAreaのCountで判定しました。

解説にはExcelの検索機能を使って実装する方法が紹介されていました。

検索機能は機能が豊富なので使えるところは使っていくと良いと思いますがパラメータを省略する場合には注意が必要です。

検索機能の関数「Find」のパラメータはExcelの検索機能のオプションと共有していてパラメータを省略した場合は前回の設定を引き継ぐようになります。

神髄さんのところでもそれについて記事を書かれています。(真ん中あたりの「2.指定オプションがシート操作とリンクしている」の項目)

VBAのFindメソッドの使い方には注意が必要です|VBA技術解説
vbafindでの検索が極めて多く、Findメソッドは検索からの流入ではトップクラスです、アクセス解析で分かった事ですが正直少し戸惑っています。なぜなら私はFindメソッドをほとんど使いません、Match関数や配列を使って処理したほうが高速かつ確実に動作するからです。

12本目:セル結合の解除

12本目はセル結合を解除する課題です。

結合セルの特定方法は11本目と同じで実装しました。

入っている値は解除後のセルに均等に割り振りが指示されていますが端数処理方法は任意と委ねられていたので割り算した結果をCLngへ丸投げして結果を解除したセルへ代入しました。

まとめ

VBA100本ノック、その2として7本目~12本目までやってきました。

必要なデータを特定するためにExcel標準のフィルターや検索などの機能を利用する事でVBAでの実装が簡単になったり見やすくなったりします。

Excelの機能を知っていると知らないではVBAマクロで作れる幅も変わってきますのでExcelの機能についての勉強もVBAマクロの勉強につながります。

コメント

タイトルとURLをコピーしました