神髄さんからの挑戦状、100本ノックの続きです。
前回は18本目までやりました。
「エクセルの神髄」さんのツイッター連動企画100本ノックです。
ツイッターでのタグ検索結果はこちら。
それでは早速19本目からいってみよう!!
19本目:図形のコピー
19本目は図形をコピーする課題です。
コピー&ペーストを行ったけどオートシェイプが図形に変わってしまい、解決方法が分からなかったので他の方法を調べて「Duplicate」関数を使う事にしました。
対象がオートシェイプだったのでShapesを回してTypeがオートシェイプの物だけを対象としました。
20本目:ブックのバックアップ
20本目は開いているブックのバックアップを行う課題です。
「バックアップする以上はまずは現状を保存すべきだろう!!」という実装に楽な方向の考えで仕様を決めました。
保存をしてしまえば後はファイル操作のコピーなのでそれが得意なFileSystemObjectを使いました。
コピー元の特定はThisWorkbookのFullNameを使い、コピー先はFileSystemObjectを使って特定しています。
21本目:バックアップファイルの削除
21本目は特定のバックアップファイルを削除する課題です。
日付の特定をブック名の「yyyymmddhhmm」という文字列から特定するため、そのままでは実行日を含めた30日分の判定ができません。
僕はこの文字列から「Format」を使って日付のシリアル値に変換し、「DateDiff」を使って実行日(当日)を含め30日以内かどうかを判定しています。
22本目:FizzBuzz発展問題
22本目はFizzBuzz問題をExcelにアレンジした課題です。
「FizzBuzz問題をExcelにアレンジした課題」と書きましたが僕はこの「FizzBuzz問題」という言葉を初めて聞きました。
調べてみるとプログラムが組めるかどうかを確認するための簡単な課題だという事が分かりました。
なるほど、納得です。
で、僕はおそらくオーソドックスな考え方の組み方をしています。
値に定数値を使っていますがやりたい事はだいたい皆さんと同じですね。
後はSelect文をささっと思いつかなかったのでIf文に逃げました。
23本目:シート構成の一致確認
23本目はシート構成の一致を確認する課題です。
1つ目のブック構成をまずは調べておいて2つ目のブックで一致する物があるか判定を行うように実装しました。
課題には詳細不要との事でしたが一致のブック、不一致のブックとそのバリエーションを作って確認するのが面倒だったのでバリエーションの確認を詳細判定で代用しました。
ただ、このあと解説を確認してこの実装では1つ目のブックに存在して2つ目のブックに存在しないケースを検出出来ていない事が判明しました。
解決方法としては1つ目のブックから2つ目のブックに対して紐づけを追加して行う必要があります。(一致、不一致判定だけであればシート数の判定を追加するだけでも可能)
24本目:全角英数のみ半角
24本目は全角英数のみ半角にする課題です。
変換処理の要件は「英小文字は英大文字」「全角の英数文字は半角」でした。
まずはStrConvを使って一括変換をかけたところ、全角カタカナまで半角になってしまい、要件を満たせないため別の方法を検討しました。
色々考えてみましたが結局1文字ずつ判定と変換を行う方法に落ち着きそれを実装しました。
大文字化は「UCase」、半角化は「StrConv」で「vbNarrow」を使いました。(大文字化に「StrConv」を使わなかった理由は個人的に「StrConv」が意図通り動いてくれるか心配なので多用したくないという個人的な気持ちがありました)
この後、解説を見てもっとスマートに書かれている補足があったのでそちらを参考にしてもらった方が良いかもしれません。
まとめ
VBA100本ノック、その4として19本目~24本目までやってきました。
やはり深く考えずに組んでしまうと考慮漏れなど発生してしまいました。
プログラムを組むのは後回しにしてまずは頭の中でも良いのでしっかり仕様検討と設計する事が大事ですね。
コメント