マイドキュメントにフォルダがなければ作るマクロ
2021年10月07日
10月1日に人事異動があり、仕事の内容がガラッと変わった。
日常的にマクロで作られたツールを触ることになったw
仕事を覚えたらソースコードを読み解いてみよう。
パソコンが変わったので、さっそくマクロの移植っと・・・。動かない。
マクロの実行記録をログファイルに吐き出す処理をしているけど、
ログファイルを置くフォルダがないって。
というわけで今回は、フルパスで指定したフォルダがなければ、
上の階層から順にフォルダを生成するマクロを作ってみた。
まずは、マイドキュメントフォルダ名の取得方法。
Windowsキー+Rでウィンドウ開いて、「.」を打つと
ユーザーフォルダを開けるんだって!
https://forest.watch.impress.co.jp/docs/serial/yajiuma/1306709.html
でもマクロではこれを使えないようで、
CreateObject("Wscript.Shell")を使って取得する。
With CreateObject("WScript.Shell")
pPath = .SpecialFolders("MyDocuments") 'MyDocuments, DeskTop,
End With
https://excel-ubara.com/excelvba4/EXCEL293.html
これでフォルダのフルパスが指定できるので、
¥でスプリットして配列に変換。
配列の上から順に使ってフォルダパスを作り
そのフォルダがなければフォルダを作る処理の繰り返し。
汎用的に使うサブモジュールには★をつけてみた。
目立つ名前にしておけば、ソースを提供するときに
サブモジュールの渡し忘れを防げるかな。。。
以下、ソース。
日常的にマクロで作られたツールを触ることになったw
仕事を覚えたらソースコードを読み解いてみよう。
パソコンが変わったので、さっそくマクロの移植っと・・・。動かない。
マクロの実行記録をログファイルに吐き出す処理をしているけど、
ログファイルを置くフォルダがないって。
というわけで今回は、フルパスで指定したフォルダがなければ、
上の階層から順にフォルダを生成するマクロを作ってみた。
まずは、マイドキュメントフォルダ名の取得方法。
Windowsキー+Rでウィンドウ開いて、「.」を打つと
ユーザーフォルダを開けるんだって!
https://forest.watch.impress.co.jp/docs/serial/yajiuma/1306709.html
でもマクロではこれを使えないようで、
CreateObject("Wscript.Shell")を使って取得する。
With CreateObject("WScript.Shell")
pPath = .SpecialFolders("MyDocuments") 'MyDocuments, DeskTop,
End With
https://excel-ubara.com/excelvba4/EXCEL293.html
これでフォルダのフルパスが指定できるので、
¥でスプリットして配列に変換。
配列の上から順に使ってフォルダパスを作り
そのフォルダがなければフォルダを作る処理の繰り返し。
汎用的に使うサブモジュールには★をつけてみた。
目立つ名前にしておけば、ソースを提供するときに
サブモジュールの渡し忘れを防げるかな。。。
以下、ソース。
PR
シェイプ一覧を出力するマクロ
2021年10月06日
前回の構成図自動結線マクロ(その5)で書いた通り
結線図をもとに結線表を作るには、正しく結線図を描いていて
さらにシェイプの名称も正しく設定していないといけない。
でも、結線図からそれを判断するのは大変なので、
デバッグ用にシェイプ一覧を取得するマクロを作った。
こっちを掘り下げた方が色々使い道がありそうなので、
ひとまずできたところまででアップすることにした。
マクロの構成は簡単。
すべてのオートシェイプをループで選択して
名称やらテキストやらをセルに出力するだけ。
ついでに文字の色や線の色、塗りつぶしの色をRGBで取得したり
シェイプの枠線を出力先のセルにそれっぽく出したり。
変更を加える作業については、マクロで実行するとUnDoが使えないので、
マクロで様々な条件のシェイプを選択できると便利かなー。(将来対応)
●まずは全シェイプをループさせるところ。
For Each Shp In ActiveSheet.Shapes
'Shp(Shape型変数)に対する処理
Next Shp
ちなみにActiveSheet.Shapesはドロップダウンリストも対象になるようで、
すべてのシェイプを消すような処理をすると、ドロップダウンリストも消えるとか。
https://excel-ubara.com/excelvba4/EXCEL241.html
For Eachの前にActiveSheet.Shapes.SelectAllで全選択して、
ActiveSheet.ShapesをSelection.shapeRangeにすれば大丈夫っぽい。
●辞書変数ポインタを使ったセル格納
出力列の入れ替えをできるように、辞書型の変数を定義して
列名をキーに、列番号を辞書登録してみた。
辞書登録する部分の順番を入れ替えれば出力列が入れ替わる。
セルに出力する部分は一旦配列に格納したほうがいいんだけど、
もうめんどい。
●枠線の設定
今回一番苦労したのがここ。
オートシェイプとセルで枠線の仕様が違う。
セルは枠線の種類と太さの組み合わせが決まっていて
許容されない組み合わせを設定すると、先に設定した値が自動的修正されてしまう。
Function LDS2BL(LDS As Long)では、オートシェイプの枠線の線種をセルの枠線の線種へ
プロパティ値を変換する関数。
ただ、セルの線種は線の太さとの組み合わせで定義されている部分があるので、
出力値を2桁にして無理やり対応した。
●シート名について
個人利用のため、Worksheets("接続図")のシェイプを
Worksheets("シェイプリスト")に出力する仕様にした。
汎用性を持たせるなら、
選択シートの内容を追加したシートに出力するかな。
●出力イメージ
イメージがつかめるように、出力結果シートに接続図をコピペ。
当初をRGBの値のセルを色に合わせて制御したけど、
テキストを出力したセルを制御する方針に変更。
そしたらRGBの値いらないか。。。
すごいざっくりとした説明だけど、以下ソース。
結線図をもとに結線表を作るには、正しく結線図を描いていて
さらにシェイプの名称も正しく設定していないといけない。
でも、結線図からそれを判断するのは大変なので、
デバッグ用にシェイプ一覧を取得するマクロを作った。
こっちを掘り下げた方が色々使い道がありそうなので、
ひとまずできたところまででアップすることにした。
マクロの構成は簡単。
すべてのオートシェイプをループで選択して
名称やらテキストやらをセルに出力するだけ。
ついでに文字の色や線の色、塗りつぶしの色をRGBで取得したり
シェイプの枠線を出力先のセルにそれっぽく出したり。
変更を加える作業については、マクロで実行するとUnDoが使えないので、
マクロで様々な条件のシェイプを選択できると便利かなー。(将来対応)
●まずは全シェイプをループさせるところ。
For Each Shp In ActiveSheet.Shapes
'Shp(Shape型変数)に対する処理
Next Shp
ちなみにActiveSheet.Shapesはドロップダウンリストも対象になるようで、
すべてのシェイプを消すような処理をすると、ドロップダウンリストも消えるとか。
https://excel-ubara.com/excelvba4/EXCEL241.html
For Eachの前にActiveSheet.Shapes.SelectAllで全選択して、
ActiveSheet.ShapesをSelection.shapeRangeにすれば大丈夫っぽい。
●辞書変数ポインタを使ったセル格納
出力列の入れ替えをできるように、辞書型の変数を定義して
列名をキーに、列番号を辞書登録してみた。
辞書登録する部分の順番を入れ替えれば出力列が入れ替わる。
セルに出力する部分は一旦配列に格納したほうがいいんだけど、
もうめんどい。
●枠線の設定
今回一番苦労したのがここ。
オートシェイプとセルで枠線の仕様が違う。
セルは枠線の種類と太さの組み合わせが決まっていて
許容されない組み合わせを設定すると、先に設定した値が自動的修正されてしまう。
Function LDS2BL(LDS As Long)では、オートシェイプの枠線の線種をセルの枠線の線種へ
プロパティ値を変換する関数。
ただ、セルの線種は線の太さとの組み合わせで定義されている部分があるので、
出力値を2桁にして無理やり対応した。
●シート名について
個人利用のため、Worksheets("接続図")のシェイプを
Worksheets("シェイプリスト")に出力する仕様にした。
汎用性を持たせるなら、
選択シートの内容を追加したシートに出力するかな。
●出力イメージ
イメージがつかめるように、出力結果シートに接続図をコピペ。
当初をRGBの値のセルを色に合わせて制御したけど、
テキストを出力したセルを制御する方針に変更。
そしたらRGBの値いらないか。。。
すごいざっくりとした説明だけど、以下ソース。
構成図自動結線マクロ(その5)
2021年10月06日
今回もオートシェープの自動結線マクロの話。
実際に使ってみたらいろいろと問題発生。
1.1つ目に選択したシェイプから放射状に結線する仕様だけど、
物理構成図はLANポートなんだから、1つのポートに線1本しか繋がらないじゃん!
→前半に選択したシェイプから後半に選択したシェイプへそれぞれ線を引く仕様に変更。
2.ユーザーフォームは作らない想定だったけど、
図が大きくなると用意したボタンが遠いし、
オブジェクト選択モードでボタンをクリックしてもマクロが発動しない。
→仕方なくユーザーフォームを作成。
ただ、ボタンを並べるだけのフォームなら工数はそれほど時間はかからないことがわかった。
一旦作っちゃうと、あれこれ凝りだしてコリコリのフォームが出来上がる。。。
ちゃんと設計していないから、上部と下部で用途違うし。
上段のコネクタ作成については、
これまでモジュールで分けていた部分をラジオボタンの値判定で振り分ける処理に。
TextControl部分がこだわった個所。
ポートに通番やよく使う番号を振ったり、固定テキストを入力できるようにした。
また、ウィンドウを閉じたときも入力した文字を保持するように
ユーザーフォームをアンロードせずに隠す仕様へ。
Exitボタン押下時の処理をUnload Me から Me.Hide へ変更。
また、ExitボタンのCancelプロパティをTrueに設定すると、
ExitボタンがESCキーに割り当てられる。(ESCキーで閉じれる)
フォームの下段は、オートシェープの名前制御部分。
最初は名前を重複させたらエラーになると思っていたけど、
順序情報(背面から表面に向かって通番)で管理しているっぽい。
シェイプの名前をフォームから入力または表示されているテキストに変更する。
MakeConnectionListは、
マクロで作成したコネクタ(特別な名前を設定)に対して、
両端のシェイプ名をリスト化するマクロ。
さあ、これで完成と思いきや、そうは問屋が卸さない。
実際に図を描くときは、マクロを使う場合とコネクタをコピペする場合があるし、
シェイプを正しく設定できていなかったり、コネクタが未接続だったりする。
じゃあ、シェイプの一覧を表示するマクロ。
いや、表示するなら名前やテキストを置換したいし、
一括で線の幅とか塗りつぶしとか変更したい。
夢膨らみまくりで発散。
次回へ続く。以下、ソース。
実際に使ってみたらいろいろと問題発生。
1.1つ目に選択したシェイプから放射状に結線する仕様だけど、
物理構成図はLANポートなんだから、1つのポートに線1本しか繋がらないじゃん!
→前半に選択したシェイプから後半に選択したシェイプへそれぞれ線を引く仕様に変更。
2.ユーザーフォームは作らない想定だったけど、
図が大きくなると用意したボタンが遠いし、
オブジェクト選択モードでボタンをクリックしてもマクロが発動しない。
→仕方なくユーザーフォームを作成。
ただ、ボタンを並べるだけのフォームなら工数はそれほど時間はかからないことがわかった。
一旦作っちゃうと、あれこれ凝りだしてコリコリのフォームが出来上がる。。。
ちゃんと設計していないから、上部と下部で用途違うし。
上段のコネクタ作成については、
これまでモジュールで分けていた部分をラジオボタンの値判定で振り分ける処理に。
TextControl部分がこだわった個所。
ポートに通番やよく使う番号を振ったり、固定テキストを入力できるようにした。
また、ウィンドウを閉じたときも入力した文字を保持するように
ユーザーフォームをアンロードせずに隠す仕様へ。
Exitボタン押下時の処理をUnload Me から Me.Hide へ変更。
また、ExitボタンのCancelプロパティをTrueに設定すると、
ExitボタンがESCキーに割り当てられる。(ESCキーで閉じれる)
フォームの下段は、オートシェープの名前制御部分。
最初は名前を重複させたらエラーになると思っていたけど、
順序情報(背面から表面に向かって通番)で管理しているっぽい。
シェイプの名前をフォームから入力または表示されているテキストに変更する。
MakeConnectionListは、
マクロで作成したコネクタ(特別な名前を設定)に対して、
両端のシェイプ名をリスト化するマクロ。
さあ、これで完成と思いきや、そうは問屋が卸さない。
実際に図を描くときは、マクロを使う場合とコネクタをコピペする場合があるし、
シェイプを正しく設定できていなかったり、コネクタが未接続だったりする。
じゃあ、シェイプの一覧を表示するマクロ。
いや、表示するなら名前やテキストを置換したいし、
一括で線の幅とか塗りつぶしとか変更したい。
夢膨らみまくりで発散。
次回へ続く。以下、ソース。
VBAプロパティのオプション値について
2021年09月28日
前回投稿のオートシェイプ について書きたいところだけど、ソースコードの修正が終わらず。
今日は、その作業中に気づいたプロパティオプション値の確認方法について。
今日は、その作業中に気づいたプロパティオプション値の確認方法について。
構成図自動結線マクロ(その4)一括削除と1つ削除
2021年09月21日
今回もオートシェープの自動結線マクロの話。
挿入したコネクタがイメージと違ったなんてことよくある。
一括で挿入したものを1つずつ消すのは辛い。
手動操作ならUnDo(Ctrl+z)が効くが、マクロだと戻せないので
削除機能を実装してみた。
現在選択中のオブジェクトがいくつあるから・・・なんで複数なことをやろうとしたけど、
名称に設定した通番の最大値をもつオブジェクトを調べて消すだけじゃん。
通番管理でコネクタの挿入処理は複雑になったけど、しゃーない。
名称は、 "myCn_" で始まるように統一したので、"myCn_"を含むオブジェクトを全削除する機能も実装。
ちなみにオートシェープの一覧はAlt+F10で確認ができる。
以下、ソース。
挿入したコネクタがイメージと違ったなんてことよくある。
一括で挿入したものを1つずつ消すのは辛い。
手動操作ならUnDo(Ctrl+z)が効くが、マクロだと戻せないので
削除機能を実装してみた。
現在選択中のオブジェクトがいくつあるから・・・なんで複数なことをやろうとしたけど、
名称に設定した通番の最大値をもつオブジェクトを調べて消すだけじゃん。
通番管理でコネクタの挿入処理は複雑になったけど、しゃーない。
名称は、 "myCn_" で始まるように統一したので、"myCn_"を含むオブジェクトを全削除する機能も実装。
ちなみにオートシェープの一覧はAlt+F10で確認ができる。
以下、ソース。