[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.114 VBA で WScript.ShellのSpecialFoldersプロパティを使ってみた

VBA で WScript.ShellのSpecialFoldersプロパティを使ってみた

メルマガ発行内容

<VBA で WScript.ShellのSpecialFoldersプロパティを使ってみた>

どうも、三流プログラマーのKen3です。 今回は、 CreateObject("WScript.Shell") と、スクリプトのシェルを作成して、 SpecialFoldersプロパティを使って、 デスクトップの位置を取得してみたいと思います

/* * 1.今回のキッカケ */

フォルダーの選択処理を前に作成しました。 詳細は、フォルダーを選択してファイルリストを作成する http://www.ken3.org/vba/vba-folder.html を見てください。 'フォルダー選択ダイアログを表示して、リターン値で選択場所を返す 'キャンセルの時は文字列キャンセル、 'デスクトップの時は文字列を返す
Function getFOLDER() As String

    Dim objShell  As Object 'Shell
    Dim objFolder As Object 'Shell32.Folder
    Const strTitle = "フォルダを選択してください。"

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    'フォルダー参照に設定
    Const lngRef = &H1
    'ルートフォルダーをデスクトップに設定
    '5でMy Documents、6でFavoritesなど
    Const fldRoot = &H0
    
    Set objFolder = _
            objShell.BrowseForFolder(0, _
                strTitle, lngRef, fldRoot)
    
    'フォルダー名を取出し、リターン値をセット
    If objFolder Is Nothing Then 'キャンセルチェック
        getFOLDER = "キャンセル"  'リターン値にキャンセルをセット
    Else
        If objFolder.ParentFolder Is Nothing Then
            getFOLDER = "デスクトップ"
        Else
            getFOLDER = objFolder.Items.Item.Path 'パスをセットする
        End If
    End If

    Set objFolder = Nothing
    Set objShell = Nothing

End Function
と、一番上のデスクトップを選択されたら、 文字をそのまま返してました。 今回は、ログインしているユーザー、 デスクトップの場所を探す方法を探ってみます。

/* * 2.いつもの調査方法・・じゃなくって、たまたま見つけました */

いつもなら、ここで、XXXを条件に検索しました。 で、英語読みながら見つけましたと武勇伝を語るんだけど、 >今回は、ログインしているユーザー、 >デスクトップの場所を探す方法を探ってみます。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ スミマセン、ウソついてました(笑) 探ったんじゃなくて、 たまたま、隣のASP系のメルマガで、 VBScriptの関数の調査してたら目に止まりました(オイオイ、偶然かよ・・) ここ、 http://www.microsoft.com/japan/msdn/library/ja/script56/html/wsprospecialfolders.asp Windows Script Host の説明ページなのですが(日本語なので安心) SpecialFolders プロパティなんて説明があります。 ^^^^^^^^^^^^^^ 説明を見ると、 object.SpecialFolders(objWshSpecialFolders) 引数 object WshShell オブジェクトです。 objWshSpecialFolders 取得する特定フォルダの名前です。 解説 WshSpecialFolders オブジェクトはコレクションです。このオブジェクトには、 デスクトップのフォルダ、[スタート] メニューのフォルダ、個人用ドキュメント のフォルダなど、Windows の特定フォルダ セット全体が格納されます。目的の特定 フォルダを取得するには、フォルダ名をコレクション内のインデックスとして使用 します。要求したフォルダ (strFolderName) を使用できない場合は、NULL が返さ れます。たとえば、Windows 95 では、AllUsersDesktop フォルダがないため、 strFolderName が AllUsersDesktop と等しい場合に NULL が返されます。 使用できる特定フォルダは次のとおりです。 AllUsersDesktop AllUsersStartMenu AllUsersPrograms AllUsersStartup Desktop Favorites Fonts MyDocuments NetHood PrintHood Programs Recent SendTo StartMenu Startup Templates なんて、説明を、偶然発見しました。 いろいろな特殊フォルダーの位置を知ることができそうです。 -- 余談 -- 自分で調べごとを行うと? 頭のスミにデスクトップの場所の求め方知りたい・・とあったのか、 本来の調べごとをほったらかして、テストしてみました。 人に聞くばかりじゃなく、自分で調べると、 ~~~~~~~~~~~~~~~~~~~~~~ 調査の過程で違う知識が吸収できたりします。 (たまたまの出来事を偉そうに書いてますが、  そんな時・偶然やラッキーもあるんだぁ程度に思ってください) 本来の目的から脱線して、いろいろと違う場所を見るのも、ありですよキット。 えっ、脱線して、ネットでH系ページを会社から見るのも?ありかって? う〜ん・・・どうなんでしょう。 脱線するなら、 http://www.ken3.org/etc/okozukai.html の、ネットで小金稼ぎ、ヨロシクデス。 せっかく途中までエエ話だったのに、広告で閉めカヨ。。。 まぁ、三流君らしいけど。

/* * 3.簡単なテストプログラム */

話を戻して、簡単なテストプログラムを作成してみます。
Sub test()

    Dim objWShell As Object 'WScript.Shell
    Dim strDesktopPath  As String 'デスクトップの場所

    'Windows Script Hostのオブジェクトを作成する
    Set objWShell = CreateObject("WScript.Shell")

    'スペシャルフォルダ(特殊フォルダ)の場所を返す
    strDesktopPath = objWShell.SpecialFolders("Desktop")

    '確認メッセージの表示
    MsgBox "DesktopのPathは[" & strDesktopPath & "]です"

End Sub
ポイントは、 ~~~~~~~~~~~~ Set objWShell = CreateObject("WScript.Shell") で、 Windows Script Hostのオブジェクトを作成してます。 これは、.SpecialFoldersプロパティのオブジェクトだからです。 あとは、普通に"Desktop"とデスクトップを指定して、 'スペシャルフォルダ(特殊フォルダ)の場所を返す strDesktopPath = objWShell.SpecialFolders("Desktop") と、 .SpecialFoldersプロパティの値をもらってます。 わかってしまえば、簡単でした。 ※APIとか使うのかと思って、デスクトップの取得方法、  棚上げにしてたけど、こんなに簡単なら探せばよかった・・・

/* * 4.おまけ */

関数に組み込んでみます。 'フォルダー選択ダイアログを表示して、リターン値で選択場所を返す 'キャンセルの時は文字列""(空文字列)を返す
Function getFOLDER() As String

    Dim objShell  As Object 'Shell
    Dim objFolder As Object 'Shell32.Folder
    Const strTitle = "フォルダを選択してください。"

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    'フォルダー参照に設定
    Const lngRef = &H1
    'ルートフォルダーをデスクトップに設定
    '5でMy Documents、6でFavoritesなど
    Const fldRoot = &H0

    Set objFolder = _
            objShell.BrowseForFolder(0, _
                strTitle, lngRef, fldRoot)
    
    'フォルダー名を取出し、リターン値をセット
    If objFolder Is Nothing Then 'キャンセルチェック
        getFOLDER = ""  'リターン値に""空文字列をセット
    Else
        If objFolder.ParentFolder Is Nothing Then  '下位を未選択デスクトップ?
            Dim objWShell As Object 'WScript.Shell
            'シェルのオブジェクトを作成する
            Set objWShell = CreateObject("WScript.Shell")
            'デスクトップの場所を返す
            getFOLDER = objWShell.SpecialFolders("Desktop")
            'オブジェクトの開放
            Set objWShell = Nothing
        Else
            getFOLDER = objFolder.Items.Item.Path 'パスをセットする
        End If
    End If

    Set objFolder = Nothing
    Set objShell = Nothing

End Function
Sub 選択テスト()

    Dim strWORK As String
    
    strWORK = getFOLDER()  'フォルダーの選択関数を呼ぶ
    
    If strWORK = "" Then   '空文字””でキャンセルのチェック
        MsgBox "キャンセル押されたよ"
    Else
        MsgBox "選択されたのは" & strWORK & "です"
    End If

End Sub
そんなに変わってないけど、 フォルダーの選択関数としては、少しは形になったかなぁ。

/* * 5.終わりの挨拶 */

今回は、たまたま、 別の調べごとでデスクトップの位置を返す方法を見かけたので WShell.SpecialFolders("Desktop") を使用してみました。 みなさんも、たまには、脱線した調べごとをしてみては? 新雪を行くか、それとも、人の跡をなぞるか ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 使用したこと無い、ツール、言語、、、 社内でダレもやったこと無い作業をやる時、 ワクワクしますよね? えっ、やりたくない、、、? スキーで新雪を行くか、それとも、人の跡をなぞるか みたいなものですね。。。 *スキー・スノボやらない運動音痴に言われたくないって?  あっ、ソリならやったことアルよ、、、 道に迷って、道を覚えるみたいで、 失敗しながら自分の道を見つけていくのが、 いいのでしょう でも、仕事でやるとなると、なんか、、、臆病になって・・・・ 回り道でも、目的地につけば、よしと思って、、、 何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]