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

プログラミング

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

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

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

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

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

x.com

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

25本目:マトリックス表をDB形式に変換

25本目は表形式の情報をDB形式の情報に変換する課題です。

転記元となる表形式のA列はセル結合されています。

そのため最終行の取得にA列を使うのは手間なのでセル結合されていないB列を使って取得しています。

データの開始行列と最終行列が決まれば後は2重ループですべてのデータを取得していき、DB形式のデータの該当項目(列)へ出力しました。

このパターンは一般的な業務で結構頻繁に要望がありそうなので出来るようになっておくと仕事の幅が広がりますね。

26本目:ファイル一覧作成

26本目はフォルダ内のファイル一覧の作成を行う課題です。

むむ、ソースコードが貼れてなかったですね(;^ω^)

026_ソース

フォルダ選択ダイアログを実装するにはいくつか方法がありますが今回は「FileDialog」を使用しました。(選んだ理由は最初に目に留まっただけで深い意味は無いです)

ファイルやフォルダを扱う場合にはほとんどFileSystemObjectを使用しているので今回も漏れなく使って実装しています。

拡張子の判定はメインロジックに書くとごちゃごちゃしそうだったので別関数化してよびだしています。

「サブフォルダは不要」の条件があったので再起処理は実装していません。

27本目:ハイパーリンクのURL

27本目はハイパーリンクを操作する課題です。

実装は今までと同様、データをすべてループで確認する方法で行いましたが解説ではワークシートのハイパーリンクオブジェクトが使われていてセルだけじゃなくワークシートからも操作できる事を知り勉強になりました。

やはりVBAのスキルだけではなくExcelの基本的なスキルも必要だなと考える課題でした。

28本目:シートをブックに分割

28本目はシートを別ブックとして分割する課題です。

シートを新規ブックへコピーする実装でシート数分繰り返すようにしました。

「再実行を考慮」との事だったのでフォルダは存在していれば利用し、存在しなければ作成するようにしました。

解説を確認して非表示シートの考慮が漏れている事が判明しました。(完全に抜け落ちてた)

部署フォルダの扱いについてもExcelシートがマスタと想定した場合、再実行の度に部署フォルダごと削除してしまうのが良さそうですね。(僕の実装ではシートを消して再実行すると消したシートのブックが残ってしまう)

29本目:画像の挿入

29本目はセル内に収まるように画像を挿入する課題です。

ファイル選択ダイアログのフィルタ設定は省きました。

画像の挿入はマクロの記録で「Pictures.Insert」となったので、これを利用しました。

挿入した画像はセルに収まるように拡大・縮小が必要なので画像とセルの比率をそれぞれ縦と横で計算しました。

画像の位置も中央に合わせるため、TopとHeight、LeftとWidthを使って求めました。

「アクティブセルにリンクしない図」が分からなかったですが解説を見て元ファイルとのリンクの事で元ファイルを消すと影響受けるからリンクを外すという指示だったことが分かりました。

なのでこの実装にはそれが考慮できていないため、元ファイルを削除すると図がリンク切れになると思います。

30本目:名札作成(段組み)

30本目はDB形式のデータから名札用レイアウト(段組み)に出力する課題です。

名札の段組みは例にあるように上下2セル1組とし、列側は2で行側を増やしていく考えのようです。

基本的な考え方は25本目の表形式をDB形式に変換する方法と逆の事をやれば良いだけです。

ただ、レイアウトは書式を含めて崩さないようにするため、先にデータの数を把握し、その分だけ先にレイアウトをコピーしました。

コピーする回数はデータ数を2で割り、小数点以下を切り上げする必要があります。

そこでVBAに準備されている「Round」関数を使いがちですがこれが曲者で偶数側へ丸めてしまいます。(1.5⇒2、2.5⇒2、3.5⇒4)

計算結果を整数型に代入しても内部で「Round」関数が働くようで同じ結果になります。

VBAには切り上げ、切り捨てが無く、Excel関数の「ROUNDDOWN」「ROUNDUP」を「WorksheetFunction」で使う事が出来るのですがExcel以外のVBAでも使いまわす事を考えてVBAだけで解決する方法を考えました。

その結果、「([数値] \ 2) + ([数値] mod 2)」という計算方法を実装しました。

まとめ

VBA100本ノック、その5として25本目~30本目までやってきました。

次回の記事にてやっとこ1/3を超えそうです。

徐々に難しくなってきましたが新しい発見も出てくるのでスキルアップには持って来いな企画ですね。

完走目指して頑張ります。

コメント

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