エクセルの列ソートについて
2022年06月22日
エクセルで列をソートする機能はない。
しょうがないので、自作で作ることにした。
作る前に同じようなものを作った人がいないかグーグル検索。
列ソートできんじゃん。。。
しょうがないので、自作で作ることにした。
作る前に同じようなものを作った人がいないかグーグル検索。
列ソートできんじゃん。。。
PR
集計用列を挿入するマクロ
2022年06月21日
過去の記事「列集計マクロの改良」に書いた通り、
マクロをがんばって改良したけど、そのマクロがない環境で同じ集計をやることになってとっさに別の方法を発見。
集計に必要な情報を書いた列を追加すればいいじゃん。。。
UI設計は、列集計マクロと同様にmsgboxとInputboxを使って
数値の除去の有無と取得する文字数を設定。
ちなみに数値を除去する処理は、当初ワイルドカードを使っていたけど
配列の計算なので圧倒的にforループの方が速かった。
ワイルドカード
https://vbabeginner.net/extract-non-numeric-characters-from-strings/
セルを配列に格納して、計算してからセルに戻す処理。
便利なので使うようになったけど、セルが1つしかないと
変数が配列じゃなくなって型エラーが出る。。。(将来対応だな)
書式については、タイトル行の次のセルの書式に合わせた。
マクロの中であれこれでてしまうと、
どのように出したかが追えなくなるので、
集計用の列を追加する方法は可読性の面でも有利だな。
以下、ソース。ソーステキストは こちら。
マクロをがんばって改良したけど、そのマクロがない環境で同じ集計をやることになってとっさに別の方法を発見。
集計に必要な情報を書いた列を追加すればいいじゃん。。。
UI設計は、列集計マクロと同様にmsgboxとInputboxを使って
数値の除去の有無と取得する文字数を設定。
ちなみに数値を除去する処理は、当初ワイルドカードを使っていたけど
配列の計算なので圧倒的にforループの方が速かった。
ワイルドカード
https://vbabeginner.net/extract-non-numeric-characters-from-strings/
セルを配列に格納して、計算してからセルに戻す処理。
便利なので使うようになったけど、セルが1つしかないと
変数が配列じゃなくなって型エラーが出る。。。(将来対応だな)
書式については、タイトル行の次のセルの書式に合わせた。
マクロの中であれこれでてしまうと、
どのように出したかが追えなくなるので、
集計用の列を追加する方法は可読性の面でも有利だな。
以下、ソース。ソーステキストは こちら。
再帰フォルダ作成スクリプト(VBScript)の改良
2022年06月21日
前に書いた記事「デバッグログを出力するVBScript」で登場したフォルダ作成モジュールを改良したら思わぬ不具合が出てハマったお話。
※ 本文の「\」は半角の「¥」のことです。
そのモジュールmakeDirEX(Path)は、Pathで指定したフォルダを親フォルダから順に作る。
すでに作ってあればなにもしないという万能な処理。
フォルダ作成処理って、親フォルダがなかったり、すでに作られてたり
エラー要素が結構あるので、我ながら便利だと思う。
ただし、受け渡すパスを間違えるとやたら深いフォルダが作られる。。。
Pathで受け取った文字列を\でSplitして、要素の若い順にフォルダ有無を調べてなければ作る。NASのように\\で始まるPathは非対応だったけど、利便性のため改良することにした。
"\\"で始まるパスならNASと判断して、
パスから"\\"を除外して、basePath を"\\"に設定。
"\\"の次の文字から"\"区切りで順次フォルダ作成処理がされる。
当初、引数であるPathから"\\"を除外して処理していたが、
プロシージャの外に出ても"\\"が消えたままになってるし!!
引数は編集するな!が正解?
以下、ソース。
※ 本文の「\」は半角の「¥」のことです。
そのモジュールmakeDirEX(Path)は、Pathで指定したフォルダを親フォルダから順に作る。
すでに作ってあればなにもしないという万能な処理。
フォルダ作成処理って、親フォルダがなかったり、すでに作られてたり
エラー要素が結構あるので、我ながら便利だと思う。
ただし、受け渡すパスを間違えるとやたら深いフォルダが作られる。。。
Pathで受け取った文字列を\でSplitして、要素の若い順にフォルダ有無を調べてなければ作る。NASのように\\で始まるPathは非対応だったけど、利便性のため改良することにした。
"\\"で始まるパスならNASと判断して、
パスから"\\"を除外して、basePath を"\\"に設定。
"\\"の次の文字から"\"区切りで順次フォルダ作成処理がされる。
当初、引数であるPathから"\\"を除外して処理していたが、
プロシージャの外に出ても"\\"が消えたままになってるし!!
引数は編集するな!が正解?
以下、ソース。
指定したテキストファイルの文字列を置換して、別名保存(上書き)するVBScript
2022年06月18日
定期的な作業で、文字列を置換してコマンドを実行することが結構ある。
例えばログ取得。YYYYMMなど、年月の部分を書き換えて
SQLで実行したり、コマンドプロンプトで取得したり。
手作業で日付を変えるのがめんどくさいので、
置換するvbscriptを作ってみた。
前に学習した文字列で複数の引数を受け渡す仕様に。
視認性を上げるために、区切り文字は「■」に設定。
本当は出力ファイルの存在チェックをして、
ない場合はエラーにする処理をいれるべきなんだけど、今回は割愛。
※ 意図しないところが置換されないようキーワードで事前検索を
以下、ソース。テキストファイルの ダウンロード。
例えばログ取得。YYYYMMなど、年月の部分を書き換えて
SQLで実行したり、コマンドプロンプトで取得したり。
手作業で日付を変えるのがめんどくさいので、
置換するvbscriptを作ってみた。
前に学習した文字列で複数の引数を受け渡す仕様に。
視認性を上げるために、区切り文字は「■」に設定。
本当は出力ファイルの存在チェックをして、
ない場合はエラーにする処理をいれるべきなんだけど、今回は割愛。
※ 意図しないところが置換されないようキーワードで事前検索を
以下、ソース。テキストファイルの ダウンロード。
列集計マクロの改良
2022年06月14日
3つ前の記事で、列集計マクロについて書いた。
今回はそのマクロの改良について。
きっかけとなった改良内容は次の2つ。
1.セルの文字から数字部分を除去すること。
2.左から指定した文字数だけ集計すること。
セルの内容を辞書型配列に格納するときに
上記の1,2を実装した関数を通せばいいだけ。
新しいプロシージャとしてコピペでソースをかけば動くわけだけど、
ソースが二重管理になるのでDRY原則(Don't Repeat Yourself)に反する。
そのまま改良を始めると、ソースがごちゃごちゃになりそうだったので、
リファクタリングを行った。
元々のモジュール名とその挙動は変更せず、
機能追加したモジュールを別途作成し、メインの処理を共通化した。
当初、動作オプション1つずつに別々の引数にしていたけど、
スマートじゃないので、文字列で受け渡すことにした。
調べた限り、VBAでは配列を引数として渡すことができないようなので、
数値型の4引数をカンマ区切りの文字列として渡して
受け側でSplit関数で配列に変換。要素数を指定して取り出すという処理にした。
2次元集計については、出力結果に対して
合計計算とカラースケールの追加、行列の並べ替えをしていたので、
その処理も合わせて追加した。リファクタリングツール様様でした。
面白いことに、作っているときはこれが最善手と思っているけど、
1日経てば全く違う解決策がぱっと浮かぶもんなんだな。
そしてその解決策もそもそも必要なかったという結論になったんだけど
それはまた別の話。
というわけで、以下ソース。 ソーステキストはこちら。
今回はそのマクロの改良について。
きっかけとなった改良内容は次の2つ。
1.セルの文字から数字部分を除去すること。
2.左から指定した文字数だけ集計すること。
セルの内容を辞書型配列に格納するときに
上記の1,2を実装した関数を通せばいいだけ。
新しいプロシージャとしてコピペでソースをかけば動くわけだけど、
ソースが二重管理になるのでDRY原則(Don't Repeat Yourself)に反する。
そのまま改良を始めると、ソースがごちゃごちゃになりそうだったので、
リファクタリングを行った。
元々のモジュール名とその挙動は変更せず、
機能追加したモジュールを別途作成し、メインの処理を共通化した。
当初、動作オプション1つずつに別々の引数にしていたけど、
スマートじゃないので、文字列で受け渡すことにした。
調べた限り、VBAでは配列を引数として渡すことができないようなので、
数値型の4引数をカンマ区切りの文字列として渡して
受け側でSplit関数で配列に変換。要素数を指定して取り出すという処理にした。
2次元集計については、出力結果に対して
合計計算とカラースケールの追加、行列の並べ替えをしていたので、
その処理も合わせて追加した。リファクタリングツール様様でした。
面白いことに、作っているときはこれが最善手と思っているけど、
1日経てば全く違う解決策がぱっと浮かぶもんなんだな。
そしてその解決策もそもそも必要なかったという結論になったんだけど
それはまた別の話。
というわけで、以下ソース。 ソーステキストはこちら。