Windowsが認知しているシステムフォルダを取得するAPIです。「SYSTEM」フォルダは、このページの後半でも説明しているコンポーネント(*.dll)等がインストールされているフォルダで、コンポーネントの存在を確認したりします。
「TEMP」は一時作業ファイルの出力先です。存在が明確なので、受信ファイルの格納などに利用します。
なぜ、「API」なのか!?
マクロ上で「ある目的」を実現するのに「
API」なら実現できて、「
API」を利用しないと実現できない要件であれば利用するものと思っています。ですから、「
APIありき」ではありません。
Windowsの「
SYSTEM」や「
TEMP」フォルダ名の取得に関して言えば、現在では
APIは必要ありません。
ですがこのサイトを立ち上げた
2003年頃はまだ
Windows9x、NTの
PCも存続していた時代なので、
後述する「
FSO」が全ての
PCに搭載されているかも明確ではなかったため、当時は利用していました。
いずれは「
Microsoft Office」の
64ビットが主流になるのかも知れませんから「
Declare」の記述の対応が必要になってしまうのでしょう。
「
API」なしで利用できるものは「
API」を使わない方法で用いる方が賢明だと思います。
立ち上げると動作用の
5つのボタンがあります。
(画像をクリックすると、このページのサンプルがダウンロードできます)
それぞれは
Windowsの既定フォルダのフルパスフォルダ名をメッセージボックスに表示するだけの単純なものです。
以下がソースコードです。フォームのボタンなので標準モジュール1とだけになっています。
'***************************************************************************************************
' WindowsのSystem、Tempフォルダ名の取得
'
' 作成者:井上治 URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
' [参照設定]
' ・Microsoft Scripting Runtime
' ・Windows Script Host Object Model
'***************************************************************************************************
' 変更日付 Rev 変更履歴内容---------------------------------------------------------------------->
' 03/08/27(1.0.0)新規作成
' 17/09/09(2.0.0)記述整理
' 19/10/20(2.0.0)64ビットWindows対応
'***************************************************************************************************
Option Explicit
'===================================================================================================
#If VBA7 Then
' ■SYSTEMフォルダ名取得API
Private Declare PtrSafe Function GetSystemDirectory Lib "KERNEL32.dll" _
Alias "GetSystemDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
' ■TEMPフォルダ名取得API
Private Declare PtrSafe Function GetTempPath Lib "KERNEL32.dll" _
Alias "GetTempPathA" _
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
#Else
' ■SYSTEMフォルダ名取得API
Private Declare Function GetSystemDirectory Lib "KERNEL32.dll" _
Alias "GetSystemDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
' ■TEMPフォルダ名取得API
Private Declare Function GetTempPath Lib "KERNEL32.dll" _
Alias "GetTempPathA" _
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
#End If
'***************************************************************************************************
' ■■■ シートからの呼び出しプロシージャ ■■■
'***************************************************************************************************
'* 処理名 :Button1_Click
'* 機能 :WindowsのSystemフォルダ名の取得(API)
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2003年08月27日
'* 作成者 :井上 治
'* 更新日 :2017年09月09日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Sub Button1_Click()
'-----------------------------------------------------------------------------------------------
' SYSTEMフォルダ名の表示
MsgBox FP_GetSystemFolderByApi
End Sub
'***************************************************************************************************
'* 処理名 :Button2_Click
'* 機能 :現在ユーザーのTEMPフォルダ名の取得(API)
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2003年08月27日
'* 作成者 :井上 治
'* 更新日 :2017年09月09日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Sub Button2_Click()
'-----------------------------------------------------------------------------------------------
' TEMPフォルダ名の表示
MsgBox FP_GetTempFolderByApi
End Sub
'***************************************************************************************************
'* 処理名 :Button3_Click
'* 機能 :WindowsのSystemフォルダ名の取得(FSO)
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2003年08月27日
'* 作成者 :井上 治
'* 更新日 :2017年09月09日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Sub Button3_Click()
'-----------------------------------------------------------------------------------------------
' SYSTEMフォルダ名の表示
MsgBox FP_GetSystemFolderByFso
End Sub
'***************************************************************************************************
'* 処理名 :Button4_Click
'* 機能 :現在ユーザーのTEMPフォルダ名の取得(FSO)
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2003年08月27日
'* 作成者 :井上 治
'* 更新日 :2017年09月09日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Sub Button4_Click()
'-----------------------------------------------------------------------------------------------
' TEMPフォルダ名の表示
MsgBox FP_GetTempFolderByFso
End Sub
'***************************************************************************************************
'* 処理名 :Button5_Click
'* 機能 :現在ユーザーのデスクトップフォルダ名の取得(WSH)
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2003年08月27日
'* 作成者 :井上 治
'* 更新日 :2017年09月09日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Sub Button5_Click()
'-----------------------------------------------------------------------------------------------
' デスクトップフォルダ名の表示
MsgBox FP_GetDesktopFolderByWsh
End Sub
'***************************************************************************************************
' ■■■ 共通サブ処理 ■■■
'***************************************************************************************************
'* 処理名 :FP_GetSystemFolderByApi
'* 機能 :SYSTEMフォルダ名取得(API)
'---------------------------------------------------------------------------------------------------
'* 返り値 :SYSTEMフォルダ名(String)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2017年09月09日
'* 作成者 :井上 治
'* 更新日 :2017年09月09日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:SYSTEMフォルダ名取得API宣言必須
'***************************************************************************************************
Private Function FP_GetSystemFolderByApi() As String
'-----------------------------------------------------------------------------------------------
Dim strBuffer As String ' API用作業バッファ
Dim lngLngs As Long ' 〃文字列長
' Bufferを確保
strBuffer = String(256, Chr(0))
lngLngs = Len(strBuffer)
' SYSTEMフォルダ名取得(API呼び出し) ※動作失敗は無視しています
Call GetSystemDirectory(strBuffer, lngLngs)
' Null文字の手前までを有効として返す
FP_GetSystemFolderByApi = Left$(strBuffer, InStr(1, strBuffer, Chr(0)) - 1)
End Function
'***************************************************************************************************
'* 処理名 :FP_GetTempFolderByApi
'* 機能 :TEMPフォルダ名取得(API)
'---------------------------------------------------------------------------------------------------
'* 返り値 :TEMPフォルダ名(String)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2017年09月09日
'* 作成者 :井上 治
'* 更新日 :2017年09月09日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:TEMPフォルダ名取得API宣言必須
'***************************************************************************************************
Private Function FP_GetTempFolderByApi() As String
'-----------------------------------------------------------------------------------------------
Dim strBuffer As String ' API用作業バッファ
Dim lngLngs As Long ' 〃文字列長
' Bufferを確保
strBuffer = String(256, Chr(0))
lngLngs = Len(strBuffer)
' TEMPフォルダ名取得(API呼び出し) ※動作失敗は無視しています
Call GetTempPath(lngLngs, strBuffer)
' Null文字の手前までを有効として表示
FP_GetTempFolderByApi = Left$(strBuffer, InStr(1, strBuffer, Chr(0)) - 1)
End Function
'***************************************************************************************************
'* 処理名 :FP_GetSystemFolderByFso
'* 機能 :SYSTEMフォルダ名取得(FSO)
'---------------------------------------------------------------------------------------------------
'* 返り値 :SYSTEMフォルダ名(String)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2017年09月09日
'* 作成者 :井上 治
'* 更新日 :2017年09月09日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:Microsoft Scripting Runtime要(参照設定)
'***************************************************************************************************
Private Function FP_GetSystemFolderByFso() As String
'-----------------------------------------------------------------------------------------------
With New FileSystemObject
FP_GetSystemFolderByFso = .GetAbsolutePathName(.GetSpecialFolder(SystemFolder))
End With
End Function
'***************************************************************************************************
'* 処理名 :FP_GetTempFolderByFso
'* 機能 :TEMPフォルダ名取得(FSO)
'---------------------------------------------------------------------------------------------------
'* 返り値 :TEMPフォルダ名(String)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2017年09月09日
'* 作成者 :井上 治
'* 更新日 :2017年09月09日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:Microsoft Scripting Runtime要(参照設定)
'***************************************************************************************************
Private Function FP_GetTempFolderByFso() As String
'-----------------------------------------------------------------------------------------------
With New FileSystemObject
FP_GetTempFolderByFso = .GetAbsolutePathName(.GetSpecialFolder(TemporaryFolder))
End With
End Function
'***************************************************************************************************
'* 処理名 :FP_GetDesktopFolderByWsh
'* 機能 :デスクトップフォルダ名取得(WSH)
'---------------------------------------------------------------------------------------------------
'* 返り値 :デスクトップフォルダ名(String)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2017年09月09日
'* 作成者 :井上 治
'* 更新日 :2017年09月09日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:Windows Script Host Object Model要(参照設定)
'***************************************************************************************************
Private Function FP_GetDesktopFolderByWsh() As String
'-----------------------------------------------------------------------------------------------
With New WshShell
FP_GetDesktopFolderByWsh = .SpecialFolders("DeskTop")
End With
End Function
'------------------------------------------<< End of Source >>--------------------------------------
ボタンからの起動プロシージャは画面の並び順の通りで上から「
Button1_Click」「
Button2_Click」・・・「
Button5_Click」となっており、
どれもメッセージボックス表示のみの記述でそれぞれの関数の戻り値を表示させているのみです。
対応する関数は「共通サブ処理」のコメントから下に配置させており、ボタンの配置順に合わせた順序になっています。
上の2つ「
FP_GetSystemFolderByApi」「
FP_GetTempFolderByApi」が本来の「
API」の記述です。
次の2つ「
FP_GetSystemFolderByFso」「
FP_GetTempFolderByFso」は
APIを利用せずに同じ結果が得られるもので、
この記述を利用する場合は「
Microsoft Scripting Runtime」の参照設定が必要です。
「
TEMPフォルダ」は処理過程での一時的なファイル書き出しに利用することがある場合に利用するものですが、
「
SYSTEMフォルダ」は
DLLがインストールされているかの確認を行なうために利用していたものだったのです。
「
SYSTEMフォルダ」への更新は現在の
Windowsではセキュリティ上で規制されていますが、ファイルの存在確認などは問題なく行なえます。
但し、
64ビット版
Windowsでは、
Excelが
32ビット版であっても「
C:\Windows\System32」が返るため、この目的では利用できません。
APIではありませんが、システム関連のフォルダを返す関数として最後に「
FP_GetDesktopFolderByWsh」を紹介しています。
ここでは引数を「
DeskTop」としており、デスクトップフォルダを返しますが、この引数を以下のように変更して利用することができます。
AllUsersDesktop |
Fonts |
SendTo |
AllUsersStartMenu |
MyDocuments |
StartMenu |
AllUsersPrograms |
NetHood |
Startup |
AllUsersStartup |
PrintHood |
Templates |
Desktop |
Programs |
|
Favorites |
Recent |
|