パーフェクトExcel VBAを写経していて楽しい関数を見つけたので、記録しておきます。
プログラミング入門者の壁
「パスを通す」って何?
プログラミングを始めるときに大抵つまづく環境構築。
Google先生に聞いてみると、大体「パスを通せばOKよ」的な説明がされている。
- 「パス」って?"ファイルの場所"とかのパス?
- それを「通す」ってどういうこと?何をすれば?
「解説してもらっても言葉の定義から調べることになって結局挫折…」みたいなことはよくあるけど、
要は、特定のソフトウェアで使うパスを、OS全体の変数(=環境変数)に
代入するように設定しようという意味らしい。
それで、この環境変数の状態を「VBAを使えばExcelからも見られる」というのを先ほど知った。
Excelから見るには?
VBAライブラリのInteractionモジュールに含まれていて、いわゆる「組み込み関数」のひとつ。
その名もEnviron関数
(エンバイロン関数)。
環境変数の値を取得して状態を確認することができる。
「確認」だけで、値の設定まではこれだけでは出来ないみたいだけど…(残念)
これを使って、環境変数の値を取得してみる。
環境変数を出力してみる
引き数の選択肢
今回は、下記の表からPATH
を使用する。
表8-27 主な環境変数 (p.299)
環境変数 説明 APPDATA
アプリケーションデータフォルダパス COMPUTERNAME
コンピュータ名 COMSPEC
コマンドプロンプトのパス HOMEDRIVE
ホームドライブ HOMEPATH
ユーザーのホームディレクトリのパス OS
オペレーティングシステム名 PATH
環境変数 PATH
に設定されているパスの一覧PATHTEXT
拡張子なしで実行できるファイルの一覧 PROGRAMFILES
プログラムファイル用の共通ディレクトリ PROMPT
コマンドプロンプトに表示する文字列指定 TEMP
アプリケーションのテンポラリーフォルダパス USERNAME
ユーザー名 WINDIR
システムディレクトリ
実行(イミディエイトウィンドウ)
イミディエイトウィンドウで下記を入力してEnterしてみる。
? Environ("PATH")
結果(イミディエイトウィンドウ)
こんな感じで出力された。
C:\Program Files\Microsoft Office\Root\Office16\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\iCLS\;C:\Program Files\Intel\Intel(R) Management Engine Components\iCLS\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files\Microsoft VS Code\bin;C:\Program Files\Google\Google Apps Sync\;C:\Program Files\Google\Google Apps Migration\;C:\Program Files\nodejs\;C:\Program Files\Git\cmd;C:\Users\<ユーザー名>\AppData\Local\Microsoft\WindowsApps;C:\Users\<ユーザー名>\AppData\Roaming\npm;;C:\Program Files\Microsoft Office\root\Client
1行で出るのね…読みづらい(^^;)
でも、よく見るとパス1点ごとに;
で区切られているみたい。
C:\Program Files\~~~;C:\Program Files (x86)\~~~;C:\Program Files\~~~;…
ならば、そのまま区切って一覧にしてみよう。
一覧で出してみる
実行
今度は標準モジュールなどで下記を実行してみる。
Sub MySub() Dim environmentVariables() As String environmentVariables = Split(Environ("PATH"), ";") Dim i As Long For i = 0 To UBound(environmentVariables) Debug.Print environmentVariables(i) Next i End Sub
結果(イミディエイトウィンドウ)
こんな感じで出ました(2020/03/22(日)現在)。
C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\iCLS\ C:\Program Files\Intel\Intel(R) Management Engine Components\iCLS\ C:\WINDOWS\system32 C:\WINDOWS C:\WINDOWS\System32\Wbem C:\WINDOWS\System32\WindowsPowerShell\v1.0\ C:\WINDOWS\System32\OpenSSH\ C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL C:\Program Files\Intel\Intel(R) Management Engine Components\DAL C:\Program Files\Intel\WiFi\bin\ C:\Program Files\Common Files\Intel\WirelessCommon\ C:\Program Files\Microsoft VS Code\bin C:\Program Files\Google\Google Apps Sync\ C:\Program Files\Google\Google Apps Migration\ C:\Program Files\nodejs\ C:\Program Files\Git\cmd C:\Users\<ユーザー名>\AppData\Local\Microsoft\WindowsApps C:\Users\<ユーザー名>\AppData\Roaming\npm C:\Program Files\Microsoft Office\root\Client
おぉー、思ったよりたくさん設定されている…
(こんな感じで一瞬でシュババッと色々出てくるのが好きなんですけど、共感してくれる人いるかな…)
まとめ
これをExcelに出力すれば、必要なパスが登録されているかチェックする、とかなら使えるかも。
「パスを通す」までをVBAでやるとしたら、ターミナルを呼び出さなきゃいけないみたい。
ちょっとめんどくさいけど、Environ関数
と同じInteractionモジュールのShell関数
で出来るようだ。
そもそも「環境構築ならターミナルとかで見なさいよ」と言われそうな気もするけど笑、
「Excelが使えるならこんな選択肢もあるんだなー」ってことで!